Source: PHP check whether property exists in object or class
I understand PHP does not have a pure object variable, but I want to check whether a property is in the given object or class.
$ob = (object) array('a' => 1, 'b' => 12);
or
$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;
In JS, I can write this to check if variable a
exists in an object:
if ('a' in ob)
In PHP, can anything like this be done?
property_exists( mixed $class , string $property )
if (property_exists($ob, 'a'))
isset( mixed $var [, mixed $… ] )
if (isset($ob->a))
isset() will return false if property is null
Example 1:
$ob->a = null
var_dump(isset($ob->a)); // false
Example 2:
class Foo
{
public $bar = null;
}
$foo = new Foo();
var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false
Solution in PHP 7
echo $person->middleName ?? 'Person does not have a middle name';
To show how this would look in an if statement for more clarity on how this is working.
if($person->middleName ?? false) {
echo $person->middleName;
} else {
echo 'Person does not have a middle name';
}
Explanation
The traditional PHP way to check for something’s existence is to do:
if(isset($person->middleName)) {
echo $person->middleName;
} else {
echo 'Person does not have a middle name';
}
OR for a more class specific way:
if(property_exists($person, 'middleName')) {
echo $person->middleName;
} else {
echo 'Person does not have a middle name';
}
These are both fine in long form statements but in ternary statements they become unnecessarily cumbersome like so:
isset($person->middleName) ? echo $person->middleName : echo 'Person does not have a middle name';
You can also achieve this with just the ternary operator like so:
echo $person->middleName ?: 'Person does not have a middle name';
But… if the value does not exist (is not set) it will raise an E_NOTICE
and is not best practise. If the value is null
it will not raise the exception.
Therefore ternary operator to the rescue making this a neat little answer:
echo $person->middleName ?? 'Person does not have a middle name';