Property exists: примеры (PHP)

Проверка существования свойств класса с property_exists
Раздел: Объектно-ориентированное программирование
property_exists(object|string $object_or_class, string $property): bool
Функция property_exists в PHP

Функция 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)
Похожие функции в PHP
  • 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
  • PHP 8.0.0: вызов property_exists() с первым аргументом null теперь вызывает ошибку TypeError. Ранее возвращалось false.
  • PHP 7.4.0: улучшена обработка магических свойств. Теперь property_exists() может вернуть true для магических свойств, если класс реализует __isset() и этот метод возвращает true для проверяемого свойства.
  • PHP 5.3.0: функция стала корректно обрабатывать магические свойства при использовании __isset().
Расширенные примеры
Работа с магическими методами
Пример php
<?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
<?php
trait ExampleTrait {
    protected $traitProperty;
}

class UsingTraitClass {
    use ExampleTrait;
}

var_dump(property_exists('UsingTraitClass', 'traitProperty'));
?>
bool(true)
Сравнение с объектами stdClass
Пример php
<?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
<?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
)

PHP property_exists function comments

En
Property exists Checks if the object or class has a property