Answers:
if (property_exists($ob, 'a'))
if (isset($ob->a))
如果属性为null,则isset()将返回false
范例1:
$ob->a = null
var_dump(isset($ob->a)); // false
范例2:
class Foo
{
public $bar = null;
}
$foo = new Foo();
var_dump(property_exists($foo, 'bar')); // true
var_dump(isset($foo->bar)); // false
empty()
有更好的解决方案?!empty($var)
?
要检查该属性是否存在以及是否也为null,可以使用函数property_exists()
。
文件:http://php.net/manual/en/function.property-exists.php
与isset()相反,即使属性的值为NULL,property_exists()也会返回TRUE。
bool property_exists(混合$ class,字符串$ property)
例:
if (property_exists($testObject, $property)) {
//do something
}
isset或property_exists都不适合我。
我最终选择了:
$exists = array_key_exists($property, get_object_vars($obj));
例:
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
}
}
解
echo $person->middleName ?? 'Person does not have a middle name';
在if语句中显示它的外观,以更清楚地了解其工作方式。
if($person->middleName ?? false) {
echo $person->middleName;
} else {
echo 'Person does not have a middle name';
}
说明
检查某事物是否存在的传统PHP方法是:
if(isset($person->middleName)) {
echo $person->middleName;
} else {
echo 'Person does not have a middle name';
}
或以更特定于类的方式:
if(property_exists($person, 'middleName')) {
echo $person->middleName;
} else {
echo 'Person does not have a middle name';
}
这些在长格式语句中都很好,但是在三元语句中,它们变得不必要地麻烦,例如:
isset($person->middleName) ? echo $person->middleName : echo 'Person does not have a middle name';
您还可以仅使用三元运算符来实现此目的,如下所示:
echo $person->middleName ?: 'Person does not have a middle name';
但是...如果该值不存在(未设置),它将引发E_NOTICE
且不是最佳实践。如果值为null
,则不会引发异常。
因此,三元运算符可以使这成为一个简洁的小答案:
echo $person->middleName ?? 'Person does not have a middle name';
如果您想知道已定义的类的实例中是否存在属性,只需property_exists()
与组合isset()
。
public function hasProperty($property)
{
return property_exists($this, $property) && isset($this->$property);
}
property_exists($this, $property)
这里的调用是多余的,因为您的代码将始终具有与isset($this->$property)
单独代码相同的结果。
isset()
无法告诉您属性是否是类定义的真实成员。稍后我会再次查找以确保。
__get()
更重要的是__isset()
魔术方法)的虚拟属性,则在某些情况下输出将有所不同。
要检查是否存在退出,可以使用PHP函数isset()参见php.net。此函数将检查变量是否已设置并且不为NULL。
例:
if(isset($obj->a))
{
//do something
}
如果需要检查类中是否存在属性,则可以使用内置函数property_exists()
例:
if (property_exists('class', $property)) {
//do something
}
只需把我的2美分放在这里。
给定以下类别:
class Foo
{
private $data;
public function __construct(array $data)
{
$this->data = $data;
}
public function __get($name)
{
return $data[$name];
}
public function __isset($name)
{
return array_key_exists($name, $this->data);
}
}
将会发生以下情况:
$foo = new Foo(['key' => 'value', 'bar' => null]);
var_dump(property_exists($foo, 'key')); // false
var_dump(isset($foo->key)); // true
var_dump(property_exists($foo, 'bar')); // false
var_dump(isset($foo->bar)); // true, although $data['bar'] == null
希望这会帮助任何人