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(), работает с конкретным экземпляром объекта и возвращает актуальные значения свойств, а не значения по умолчанию.
Возвращает массив с именами методов, объявленных в классе. Полезен для анализа поведения класса.
Класс 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
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
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
trait TimestampTrait {
public $createdAt = null;
}
class Post {
use TimestampTrait;
public $title = '';
}
print_r(get_class_vars('Post'));
?>Array
(
[createdAt] =>
[title] =>
)