Создание анонимных объектов в php
Вопрос
Как мы знаем, создавать анонимные объекты в JavaScript очень просто, как в приведенном ниже коде:
родовое словоВывод:
родовое словоМожно ли применить эту же технику в случае PHP?Можем ли мы создавать анонимные объекты в PHP?
Решение
Прошло несколько лет, но я думаю, мне нужно обновлять информацию!
В php-7 можно создавать анонимные классы, поэтому вы можете делать что-то вроде этого:
родовое словоПодробнее об этом можно прочитать в RFC (принято): https://wiki.php.net/rfc/анонимные_классы
Но я не знаю, насколько он похож на Javscript, поэтому могут быть некоторые различия между анонимными классами в javascript и php.
< sizesEdit:
Судя по опубликованным комментариям, вот ссылка на руководство: http:// php.net / manual / en / language.oop5.anonymous.php
Другие советы
«Анонимный» - неправильная терминология, когда речь идет об объектах. Лучше было бы сказать «объект анонимного типа », но это не относится к PHP.
Все объекты в PHP имеют класс. Класс "по умолчанию" - stdClass
, и вы можете создавать его объекты таким образом :
Вы также можете воспользоваться преобразование массива в объект для более удобного синтаксиса:
родовое словоОднако имейте в виду, что приведение массива к объекту может дать "интересные" результаты для тех ключей массива, которые не являются допустимыми именами переменных PHP - например, вот мой ответ, который показывает, что происходит, когда ключи начинаются с цифр.
Да, это возможно!Используя этот простой класс анонимного объекта PHP .Как это работает:
родовое слово Конечно, этот объект является экземпляром класса AnObj
, поэтому на самом деле он не анонимен, но позволяет определять методы на лету, как это делает JavaScript.
До недавнего времени я создавал объекты «на лету» именно так.
родовое словоЗатем:
родовое словоНо теперь я выбираю:
родовое словоТогда как раньше:
родовое словоКонечно, если вы уже знаете свойства и значения, вы можете установить их внутри, как уже упоминалось:
родовое словоNB: я не знаю, на каких версиях PHP это работает, поэтому вам следует помнить об этом.Но я думаю, что первый подход (который также является коротким, если нет свойств, которые нужно установить при построении) должен работать для всех версий, в которых есть json_encode / json_decode
Если вы хотите имитировать JavaScript, вы можете создать класс Object
и, таким образом, получить такое же поведение.Конечно, это уже не совсем анонимно, но это будет работать.
Будет выведен элемент 2 .Это было украдено из комментария к PHP: классы и объекты .
Преобразовать массив в объект:
родовое словоЕсли вы хотите создать объект (например, в javascript) с динамическими свойствами, не получая предупреждения о неопределенном свойстве, когда вы не установили значение для свойства
родовое словоМожно ли применить эту же технику в случае PHP?
Нет - поскольку javascript использует прототипы / прямое объявление объектов - в PHP (и многих других объектно-ориентированных языках) объект может быть создан только из класса.
Итак, возникает вопрос - можете ли вы создать анонимный класс.
И снова ответ - нет - как бы вы создали экземпляр класса, не имея возможности ссылаться на него?
Для тех, кто хочет рекурсивный объект:
родовое словоЕще несколько примеров из документации PHP:
родовое слово$ obj1 и $ obj3 одного типа, но $ obj1!== $ obj3.Кроме того, все три будут json_encode () для простого объекта JS {}:
родовое словоВыводы:
родовое слово