Есть ли разница между get_object_vars($obj)
и (array) $obj
?get_object_vars() против литья в массив
Оба, кажется, возвращают общедоступные свойства объекта.
Что лучше?
Есть ли разница между get_object_vars($obj)
и (array) $obj
?get_object_vars() против литья в массив
Оба, кажется, возвращают общедоступные свойства объекта.
Что лучше?
Это не совсем так.
get_object_vars
простор-чувствительный и возвращает все видимое свойства за исключением статических свойств независимо от их visbility. Если вы вызываете это из-за пределов своего класса, вы будете получать только публичные члены; из производного класса вы получите защищенных и открытых членов; и из самого класса вы получите всех участников. Клавиши массива представляют имена свойств и не искажаются.
(array)
cast возвращает, по крайней мере, на PHP 5.3.0, все свойства объекта, общедоступные и другие. Имя свойства подогнаны в соответствии с уровнем защиты:
public
: не подогнаны, идентичные имена свойствprotected
: имя ключа для недвижимости начинается с *
private
: имя ключа для недвижимости начинается с наименования классаДля получения дополнительной информации см. casting to an array.
Надеюсь, вы сможете лучше понять, какой из них наиболее подходит для вашей ситуации.
Функция get_object_vars()
- это более четкий способ достижения желаемого эффекта. Хотя приведение его в массив также является решением, это поведение может измениться в более поздних версиях PHP.
Я не знаю, существует ли реальная разница между двумя методами, но приведенные выше аргументы приведут меня к использованию функции.
Почему массив должен быть менее надежным в своем поведении, чем функция? У вас есть документация, поддерживающая его? – zneak
Лучше то, что вам действительно нужно. get_object_vars() не показывает закрытых и защищенных членов. См. Пример this comment в руководстве.
Чтобы добавить для '(array)' cast, '*' для protected и * classname * для закрытых членов будет заключен в null-байты ('\ x00'), поэтому строго это' \ x00 * \ x00 'для защищенных членов, а также для частных членов:' \ x00className \ x00'. Связано: ** [Array to Object и Object to Array в PHP - интересное поведение] (http://stackoverflow.com/questions/6325447/array-to-object-and-object-to-array-in-php-interesting -behaviour/6325631 # 6325631) ** – hakre
Еще одно отличие (по крайней мере, в PHP 5): с 'get_object_vars' ключи будут переданы int, если они являются числами, где casting возвращает строковые индексы: https://3v4l.org/ 2Wb9j – Sherbrow