Пустота как возвращаемый тип
Я тестировал типы возвращаемых данных с помощью PHP 7.
Я создал простой script для проверки возвращаемых типов 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
, это означает, что вы ничего не можете вернуть или вы получите сообщение об ошибке. Поэтому я написал этот script:
<?php
function foo(): void {
}
foo();
Теперь в выше script ожидаемый результат ничего.
Вместо этого он дает мне фатальную ошибку:
Неустранимая ошибка: возвращаемое значение foo() должно быть экземпляром void, ни один из них не возвращается в строке 2
Мой вопрос (я не мог его найти), в PHP 7 будет такой же тип void
?
Ответы
Ответ 1
Изменить:
Опубликован новый отдельный RFC для типа возврата void, прошел голосование и был реализован в PHP 7.1.
Теперь в PHP существует возвращаемый тип void
.:)
Оригинальное сообщение:
Взято из wiki.php.net:
Будущая работа
Идеи для будущей работы, выходящие за рамки настоящего RFC, включают:
- Разрешить функции объявлять, что они вообще ничего не возвращают (void в Java и C)
Так что в настоящее время нет способа объявить, что вы ничего не возвращаете.
Я не знаю, что лучше всего в вашей ситуации, но я бы, вероятно, просто не декларировал возвращаемый тип.
Чтобы ответить на вопрос, будет ли тип возврата void
в PHP 7:
Пока нет гарантии, но я думаю, что очень вероятно, что void
или синоним будут каким-то образом реализованы.
Ответ 2
Автор обратных типов 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
. Он определен в Void Return Type RFC.
Лично мне грустно об этом, потому что автор RFC ранее "ушел", и я взял RFC. Затем следующее, что я знаю, оно было предложено и обсуждено, и она не стала бы ждать, пока я предлагаю типы профсоюзов, которые были бы противоположностью, как было отмечено выше. О, хорошо.
Ответ 3
Тип возврата 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.
Ответ 4
В php нет эквивалентного типа для void,
return NULL; может соответствовать вашему требованию, поскольку у него нет никакого типа типа 0 или любого другого значения. Примечание: фактическое значение void означает возврат.