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 33

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.