Get class vars: примеры (PHP)

Работа с get_class_vars: получение свойств класса в PHP
Раздел: Объектно-ориентированное программирование
get_class_vars(string $class): array

Основные сведения о функции get_class_vars

Функция get_class_vars() возвращает массив со значениями свойств по умолчанию для указанного класса. Эта функция часто используется для интроспекции объектов, чтобы получить информацию о свойствах, объявленных в классе, и их значениях по умолчанию до создания экземпляра объекта.

Назначение и сценарии использования

Использование функции происходит при необходимости анализа структуры класса. Типичные сценарии включают создание динамических форм на основе свойств класса, генерацию документации, валидацию или сериализацию данных. Функция возвращает только те свойства, которые доступны из текущей области видимости.

Аргументы функции

Функция принимает один обязательный параметр:

  • string $class — Имя класса, свойства которого необходимо получить. Передается в виде строки.

Примеры использования

Базовый пример

Получение свойств простого класса.

<?php
class User {
    public string $name = 'Иван';
    protected int $age = 25;
    private string $password = 'secret';
    public static $role = 'admin';
}

$properties = get_class_vars('User');
print_r($properties);
?>
Array
(
    [name] => Иван
    [role] => admin
)
Пример с динамическим именем класса
<?php
class Product {
    public float $price = 0.0;
}

$className = 'Product';
$vars = get_class_vars($className);
var_dump($vars);
?>
array(1) {
  ["price"]=>
  float(0)
}

Похожие функции в PHP

В PHP существуют другие функции для интроспекции классов.

Возвращает свойства доступные объекту в текущей области видимости. В отличие от get_class_vars(), работает с конкретным экземпляром объекта и возвращает актуальные значения свойств, а не значения по умолчанию.

Возвращает массив с именами методов, объявленных в классе. Полезен для анализа поведения класса.

ReflectionClass

Класс Reflection API предоставляет гораздо более полную информацию о классе: свойства, методы, модификаторы доступа, комментарии. Использование Reflection предпочтительнее для сложного анализа структуры класса, тогда как get_class_vars() подходит для быстрого получения простого списка свойств по умолчанию.

Аналоги в других языках

Get class vars в Python

В Python для получения атрибутов класса используется функция vars() или обращение к __dict__.

class User:
    name = 'Иван'
    age = 25

print(vars(User))
# Или
print(User.__dict__)
{'__module__': '__main__', 'name': 'Иван', 'age': 25, ...}

Get class vars в Javascript

В JavaScript нет прямой аналогии, так как классы в ES6 являются синтаксическим сахаром. Для получения полей экземпляра можно использовать Object.keys(). Свойства класса, объявленные через статические поля, доступны через сам класс.

class User {
    static role = 'admin';
    constructor(name) {
        this.name = name;
    }
}
console.log(Object.getOwnPropertyNames(User)); // Включает 'role', 'length', 'name'
console.log(User.role); // 'admin'

Get class vars в MySQL

Прямой аналогии в MySQL нет. Интроспекция в SQL связана с запросами к системным таблицам (например, INFORMATION_SCHEMA.COLUMNS) для получения структуры таблиц, что является другой концепцией.

Типичные ошибки

Передача несуществующего имени класса

Если передано имя несуществующего класса, будет выброшена ошибка.

<?php
$props = get_class_vars('NonExistentClass');
?>
Fatal error: Uncaught Error: Class "NonExistentClass" not found
Игнорирование области видимости

Частая ошибка — ожидание получения всех свойств, включая private и protected. Функция возвращает только свойства, видимые из текущего контекста.

<?php
class Example {
    public $a = 1;
    private $b = 2;
}

// Вызов из глобальной области видимости
$vars = get_class_vars('Example');
print_r($vars); // Выведет только ['a' => 1]
?>

Изменения в новых версиях PHP

В PHP 8.1.0 было изменено поведение при вызове get_class_vars() из области видимости родительского класса. Теперь функция корректно возвращает все унаследованные public и protected свойства, если вызов происходит внутри метода родительского класса, что обеспечивает более последовательное поведение. В более ранних версиях могло возникать неожиданное поведение при анализе свойств дочерних классов из методов родителя.

Расширенные примеры применения

Использование в родительском классе для анализа наследника
Пример php
<?php
abstract class BaseModel {
    public static function getDefaultProperties() {
        // Получаем свойства класса, который вызвал статический метод
        return get_class_vars(static::class);
    }
}

class Article extends BaseModel {
    public string $title = 'Новая статья';
    public string $status = 'draft';
    protected int $id = 0;
}

print_r(Article::getDefaultProperties());
?>
Array
(
    [title] => Новая статья
    [status] => draft
)
Влияние на результат инициализации свойств во время выполнения
Пример php
<?php
class Config {
    public $path = __DIR__;
    public $time = 0;

    public function __construct() {
        $this->time = time();
    }
}

// Значения берутся на этапе компиляции, а не выполнения
$varsFromClass = get_class_vars('Config');
$obj = new Config();
$varsFromObject = get_object_vars($obj);

echo "Из класса: "; print_r($varsFromClass['time']); // 0
echo "\nИз объекта: "; print_r($varsFromObject['time']); // Текущее время
?>
Пример с трейтами

Свойства, объявленные в трейте, также попадают в результирующий массив.

Пример php
<?php
trait TimestampTrait {
    public $createdAt = null;
}

class Post {
    use TimestampTrait;
    public $title = '';
}

print_r(get_class_vars('Post'));
?>
Array
(
    [createdAt] =>
    [title] =>
)

PHP get_class_vars function comments

En
Get class vars Get the default properties of the class