Property exists: примеры (PHP)
property_exists(object|string $object_or_class, string $property): boolФункция property_exists() используется для проверки существования свойства в указанном классе или объекте. Она позволяет определить, объявлено ли свойство в классе, независимо от его области видимости (public, protected, private). Это особенно полезно при работе с динамическими свойствами или при проверке структуры объектов, полученных из внешних источников, например, из JSON или баз данных.
- $class (mixed) - принимает либо строку с именем класса, либо объект, в котором необходимо проверить наличие свойства.
- $property (string) - имя проверяемого свойства в виде строки.
Функция возвращает true, если свойство существует, и false в противном случае. Стоит учитывать, что property_exists() также проверяет наличие свойств в родительских классах.
Базовый пример проверки свойства в классе:
<?php
class ExampleClass {
public $publicProp = 'value';
private $privateProp;
}
// Проверка на классе
var_dump(property_exists('ExampleClass', 'publicProp'));
// Проверка на объекте
$obj = new ExampleClass();
var_dump(property_exists($obj, 'privateProp'));
// Проверка несуществующего свойства
var_dump(property_exists($obj, 'nonExistentProp'));
?>bool(true) bool(true) bool(false)
Проверка свойства с учетом наследования:
<?php
class ParentClass {
protected $inheritedProp;
}
class ChildClass extends ParentClass {}
var_dump(property_exists('ChildClass', 'inheritedProp'));
?>bool(true)
- isset() — проверяет, установлено ли свойство и не равно ли null. Не работает с недоступными private/protected свойствами.
- method_exists() — проверяет существование метода в классе или объекте.
- get_class_vars() — возвращает массив объявленных свойств класса с их значениями по умолчанию. Учитывает область видимости вызывающего кода.
Функцию property_exists() предпочтительнее использовать, когда требуется только проверить факт объявления свойства, не обращая внимания на его доступность или значение. Для проверки доступности свойства и его значения больше подходит isset().
Property exists в Python
Функция hasattr() проверяет наличие атрибута у объекта.
class ExampleClass:
def __init__(self):
self.public_prop = 'value'
obj = ExampleClass()
print(hasattr(obj, 'public_prop'))
print(hasattr(obj, 'non_existent'))True False
Property exists в Javascript
Оператор in или метод hasOwnProperty().
const obj = { existingProp: 123 };
console.log('existingProp' in obj);
console.log(obj.hasOwnProperty('existingProp'));
console.log('nonExistent' in obj);true true false
Property exists в MySQL
Аналогичной прямой функции нет, но можно проверить наличие столбца в таблице через INFORMATION_SCHEMA.COLUMNS.
SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'db_name'
AND TABLE_NAME = 'table_name'
AND COLUMN_NAME = 'column_name';<?php
// Ошибка: передача массива вместо объекта или строки класса
var_dump(property_exists([], 'prop'));
?>Warning: property_exists() expects parameter 1 to be object or string, array given bool(false)
<?php
// Вызовет предупреждение, если класс не объявлен
var_dump(property_exists('UnexistingClass', 'property'));
?>Warning: property_exists(): Class UnexistingClass does not exist bool(false)
<?php
class DynamicClass {}
$obj = new DynamicClass();
$obj->dynamicProp = 'value';
// property_exists не увидит динамически созданное свойство
var_dump(property_exists($obj, 'dynamicProp'));
var_dump(isset($obj->dynamicProp));
?>bool(false) bool(true)
- PHP 8.0.0: вызов property_exists() с первым аргументом null теперь вызывает ошибку TypeError. Ранее возвращалось false.
- PHP 7.4.0: улучшена обработка магических свойств. Теперь property_exists() может вернуть true для магических свойств, если класс реализует __isset() и этот метод возвращает true для проверяемого свойства.
- PHP 5.3.0: функция стала корректно обрабатывать магические свойства при использовании __isset().
<?php
class MagicClass {
private $data = [];
public function __isset($name) {
return array_key_exists($name, $this->data);
}
public function __set($name, $value) {
$this->data[$name] = $value;
}
}
$obj = new MagicClass();
$obj->magicProp = 'test';
// Свойство существует, так как __isset возвращает true
var_dump(property_exists($obj, 'magicProp'));
?>bool(true)
<?php
trait ExampleTrait {
protected $traitProperty;
}
class UsingTraitClass {
use ExampleTrait;
}
var_dump(property_exists('UsingTraitClass', 'traitProperty'));
?>bool(true)
<?php
$stdObj = new stdClass();
$stdObj->custom = 1;
// stdClass не имеет предопределенных свойств
var_dump(property_exists($stdObj, 'custom')); // Динамическое свойство
var_dump(property_exists($stdObj, 'undefined'));
?>bool(false) bool(false)
<?php
function validateObjectProperties($object, array $requiredProps) {
$missing = [];
foreach ($requiredProps as $prop) {
if (!property_exists($object, $prop)) {
$missing[] = $prop;
}
}
return $missing;
}
class DataModel {
public $id;
public $name;
}
$model = new DataModel();
$missingProps = validateObjectProperties($model, ['id', 'name', 'email']);
print_r($missingProps);
?>Array
(
[0] => email
)