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

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

Описание функции get_object_vars

Функция get_object_vars() возвращает ассоциативный массив свойств указанного объекта, доступных в текущей области видимости. Она часто применяется для инспекции состояния объекта, сериализации данных или обработки свойств в цикле.

Аргументы

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

  • object (object) – экземпляр объекта, свойства которого нужно получить.

Возвращаемое значение – массив, где ключи являются именами свойств, а значения – соответствующими значениями свойств. Если передан не объект, функция возвращает NULL и вызывает предупреждение.

Короткие примеры использования

Публичные свойства
<?php
class Example {
    public $a = 1;
    protected $b = 2;
    private $c = 3;
}
$obj = new Example();
print_r(get_object_vars($obj));
?>
Array
(
    [a] => 1
)
Использование внутри метода класса
<?php
class Example {
    public $a = 1;
    protected $b = 2;
    private $c = 3;
    public function showVars() {
        return get_object_vars($this);
    }
}
$obj = new Example();
print_r($obj->showVars());
?>
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)
Динамические свойства
<?php
class Example {}
$obj = new Example();
$obj->dynamic = 'значение';
print_r(get_object_vars($obj));
?>
Array
(
    [dynamic] => значение
)

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

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

<?php
class Example {
    public $a = 1;
}
print_r(get_class_vars('Example'));
?>
Array
(
    [a] => 1
)
ReflectionClass

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

<?php
class Example {
    private $c = 3;
}
$ref = new ReflectionClass('Example');
$props = $ref->getProperties();
foreach ($props as $prop) {
    echo $prop->getName() . "\n";
}
?>
c

Проверяет существование свойства у объекта или класса, не возвращая значений.

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

Get object vars в Python

Используется функция vars() или атрибут __dict__. Они возвращают все атрибуты экземпляра, включая приватные (с искаженными именами).

class Example:
    def __init__(self):
        self.a = 1
        self._b = 2
obj = Example()
print(vars(obj))
{'a': 1, '_b': 2}

Get object vars в Javascript

Метод Object.getOwnPropertyNames() возвращает все имена свойств объекта, включая неперечисляемые. Для значений используется Object.values().

const obj = { a: 1, b: 2 };
console.log(Object.getOwnPropertyNames(obj));
console.log(Object.values(obj));
['a', 'b']
[1, 2]

Get object vars в MySQL

Прямого аналога нет. Для описания структуры таблицы используется оператор DESCRIBE.

DESCRIBE table_name;

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

Передача не объекта

Функция ожидает объект. Передача другого типа данных вызывает предупреждение.

<?php
$result = get_object_vars('строка');
var_dump($result);
?>
Warning: get_object_vars() expects parameter 1 to be object, string given
NULL
Ожидание приватных свойств извне

При вызове извне класса функция возвращает только публичные свойства.

<?php
class Example {
    private $secret = 'скрыто';
}
$obj = new Example();
print_r(get_object_vars($obj));
?>
Array
(
)
Неучтенный контекст видимости

Внутри метода класса возвращаются все свойства. Вне класса – только публичные.

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

В PHP 8.0 существенных изменений в поведение функции не вносилось. Важно отметить, что в PHP 8 усилилась строгость типов, но сигнатура функции осталась прежней. В более ранних версиях, например, до PHP 7.4, функция также корректно работала с динамическими свойствами, которые теперь устарели в PHP 8.2 и выше.

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

Рекурсивное применение к объектам
Пример php
<?php
class Inner {
    public $val = 'внутренний';
}
class Outer {
    public $inner;
    public function __construct() {
        $this->inner = new Inner();
    }
}
function extractAllProperties($obj) {
    $vars = get_object_vars($obj);
    foreach ($vars as &$value) {
        if (is_object($value)) {
            $value = extractAllProperties($value);
        }
    }
    return $vars;
}
$obj = new Outer();
print_r(extractAllProperties($obj));
?>
Array
(
    [inner] => Array
        (
            [val] => внутренний
        )
)
Сравнение объектов
Пример php
<?php
class Product {
    public $id;
    public $name;
    public function __construct($id, $name) {
        $this->id = $id;
        $this->name = $name;
    }
}
$p1 = new Product(1, 'Товар A');
$p2 = new Product(1, 'Товар A');
$p3 = new Product(2, 'Товар B');
var_dump(get_object_vars($p1) == get_object_vars($p2));
var_dump(get_object_vars($p1) == get_object_vars($p3));
?>
bool(true)
bool(false)
Использование с магическими методами __get и __set
Пример php
<?php
class MagicExample {
    private $data = [];
    public function __set($name, $value) {
        $this->data[$name] = $value;
    }
    public function __get($name) {
        return $this->data[$name] ?? null;
    }
}
$obj = new MagicExample();
$obj->custom = 'магическое';
print_r(get_object_vars($obj));
?>
Array
(
    [data] => Array
        (
            [custom] => магическое
        )
)
Фильтрация свойств по типу
Пример php
<?php
class FilterExample {
    public $int = 123;
    public $str = 'текст';
    public $arr = [1, 2];
}
$obj = new FilterExample();
$vars = get_object_vars($obj);
$strings = array_filter($vars, function($v) {
    return is_string($v);
});
print_r($strings);
?>
Array
(
    [str] => текст
)

PHP get_object_vars function comments

En
Get object vars Gets the properties of the given object