Void как тип возврата
Я тестировал типы возвращаемых данных с помощью PHP 7.
Я создал простой скрипт для тестирования возвращаемых типов PHP 7:
<?php
Class Obj {
public function __construct(){
}
public function test(): string { //a string needs to be returned
return "ok";
}
}
function foo(): Obj { //instance of Obj needs to be returned
return new Obj();
}
$o = foo();
echo $o->test(); // output: ok
Теперь в других языках программирования, когда вы указываете тип возвращаемого значения void
, это означает, что вы ничего не можете вернуть или получите ошибку. Поэтому я написал этот сценарий:
<?php
function foo(): void {
}
foo();
Теперь в приведенном выше сценарии ожидаемый результат-ничто. Вместо этого он дает мне фатальную ошибку:
Фатальная ошибка: возвращаемое значение foo () должно быть экземпляром void, none returned в строке 2
Мой вопрос (я не смог найти его), в PHP 7 будет ли похожий тип void
?
5 ответов:
Правка:
Новый отдельный RFC для типа void return был опубликован, прошел голосование и был реализован в PHP 7.1.
Теперь в PHP есть возвращаемый типvoid
. :)Оригинальное Сообщение:
Взято из wiki.php.net :
Таким образом, в настоящее время нет способа объявить, что вы ничего не возвращаете.Будущая Работа
Идеи для будущей работы, которые выходят за рамки данного RFC, включают:
- разрешить функциям объявлять, что они вообще ничего не возвращают (void в Java и C)
Я не знаю, что лучше в вашей ситуации, но я бы, вероятно, просто не объявлял тип возврата на данный момент.Чтобы ответить на ваш вопрос, будет ли
void
возвращаемый тип в PHP 7:
Пока нет гарантии , но я думаю, что очень вероятно, чтоvoid
или синоним будет реализован каким-то образом.
Автор возвращаемых типов RFC здесь. В PHP 7.0 не будет
void
возвращаемых типов, так как RFC не добавлял его, как и любой другой RFC, ориентированный на PHP 7.0.Тип
void
может существовать в серии PHP 7, Если мы решим, что добавление новых ключевых/зарезервированных слов подходит для небольших релизов, даже если они будут нарушать код. Это несколько неопределенно, но это было сделано в PHP 5.4 с ключевым словомcallable
.
Лично я не думаю, что нам нужно
void
; мы уже естьnull
. из инструкции :Специальное нулевое значение представляет переменную без значения. NULL-это единственное возможное значение типа null.
В PHP функция, которая ничего не возвращает, неявно возвращает
null
. Это означает, что вы никогда не сможете на самом деле вернуть ничего*. Переход по маршрутуnull
означает, что с тех пор не существует разрывов обратной совместимости.null
не будет допустимым именем класса / интерфейса / признака, начиная с PHP 7.0 и не добавляет никаких новых ключевых или зарезервированных слов.*люди, знакомые с движком Zend, поймут, что вы ничего не можете вернуть, но если вы ничего не вернули, переменная, которую вы назначаете, будет присвоена null, что делает их логически эквивалентными.
В PHP 7.1 будет псевдотип
void
. Он определяется вVoid возвращаемого типа RFC .Лично мне грустно об этом, потому что автор RFC ранее "ушел", и я взял в руки RFC. Затем следующее, что я знаю, это предложение и Обсуждение, и она не будет ждать, пока я предложу типы союзов, которые были бы аналогом void, как отмечалось выше. Ну что ж.
Возвращаемый тип
void
был принят для php 7.1. Так будет и в будущем.Несколько примеров того, как это будет работать:
function should_return_nothing(): void { return 1; // Fatal error: A void function must not return a value } function returns_null(): void { return null; // Fatal error: A void function must not return a value } function lacks_return(): void { // valid } function returns_nothing(): void { return; // valid }
Смотрите RFC от Andrea Faulds для получения дополнительной информации!
В php нет эквивалентного типа для void, return NULL; may соответствует вашим требованиям, так как он не имеет никакого типа, как 0 или любое другое значение. Примечание: фактическая пустота означает отсутствие возврата.
@BeNice я понимаю вашу точку зрения, во всяком случае, я суммирую рассмотрение от Леви Моррисон как практический вопрос устойчивости: вводя
void
в качестве возможного возвращаемого типа infact, мы нарушаем предположение, что единственным возможным типомnull
являетсяnull
.Таким образом,
void
должен быть возвращен для проверки типаnull
, изменяя ограничения архитектуры по дизайну и вызывая беспорядок в обратной совместимости.// your choice implies this comparison should be true: gettype(null) === void;
Я думаю, кто использовал
null
не часто в своем коде будет иметь реализацию типаvoid
.