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

Неверные возвращаемые типы в PHP7

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

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

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

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

function returnHello(): string|null {
    return 'hello';
}
4b9b3361

Ответ 1

PHP 7.1 Теперь поддерживает типы возвращаемого значения nullable. Первый 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, чтобы добавить типы union, которые могли бы сделать то же самое, но выглядели бы иначе:

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));
}

Ответ 2

Nullable Types доступны в PHP 7.1.

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

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

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