我知道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没有一个纯对象变量,但我想检查属性是否在给定的对象或类中。
$ob = (object) array('a' => 1, 'b' => 12);
or
$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;
在JS中,我可以写这个来检查变量a是否存在于一个对象中:
if ('a' in ob)
在PHP中,可以做到这一点吗?
当前回答
通常我使用自定义助手
/**
* @param Object $object
* @param string $property as a string with nested properties 'prop1.nesterdProp.deepvalue'
* @param mixed $default
* @return mixed
*/
function getPropertyOrDefault(Object $object, string $property, $default = null)
{
$value = $object;
$path = explode('.', $property);
foreach ($path as $prop) {
if (is_object($value) && property_exists($value, $prop)) {
$value = $value->{$prop};
} else {
return $default;
}
}
return $value;
}
请记住,如果属性为空,您将得到空值,没有默认值。
顺便说一下,类似的helper在JS中也可以工作。
其他回答
这是非常新的,所以请确保您运行的是PHP 8:
$ob?->a
参考链接
我只是说说我的看法。
给定以下类:
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
希望这对大家有所帮助
如果您想知道某个属性是否存在于已定义的类的实例中,只需将property_exists()与isset()结合起来即可。
public function hasProperty($property)
{
return property_exists($this, $property) && isset($this->$property);
}
要检查是否存在某些内容,可以使用PHP函数isset(),参见php.net。这个函数将检查变量是否已设置且不为NULL。
例子:
if(isset($obj->a))
{
//do something
}
如果需要检查类中是否存在某个属性,则可以使用内建函数property_exists()
例子:
if (property_exists('class', $property)) {
//do something
}
解决方案
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 ??“人没有中间名”;