我理解PHP没有纯对象变量,但我想检查属性是否在给定对象或类中。
$ob = (object) array('a' => 1, 'b' => 12);
或
$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;
在 JS中,我可以写这个来检查对象中是否存在变量a
:
if ('a' in ob)
在 PHP,可以做这样的事吗?
非常感谢你的建议。
答案 0 :(得分:160)
if (property_exists($ob, 'a'))
if (isset($ob->a))
如果property为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
答案 1 :(得分:54)
要检查属性是否存在以及它是否为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
}
答案 2 :(得分:10)
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
}
}
答案 3 :(得分:4)
如果您想知道某个类的实例中是否存在属性,只需将connection-status : Connected
id : 58
name : server1
engine-id : 59
connection-status : Disconnected
id : 57
name : server2
engine-id : 61
与property_exists()
合并。
isset()
答案 4 :(得分:2)
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';
}
说明
检查某物是否存在的传统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';
答案 5 :(得分:1)
答案 6 :(得分:0)
要检查是否存在某些内容,可以使用PHP函数isset()see php.net。此函数将检查变量是否已设置且不为NULL。
示例:
if(isset($obj->a))
{
//do something
}
如果您需要检查某个类中是否存在属性,那么您可以使用内置函数property_exists()
示例:
if (property_exists('class', $property)) {
//do something
}
答案 7 :(得分:0)
只要把我的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
希望这会帮助任何人
答案 8 :(得分:0)
通常我使用某种自定义助手
/**
* @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;
}
请记住,如果属性为空,您将获得空值并且没有默认值。
顺便说一句,类似的帮助程序也适用于 JS。
答案 9 :(得分:0)
从php8.0开始就可以用了??运算符作为 isset 的糖。请记住,如果 $foo->bar??<what value you want here>
未设置,<what value you want here>
将返回 $foo->bar
,否则返回 $foo->bar
,无论 $foo->bar
具有什么值,都可能为 0 , false, '' 或其他假值