с новым массивом я делаю это:
$aVal = array();
$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";
Есть ли подобный синтаксис для объекта
(object)$oVal = "";
$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
$var = (object) (boolean) (string) (int) (array) new StdClass;
Вы знаете, просто чтобы быть в безопасности.Arrays - How to define an empty object in PHP
. Не имеет ничего общего с массивамиОтветы:
Комментарий в ручном подытоживает лучше всего:
источник
stdClass
в своей голове как «стандартный класс»new \stdClass();
PHP Namespace DocstdClass()
из этого словаAIDS
?Стандартный способ создания «пустого» объекта:
Но с PHP> = 5.4 я лично предпочитаю использовать:
Это короче, и я лично считаю это более понятным, потому что stdClass может вводить в заблуждение начинающих программистов (то есть «Эй, я хочу объект, а не класс!» ...).
То же самое с PHP <5.4:
(object)[]
эквивалентноnew stdClass()
.Смотрите руководство по PHP ( здесь ):
и ( здесь ):
Однако помните, что empty ($ oVal) возвращает false , как сказал @PaulP:
Что касается вашего примера, если вы напишите:
PHP создает следующее предупреждение, неявно создавая свойство
key1
(сам объект)Это может быть проблемой, если ваша конфигурация (см. Уровень отчетов об ошибках ) показывает это предупреждение браузеру. Это еще одна тема, но быстрый и грязный подход мог бы использовать оператор контроля ошибок (@), чтобы игнорировать предупреждение:
источник
stdClass
делает.stdClass
делает. Я использовалstdClass
код, который отвечает на вопрос. Извините, но я не создаю новую проблему, это было мое личное мнение (как я писал).(object) []
Я хочу отметить, что в PHP нет такой вещи, как пустой объект в смысле:
но, конечно, $ obj будет пустым.
С другой стороны, пустой массив означает пустой в обоих случаях
Цитата из функции changelog пуста
источник
php.net сказал, что лучше:
источник
Мне нравится, как легко создавать объекты анонимного типа в JavaScript:
Поэтому я всегда стараюсь писать такие объекты на PHP, как это делает javascript :
Но поскольку это в основном массив, вы не можете делать такие вещи, как присваивать анонимные функции свойству, как это делает js:
Ну, вы можете сделать это, но IMO не практичен / чист:
Кроме того, используя этот синтакс, вы можете найти несколько забавных сюрпризов , но он отлично работает в большинстве случаев.
источник
В дополнение к ответу зомбата, если вы продолжаете забывать
stdClass
Теперь вы можете сделать:
источник
Вы можете использовать
new stdClass()
(что рекомендуется):Или вы можете преобразовать пустой массив в объект, который создает новый пустой экземпляр встроенного класса stdClass:
Или вы можете преобразовать
null
значение в объект, который создает новый пустой экземпляр встроенного класса stdClass:источник
чтобы получить доступ к данным в stdClass аналогично тому, как вы делаете это с помощью асоциативного массива, просто используйте синтаксис {$ var}.
источник
Как уже отмечали другие, вы можете использовать stdClass. Однако я думаю, что это чище без (), вот так:
Однако, исходя из этого вопроса, кажется, что вы действительно хотите иметь возможность добавлять свойства к объекту на лету. Вам не нужно использовать stdClass для этого, хотя вы можете. На самом деле вы можете использовать любой класс. Просто создайте экземпляр объекта любого класса и начните устанавливать свойства. Мне нравится создавать свой собственный класс, имя которого просто o, с некоторыми базовыми расширенными функциональными возможностями, которые мне нравится использовать в этих случаях, и которые отлично подходят для расширения из других классов. По сути, это мой собственный базовый класс объектов. Мне также нравится иметь функцию с именем o (). Вот так:
Если вам не нравится иметь свой собственный базовый тип объекта, вы можете просто заставить o () вернуть новый stdClass. Одним из преимуществ является то, что o легче запомнить, чем stdClass, и он короче, независимо от того, используете ли вы его в качестве имени класса, имени функции или того и другого. Даже если у вас нет кода внутри вашего класса o, его все же легче запомнить, чем неуклюжий заглавный и названный stdClass (который может вызвать идею «класса болезней, передающихся половым путем»). Если вы настроите класс o, вы можете найти использование функции o () вместо синтаксиса конструктора. Это нормальная функция, которая возвращает значение, которое менее ограничено, чем конструктор. Например, имя функции может быть передано в виде строки функции, которая принимает вызываемый параметр. Функция также поддерживает связывание. Таким образом, вы можете сделать что-то вроде:
Это отличное начало для базового «языка» для создания других языковых уровней, когда верхний уровень записывается в полных внутренних DSL. Это похоже на стиль разработки LISP, и PHP поддерживает его лучше, чем большинство людей понимают. Я понимаю, что это немного касательно вопроса, но вопрос касается того, что я считаю основой для полного использования возможностей PHP.
источник
Если вы хотите создать объект (как в javascript) с динамическими свойствами, без получения предупреждения о неопределенном свойстве.
источник
Вы также можете попробовать этот способ.
Вывод:
источник
Используйте универсальный объект и сопоставьте пары ключ-значение.
Или приведите массив в объект
источник
Если вы не хотите делать это:
Вы можете использовать один из следующих:
PHP> = 5.4
PHP <5.4
источник
Вот пример с итерацией:
источник
У вас есть эта плохая, но полезная техника:
источник
stdClass - это объект PHP по умолчанию. У stdClass нет свойств, методов или родительского элемента. Он не поддерживает магические методы и не реализует интерфейсы.
Когда вы приводите скаляр или массив как Object, вы получаете экземпляр stdClass. Вы можете использовать stdClass всякий раз, когда вам нужен экземпляр общего объекта.
stdClass не является базовым классом! Классы PHP не наследуются автоматически ни от одного класса. Все классы автономны, если они явно не расширяют другой класс. В этом отношении PHP отличается от многих объектно-ориентированных языков.
Вы не можете определить класс с именем 'stdClass' в вашем коде. Это имя уже используется системой. Вы можете определить класс с именем «Объект».
Вы можете определить класс, который расширяет stdClass, но вы не получите никакой выгоды, так как stdClass ничего не делает.
(проверено на PHP 5.2.8)
источник