Я тестировал типы возврата с 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, ни одно не возвращается в строке 2
У меня вопрос (я не смог его найти), в PHP 7 будет подобное void
тип?
Новый отдельный RFC для тип возврата void был опубликован, прошел голосование и был реализован в PHP 7.1.
Теперь есть void
тип возврата в PHP. 🙂
Взято из 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 — единственно возможное значение типа null.
В PHP функция, которая ничего не возвращает, неявно возвращает null
, Это означает, что вы никогда не сможете на самом деле ничего не вернуть *. Собираюсь null
Маршрут означает, что нет никаких разрывов обратной совместимости, так как null
не будет допустимым именем класса / интерфейса / свойства, начиная с PHP 7.0 и не добавляет новый ключ или зарезервированные слова.
* Люди, знакомые с Zend Engine, поймут, что вы ничего не можете вернуть, но если вы ничего не вернули, присваиваемая вами переменная будет иметь значение null, что делает их логически эквивалентными.
В PHP 7.1 будет void
псевдо-типа. Это определено в Пустой тип возврата RFC.
Лично мне грустно об этом, потому что автор RFC ранее «ушел», и я взял RFC. Затем, следующее, что я знаю, это предложено и обсуждается, и она не стала бы ждать, пока я предложу типы объединений, которые были бы аннулированы, как отмечалось выше. Ну что ж.
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 от Андреа Фолдс для получения дополнительной информации!
В php нет эквивалентного типа для void,
вернуть NULL; Может соответствовать вашему требованию, так как он не имеет типа, например 0 или любого другого значения. Примечание: фактическая пустота означает отсутствие возврата.
@BeNice Я понимаю вашу точку зрения, так или иначе я суммирую соображения от
Леви Моррисон как практический вопрос устойчивости: введение void
как возможный тип возвращаемого факта, мы нарушаем предположение, что единственный возможный тип null
является null
,
Сюда, void
должны быть возвращены для проверки типа null
изменение архитектурных ограничений по конструкции и нарушение беспорядка в обратной совместимости.
// your choice implies this comparison should be true:
gettype(null) === void;
Я думаю, кто использовал null
не часто в своем кодексе будет нести void
реализация типа.