Подтвердить что ты не робот

Пустота как возвращаемый тип

Я тестировал типы возвращаемых данных с помощью 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?

4b9b3361

Ответ 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 означает возврат.