Сокращенный троичный оператор PHP - вызов функции-члена в нуль - PullRequest
0 голосов
/ 12 февраля 2020

Учитывая класс:

<?php
class foo {
    public function getGuest() {
        return new guest();
    }
}

class guest {
    public function getGender() {
        return 'F';
    }
}

Я хотел рефакторинг следующего, который прекрасно работает:

$bar->getGuest() ? $bar->getGuest()->getGender() : NULL

Кому:

$bar->getGuest() ?: $bar->getGuest()->getGender()

Где я получаю ошибка: вызов функции-члена getGender () для null

Я ожидал, что это будет работать так же, как и в верхней версии, так как я понял, что вторая версия была, если левая сторона верна, верните левую руку, в противном случае верните правую руку. Итак, если левая рука ложная, почему правая? Может кто-нибудь объяснить это?

Учитывая, что вторая версия не работает, является ли верхняя версия наиболее краткой?

1 Ответ

1 голос
/ 12 февраля 2020

Из PHP руководства :

Начиная с PHP 5.3, можно опустить среднюю часть троичного оператора. Выражение expr1?: Expr3 возвращает expr1, если expr1 оценивается как TRUE, и expr3 в противном случае.

Давайте посмотрим, что вы пытаетесь сделать здесь:

$bar->getGuest() ?: $bar->getGuest()->getGender()

Как это работает, если первое $bar->getGuest() выражение равно true, ваша операция вернет само значение $bar->getGuest(). Это должно работать нормально, без ошибок.

Однако, если $bar->getGuest() возвращает что-то еще (например, null), он запустит третье выражение, которое будет $bar->getGuest()->getGender().

Хорошо, мы уже установлено, что $bar->getGuest() вернул null, так как же тогда go и запустить другой метод ->getGender() для нулевого значения? Вы не можете, именно поэтому вы получаете ошибку.


Нет ничего плохого в том, чтобы ваш код читался и был прост. Возможно, вы захотите сохранить начальное значение вызова метода, поэтому вам не нужно вызывать его снова, чтобы запустить getGender().

$guest = $bar->getGuest();
$gender = ($guest === null) ? null : $guest->getGender();
...