Get object vars: примеры (PHP)
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
)Предоставляет расширенную информацию о классе, включая приватные и защищенные свойства. Требует больше ресурсов.
<?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
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
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)
<?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
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] => текст
)