问题
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?
Thank you very much for your advice.
回答1:
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
回答2:
To check if the property exists and if it's null too, you can use the function property_exists().
Docs: http://php.net/manual/en/function.property-exists.php
As opposed with isset(), property_exists() returns TRUE even if the property has the value NULL.
bool property_exists ( mixed $class , string $property )
Example:
if (property_exists($testObject, $property)) {
//do something
}
回答3:
Neither isset or property_exists work for me.
- isset returns false if the property exists but is NULL.
- property_exists returns true if the property is part of the object's class definition, even if it has been unset.
I ended up going with:
$exists = array_key_exists($property, get_object_vars($obj));
Example:
class Foo {
public $bar;
function __construct() {
$property = 'bar';
isset($this->$property); // FALSE
property_exists($this, $property); // TRUE
array_key_exists($property, get_object_vars($this)); // TRUE
unset($this->$property);
isset($this->$property); // FALSE
property_exists($this, $property); // TRUE
array_key_exists($property, get_object_vars($this)); // FALSE
$this->$property = 'baz';
isset($this->$property); // TRUE
property_exists($this, $property); // TRUE
array_key_exists($property, get_object_vars($this)); // TRUE
}
}
回答4:
If you want to know if a property exists in an instance of a class that you have defined, simply combine property_exists() with isset().
public function hasProperty($property)
{
return property_exists($this, $property) && isset($this->$property);
}
回答5:
echo $person->middleName ?? 'Person does not have a middle name';
OR
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 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';
回答6:
To check if something exits, you can use the PHP function isset() see php.net. This function will check if the variable is set and is not NULL.
Example:
if(isset($obj->a))
{
//do something
}
If you need to check if a property exists in a class, then you can use the build in function property_exists()
Example:
if (property_exists('class', $property)) {
//do something
}
回答7:
Using array_key_exists() on objects is Deprecated in php 7.4
Instead either isset() or property_exists() should be used
reference : php.net
来源:https://stackoverflow.com/questions/14414379/php-check-whether-property-exists-in-object-or-class