В данной статье будет описано какие способы есть для преобразования объекта в массив, подсчёт количества свойств объекта будет осуществляться уже после преобразования объекта в массив.
Функцию count не допустимо использовать с неитерируемыми объектами.
Предположим что есть некоторый объект, например $obj = new stdClass; теперь у этого объекта будут созданы несколько свойств $obj->a = 1;$obj->b = 2; таким образом у объекта $obj есть 2 свойства с именами a и b, значения которых соответственно 1 и 2. Если попробовать подсчитать количество свойств объекта функций count которая применяется для определения количества элемента массива(первого уровня, если не передан второй параметр) на PHP 5.4 результат будет целое число - 1. Этот результат не соответствует количеству свойств объекта $obj, их количество 2 а не 1. Таким образом count применяемый к объекту возвращает результат 1 для любого объекта(в том числе не имеющего свойств), то есть в данном случаи данная функция показывает что ей передан один единственный объект, поэтому именно такое применение этой функции не подходит для задачи подсчёта количества свойств объекта. А если ещё и попробовать применить функцию count аналогичным образом в PHP 7.2 то появится предупреждение(если включена соответствующая опция): Warning: count(): Parameter must be an array or an object that implements Countable in /var/www/blog.ivru.net/test.php on line 9, а аналогичное применение начиная с версии PHP 8.0 приведёт к появлению исключения TypeError. Добавлю что если передать функции count строку, число или булевое значение(не важно true или false) данная функция в перечисленных случаях вернёт значение 1. Функция count вернёт 0 если передать ей null. Для массивов функция count вернёт количество элементов(первого уровня вложенности если не передан второй параметр).
Преобразование экземплята объекта в массив
Предположим что инициализирован объект $obj из предыдущего примера, который по прежнему имеет 2 свойства(a и b). Для того чтобы преобразовать этот объект в массив есть как минимум следующие способы: 1) $ar = (array)$obj; 2) $ar = get_object_vars($obj); Оба этим способа доступны в старых и новых версиях PHP, при этом в их использовании применительно к объектам которые имеют private и protected свойства есть отличие, а именно первый способ вернёт как public, так и private и protected свойства, а второй(то-есть применение функции get_object_vars) вернёт только public свойства, а private и protected отбросит. При использовании первого способа public свойства объекта будут преобразованы в элементы массива с названиями ключей совпадающими с названиями соответствующих свойств, private свойства в элементы с ключами имеющими следующий формат: символ с кодом 0(есть можно получить к примеру вызовом функции chr(0);) за которым идёт название класса(с учётом регистра) за которым следует код символа с кодом 0 за которым следует название соответствующего свойства с учётом регистра. При применении первого способа к объекту содержащему protected свойства эти свойства будут преобразованы в элементы массива ключи которых соответственно имеют названия в следующем формате: в начале имени символ с нулевым кодом за которым идёт символ звёздочка(его код 42), за ним идёт символ с нулевым кодом за которым идёт название свойства с учётом регистра. Особенности преобразования объекта в массив первым способом продемонстрированы в следующем листинге.
Преобразование объектов в массив свойства которых содержат другие объекеты
Как первый так и второй способ преобразует в элементы массива только свойства первого уровня вложенности, то-есть если к примеру создать ещё одно свойство $obj->c = new stdClass; которое как видно является объектом, если теперь у него создать ещё пару свойств: $obj->c->x = 3;$obj->c->x = 4; то в результате преобразования объекта $obj к массиву(как первым так и вторым способом) полученный массив будет содержать элемент с ключом c значением которого будет объект содержащий 2 свойства(z и x).