我知道PHP没有一个纯对象变量,但我想检查属性是否在给定的对象或类中。

$ob = (object) array('a' => 1, 'b' => 12); 

or

$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;

在JS中,我可以写这个来检查变量a是否存在于一个对象中:

if ('a' in ob)

在PHP中,可以做到这一点吗?


当前回答

在php 7.4中已弃用对象上的array_key_exists()

相反,应该使用isset()或property_exists()

参考:php.net

其他回答

这是非常新的,所以请确保您运行的是PHP 8:

$ob?->a

参考链接

要检查属性是否存在,以及是否也为空,可以使用函数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
}

如果您想知道某个属性是否存在于已定义的类的实例中,只需将property_exists()与isset()结合起来即可。

public function hasProperty($property)
{
    return property_exists($this, $property) && isset($this->$property);
}

解决方案

echo $person-> middlelename ??“人没有中间名”;

为了更清楚地说明它是如何工作的,在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';
}

OR表示更具体的类:

if(property_exists($person, 'middleName')) {
    echo $person->middleName;
} else {
    echo 'Person does not have a middle name';
}

它们在长形式语句中都很好,但在三元语句中,它们变得不必要地麻烦,像这样:

收取(人- > middleName) ?echo $person-> middlelename: echo ' person没有中间名';

你也可以通过这样的三元运算符来实现:

echo $person-> midlename ?: '人没有中间名';

但是…如果该值不存在(没有设置),它将引发一个E_NOTICE,这不是最佳实践。如果值为空,则不会引发异常。

因此,三元运算符来拯救它,使它成为一个简洁的答案:

echo $person-> middlelename ??“人没有中间名”;

Property_exists(混合$class,字符串$property)

if (property_exists($ob, 'a')) 

Isset (mixed $var [, mixed $…])

注意:注意,如果属性为空,isset()将返回false

if (isset($ob->a))

示例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