Опа, практически монады

WMix

герр M:)ller
Партнер клуба
Но вот чем дальше в лес, тем меньше баксов и больше вопросов
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Нужно больше сахара!
 

AnrDaemon

Продвинутый новичок
Как это мило. Привести пример говнокода и утверждать, что нашёл лучшее решение…
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
мне нравится :)
но использовать его будет вся Индия безумно и рьяно
 

флоппик

promotor fidei
Команда форума
Партнер клуба
Монада без функтора —деньги на ветер.

// Да, я знаю что технически это ковариантный функтор.
 

AnrDaemon

Продвинутый новичок
Возможно, я слишком редко читаю из настолько нерегулярных XML, что требуется проверять каждый чих…
А если переводить
PHP:
$country =  null;
 
if ($session !== null) {
    $user = $session->user;
 
    if ($user !== null) {
        $address = $user->getAddress();
 
        if ($address !== null) {
            $country = $address->country;
        }
    }
}
на нормальный язык, получится что-то вроде
PHP:
function getCountry($session) {
    if (!isset($session->user)) return; // or throw

    $address = $session->user->getAddress();
    if (!isset($address)) return; // or throw

    $country = $address->country;

    return $country;
}
 

WMix

герр M:)ller
Партнер клуба
только если без if
Код:
Uncaught Error: Call to a member function getAddress() on null
цепочка любая же
 

S.Chushkin

Пофигист
PHP:
// Тест...
$session = (object)[
    'user' => new class {
            function getAddress() {
                return null;
            }
            function getAddress2() {
                return (object)['country' => 'country'];
            }
        },
    ];
    $country = null;
    $country2 = null;
    if(isset($session->user)) {
        $country = $session->user->getAddress()->country ?? null;
        $country2 = $session->user->getAddress2()->country ?? null;
    }

var_dump(['$country' => $country, '$country2' => $country2]);
/*
array(2) {
  ["$country"]=>
  NULL
  ["$country2"]=>
  string(7) "country"
}
*/
Это всё, - никаких сообщений, ошибок и пр.
(естественно, выдача ошибок в среде разработки выставлена на максимум)
 

MiksIr

miksir@home:~$
Таки да, давно уже $a->b->c->d ?? null можно, так что индусам переучиваться не нужно будет,
а вот остальным адресное управление все же удобнее будет $a->b?->c->d
 
Сверху