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, ни одно не возвращается в строке 2

У меня вопрос (я не смог его найти), в PHP 7 будет подобное void тип?

38

Решение

Новый отдельный RFC для тип возврата void был опубликован, прошел голосование и был реализован в PHP 7.1.
Теперь есть void тип возврата в PHP. 🙂

Взято из wiki.php.net:

Идеи для будущей работы, которые выходят за рамки данного RFC, включают в себя:

  • Разрешить функциям объявлять, что они вообще ничего не возвращают (void в Java и C)

Так что в настоящее время нет никакого способа заявить, что вы ничего не возвращаете.
Я не знаю, что лучше в вашей ситуации, но я бы, наверное, просто не объявил тип возвращаемого значения.

Чтобы ответить на ваш вопрос, будет ли void тип возврата в PHP 7:
Здесь нет гарантия пока, но я думаю, что очень вероятно, что void или синоним будет реализован каким-либо образом.

54

Другие решения

Автор возвращаемых типов 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. Затем, следующее, что я знаю, это предложено и обсуждается, и она не стала бы ждать, пока я предложу типы объединений, которые были бы аннулированы, как отмечалось выше. Ну что ж.

17

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 от Андреа Фолдс для получения дополнительной информации!

12

В php нет эквивалентного типа для void,
вернуть NULL; Может соответствовать вашему требованию, так как он не имеет типа, например 0 или любого другого значения. Примечание: фактическая пустота означает отсутствие возврата.

1

@BeNice Я понимаю вашу точку зрения, так или иначе я суммирую соображения от
Леви Моррисон как практический вопрос устойчивости: введение void как возможный тип возвращаемого факта, мы нарушаем предположение, что единственный возможный тип null является null,

Сюда, void должны быть возвращены для проверки типа nullизменение архитектурных ограничений по конструкции и нарушение беспорядка в обратной совместимости.

// your choice implies this comparison should be true:
gettype(null) === void;

Я думаю, кто использовал null не часто в своем кодексе будет нести void реализация типа.

0
По вопросам рекламы [email protected]