什么';在PHP中,检查链接返回值的最简洁语法是什么?

什么';在PHP中,检查链接返回值的最简洁语法是什么?,php,Php,如果我需要访问一系列getter末尾的值,如下所示: $employeeFirstName = $company->getEmployee() ->getName() ->getFirstName() ->getSomethingElse() ->getEtc(); if($company->getEmployee() && $company->getEmployee()->getName(

如果我需要访问一系列getter末尾的值,如下所示:

$employeeFirstName = $company->getEmployee()
    ->getName()
    ->getFirstName()
    ->getSomethingElse()
    ->getEtc();
if($company->getEmployee()
    && $company->getEmployee()->getName()
    && $company->getEmployee()->getName()->getFirstName()
    && $company->getEmployee()->getName()->getFirstName()->getSomethingElse()
    && $company->getEmployee()->getName()->getFirstName()->getSomethingElse()->getEtc()
) {
    // It's safe to use the value of getEtc()
}
try {
    $foo = $bar->baz()->quux()->blarg()...;
} catch (FooBarBazException $e) {
    $foo = null;
}
如果name、first name、something或etc为null,则后续getter调用将引发异常,因此常见的做法是看到如下null检查:

$employeeFirstName = $company->getEmployee()
    ->getName()
    ->getFirstName()
    ->getSomethingElse()
    ->getEtc();
if($company->getEmployee()
    && $company->getEmployee()->getName()
    && $company->getEmployee()->getName()->getFirstName()
    && $company->getEmployee()->getName()->getFirstName()->getSomethingElse()
    && $company->getEmployee()->getName()->getFirstName()->getSomethingElse()->getEtc()
) {
    // It's safe to use the value of getEtc()
}
try {
    $foo = $bar->baz()->quux()->blarg()...;
} catch (FooBarBazException $e) {
    $foo = null;
}
有没有一种更简洁/更易于阅读的空检查链式get方法呢?

如果它应该是一个流畅的API,那么这些方法都不应该返回
null
,而应该抛出一些定义的异常。这使您能够编写如下代码:

$employeeFirstName = $company->getEmployee()
    ->getName()
    ->getFirstName()
    ->getSomethingElse()
    ->getEtc();
if($company->getEmployee()
    && $company->getEmployee()->getName()
    && $company->getEmployee()->getName()->getFirstName()
    && $company->getEmployee()->getName()->getFirstName()->getSomethingElse()
    && $company->getEmployee()->getName()->getFirstName()->getSomethingElse()->getEtc()
) {
    // It's safe to use the value of getEtc()
}
try {
    $foo = $bar->baz()->quux()->blarg()...;
} catch (FooBarBazException $e) {
    $foo = null;
}
如果API不应该流畅,您应该一步一步地编写它,并对每个步骤进行明确的成功检查,这可能会返回
null

$baz = $foo->bar()->baz();
if (!$baz) {
    return false;  // or whatever
}

$quux = $baz->quux();
if (!$quux) {
    ...
}

...

用越来越长的链重复调用每个方法是一种资源浪费和难以读取的行为。

因此,常见的做法是看到像这样的空检查。。。它是?如果它抛出一个异常,你可以简单地捕获它…?或者你的意思是它产生了一个不可恢复的错误?FWIW,如果该操作不能保证成功,则不应以流畅的方式编写它。您创建了一个方法,该方法将执行此长而难看的检查并返回结果或错误消息<代码>如果($company->hasvalideemployee()){..
并让该方法检查它需要检查的任何内容,以确保存在有效的信息。为此,您选择的接口是错误的,如@deceze所述。如果不能保证成功,请不要用流畅的风格编写。@JonStirling Ha,至少在这个代码库中。:/这取决于API应该做什么。如果每个方法都定义了d,这样它应该返回一些东西,在异常情况下它不会返回,那么使用异常是完全有效的。调用代码处理异常情况,转而使用替代计划(使用一些默认值)。但是,如果这些情况不是例外,而是正常情况,那么您实际上是在滥用流控制的异常。这也适用于JS吗?因为我一直在使用
undefined
进行检查。我想说,这两种模式中的一种适用于大多数编程语言,通过这种模式更适合/更首选取决于有问题的语言。我想说,在JS中,使用异常的频率较低;但在JS中,您也会更经常地发现简单的属性访问,而不是方法调用和习惯用法,如
((a |{}).b |{}).c