PHP проверяет, существует ли свойство в объекте или классе
Я понимаю, что PHP не имеет чистой объектной переменной, но я хочу проверить, находится ли свойство в данном объекте или классе.
$ob = (object) array('a' => 1, 'b' => 12);
или
$ob = new stdClass;
$ob->a = 1;
$ob->b = 2;
В JS я могу написать это, чтобы проверить, существует ли переменная a
в объекте:
if ('a' in ob)
В PHP, можно сделать что-нибудь подобное?
Большое спасибо за ваш совет.
Ответы
Ответ 1
if (property_exists($ob, 'a'))
if (isset($ob->a))
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
Ответ 2
Чтобы проверить, существует ли свойство и имеет ли оно значение null, вы можете использовать функцию property_exists()
.
Документы: http://php.net/manual/en/function.property-exists.php
В отличие от isset(), property_exists() возвращает TRUE, даже если свойство имеет значение NULL.
bool property_exists (смешанный класс $, строка $ свойство)
Пример:
if (property_exists($testObject, $property)) {
//do something
}
Ответ 3
Для меня не работают isset или property_exists.
- isset возвращает false, если свойство существует, но имеет значение NULL.
- property_exists возвращает значение true, если свойство является частью определения класса объекта, даже если оно было отменено.
Я закончил с:
$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
}
}
Ответ 4
Если вы хотите узнать, существует ли свойство в экземпляре класса, который вы определили, просто соедините property_exists()
с isset()
.
public function hasProperty($property)
{
return property_exists($this, $property) && isset($this->$property);
}
Ответ 5
Чтобы проверить, что что-то выходит, вы можете использовать функцию PHP isset() см. php.net. Эта функция проверяет, установлена ли переменная и не является NULL.
Пример:
if(isset($obj->a))
{
//do something
}
Если вам нужно проверить, существует ли свойство в классе, вы можете использовать функцию сборки property_exists()
Пример:
if (property_exists('class', $property)) {
//do something
}
Ответ 6
echo $person->middleName?? 'Person does not have a middle name';
ИЛИ ЖЕ
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';
isset($person->middleName)? echo $person->middleName: echo 'Person does not have a middle name';
echo $person->middleName?: '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';