it-swarm.com.ru

Обнуляемые типы возврата в PHP7

PHP 7 вводит возвращаем объявления типа . Это означает, что теперь я могу указать, что возвращаемое значение - это определенный класс, интерфейс, массив, вызываемый или один из вновь включаемых скалярных типов, что возможно для параметров функции.

function returnHello(): string {
    return 'hello';
}

Часто случается, что значение присутствует не всегда, и вы можете вернуть что-то типа или null. Хотя вы можете сделать параметры обнуляемыми, установив для них значение по умолчанию null (DateTime $time = null), похоже, не существует способа сделать это для возвращаемых типов. Это действительно так, или я как-то не понимаю, как это сделать? Они не работают:

function returnHello(): string? {
    return 'hello';
}

function returnHello(): string|null {
    return 'hello';
}
133
Jeroen De Dauw

PHP 7.1 теперь поддерживает обнуляемые типы возврата . Первый RFC, с которым я связался, это тот, на который они пошли:

function nullOrString(int $foo) : ?string
{
    return $foo%2 ? "odd" : null;
}

старый ответ:

Так как мой комментарий был фактически ответом на вопрос:

PHP 7 пока не будет поддерживать возвращаемые типы, допускающие обнуляемость, но есть RFC , чтобы решить эту проблему, он направлен на то, чтобы PHP 7.1. Если он пройдет, синтаксис будет влиять на все подсказки типа (как возвращаемые типы, так и подсказки типа):

public function returnStringOrNull(?array $optionalArray) : ?string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

Также есть конкурирующий RFC для добавления типов объединений, которые могли бы делать то же самое, но выглядели бы по-другому:

public function returnStringOrNull(array|null $optionalArray) : string|null
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);//string returned here
    }
    return null;
}

Но сейчас вам нужно написать:

public function returnStringOrNull( array $optionalArray = null)
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
}

Или просто верните пустую строку, чтобы она соответствовала типу возвращаемого значения, и проверьте ложное значение:

public function returnStringOrNull( array $optionalArray = null) : string
{
    if ($optionalArray) {
        return implode(', ', $optionalArray);
    }
    return '';
}
//call
$string = $x->returnStringOrNull();
if (!$string) {
    $string = $x->returnStringOrNull(range(1, 10));
}
211
Elias Van Ootegem

Обнуляемые типы доступны в PHP 7.1.

Это пример синтаксиса:

public function getName(): ?string
{
    return $this->name; // name can be null
}

PHP 7.1 теперь GA, и вы можете обновить его с PHP 7.0 (есть только несколько несовместимых с обратными версиями изменений , которые вы должны проверить)

57
the_nuts