Search code examples
phpoperatorschainingphp-8nullsafe

Is there a "nullsafe operator" in PHP?


Is there any way to write the following statement using some kind of safe navigation operator?

echo $data->getMyObject() != null ? $data->getMyObject()->getName() : '';

So that it looks like this:

echo $data->getMyObject()?->getName();

Solution

  • From PHP 8, you are able to use the null safe operator which combined with the null coalescing operator allows you to write code like:

    echo $data->getMyObject()?->getName() ?? '';
    

    By using ?-> instead of -> the chain of operators is terminated and the result will be null.

    The operators that "look inside an object" are considered part of the chain.

    • Array access ([])
    • Property access (->)
    • Nullsafe property access (?->)
    • Static property access (::)
    • Method call (->)
    • Nullsafe method call (?->)
    • Static method call (::)

    e.g. for the code:

    $string = $data?->getObject()->getName() . " after";
    

    if $data is null, that code would be equivalent to:

    $string = null . " after";
    

    As the string concatenation operator is not part of the 'chain' and so isn't short-circuited.