с новым массивом я делаю это:
$aVal = array(); $aVal[key1][var1] = "something"; $aVal[key1][var2] = "something else";
Есть ли аналогичный синтаксис для объекта
(object)$oVal = ""; $oVal->key1->var1 = "something"; $oVal->key1->var2 = "something else";
$x = new stdClass();
Комментарий в руководстве подводит итог:
stdClass – это объект PHP по умолчанию. У stdClass нет свойств, методов или родителя. Он не поддерживает магические методы и не реализует интерфейсов.
Когда вы бросаете скаляр или массив в Object, вы получаете экземпляр stdClass. Вы можете использовать stdClass всякий раз, когда вам нужен экземпляр универсального объекта.
Стандартный способ создания «пустого» объекта:
$oVal = new stdClass();
Но, с PHP> = 5.4, я лично предпочитаю использовать:
$oVal = (object)[];
Это короче, и я лично считаю его более ясным, потому что stdClass может вводить в заблуждение начинающих программистов (т. Е. «Эй, я хочу объект, а не класс!» …).
То же самое с PHP <5.4:
$oVal = (object) array();
(object)[]
эквивалентен new stdClass()
.
См. Руководство по PHP ( здесь ):
stdClass : Создано методом typecasting для объекта.
и ( здесь ):
Если объект преобразован в объект, он не изменяется. Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass .
Однако помните, что пустой ($ oVal) возвращает false , поскольку @PaulP сказал:
Объекты без свойств больше не считаются пустыми.
Что касается вашего примера, если вы пишете:
$oVal = new stdClass(); $oVal->key1->var1 = "something"; // PHP creates a Warning here $oVal->key1->var2 = "something else";
PHP создает следующее Предупреждение, неявно создающее свойство key1
(сам объект)
Предупреждение: создание объекта по умолчанию из пустого значения
Это может быть проблемой, если ваша конфигурация (см. Уровень отчетов об ошибках ) показывает это предупреждение в браузере. Это еще одна целая тема, но быстрый и грязный подход может использовать оператор управления ошибками (@), чтобы игнорировать предупреждение:
$oVal = new stdClass(); @$oVal->key1->var1 = "something"; // the warning is ignored thanks to @ $oVal->key1->var2 = "something else";
Я хочу отметить, что в PHP нет такой вещи, как пустой объект в смысле:
$obj = new stdClass(); var_dump(empty($obj)); // bool(false)
но, конечно, $ obj будет пустым.
С другой стороны, пустой массив означает пустое в обоих случаях
$arr = array(); var_dump(empty($arr));
Цитата из журнала изменений функции пустой
Объекты без свойств больше не считаются пустыми.
php.net сказал, что это лучше всего:
$new_empty_object = new stdClass();
Мне нравится, как легко создавать объекты анонимного типа в JavaScript:
//JavaScript var myObj = { foo: "Foo value", bar: "Bar value" }; console.log(myObj.foo); //Output: Foo value
Поэтому я всегда стараюсь писать такие объекты в PHP, как javascript :
//PHP >= 5.4 $myObj = (object) [ "foo" => "Foo value", "bar" => "Bar value" ]; //PHP < 5.4 $myObj = (object) array( "foo" => "Foo value", "bar" => "Bar value" ); echo $myObj->foo; //Output: Foo value
Но поскольку это в основном массив, вы не можете делать такие вещи, как присвоение анонимных функций свойству js:
//JavaScript var myObj = { foo: "Foo value", bar: function(greeting) { return greeting + " bar"; } }; console.log(myObj.bar("Hello")); //Output: Hello bar //PHP >= 5.4 $myObj = (object) [ "foo" => "Foo value", "bar" => function($greeting) { return $greeting . " bar"; } ]; var_dump($myObj->bar("Hello")); //Throw 'undefined function' error var_dump($myObj->bar); //Output: "object(Closure)"
Ну, вы можете это сделать, но ИМО не практична / чиста:
$barFunc = $myObj->bar; echo $barFunc("Hello"); //Output: Hello bar
Кроме того, используя этот синтаксис, вы можете найти некоторые забавные сюрпризы , но отлично работает в большинстве случаев.
В дополнение к ответу зомбата, если вы продолжаете забывать stdClass
function object(){ return new stdClass(); }
Теперь вы можете сделать:
$str=''; $array=array(); $object=object();
Вы можете использовать new stdClass()
(который рекомендуется):
$obj_a = new stdClass(); $obj_a->name = "John"; print_r($obj_a); // outputs: // stdClass Object ( [name] => John )
Или вы можете преобразовать пустой массив в объект, который создает новый пустой экземпляр встроенного класса stdClass:
$obj_b = (object) []; $obj_b->name = "John"; print_r($obj_b); // outputs: // stdClass Object ( [name] => John )
Или вы можете преобразовать null
значение в объект, который создает новый пустой экземпляр встроенного класса stdClass:
$obj_c = (object) null; $obj_c->name = "John"; print($obj_c); // outputs: // stdClass Object ( [name] => John )
для доступа к данным в stdClass аналогичным образом вы используете асоциальный массив, просто используйте синтаксис {$ var}.
$myObj = new stdClass; $myObj->Prop1 = "Something"; $myObj->Prop2 = "Something else"; // then to acces it directly echo $myObj->{'Prop1'}; echo $myObj->{'Prop2'}; // or what you may want echo $myObj->{$myStringVar};
Как указывали другие, вы можете использовать stdClass. Однако я думаю, что он чище без (), вот так:
$obj = new stdClass;
Однако, исходя из вопроса, кажется, что вы действительно хотите, чтобы иметь возможность добавлять свойства к объекту «на лету». Вам не нужно использовать stdClass для этого, хотя вы можете. Действительно, вы можете использовать любой класс. Просто создайте экземпляр объекта любого класса и начните устанавливать свойства. Мне нравится создавать свой собственный класс, чье имя просто o с некоторыми базовыми расширенными функциональными возможностями, которые я люблю использовать в этих случаях, и хорошо для распространения из других классов. В основном это мой собственный базовый класс объектов. Мне также нравится иметь функцию, просто называемую o (). Вот так:
class o { // some custom shared magic, constructor, properties, or methods here } function o() { return new o; }
Если вам не нравится иметь собственный тип базового объекта, вы можете просто вернуть o () новый stdClass. Одно из преимуществ заключается в том, что o легче запомнить, чем stdClass, и короче, независимо от того, используете ли вы его как имя класса, имя функции или и то, и другое. Даже если у вас нет кода внутри вашего класса o, его все же легче запомнить, чем неудобно заглавный и названный stdClass (который может вызвать идею «сексуально переданного класса болезни»). Если вы настроите класс o, вы можете найти использование функции o () вместо синтаксиса конструктора. Это нормальная функция, которая возвращает значение, которое меньше, чем конструктор. Например, имя функции может передаваться как строка функции, которая принимает вызываемый параметр. Функция также поддерживает цепочку. Таким образом, вы можете сделать что-то вроде: $ result = o ($ internal_value) -> some_operation_or_conversion_on_this_value ();
Это отличный старт для базового «языка» для создания других языковых слоев, когда верхний слой записывается в полные внутренние DSL. Это похоже на lisp-стиль разработки, и PHP поддерживает его лучше, чем большинство людей понимают. Я понимаю, что это немного касательно вопроса, но вопрос касается того, что я считаю основой для полного использования возможностей PHP.
Если вы хотите создать объект (например, в javascript) с динамическими свойствами, не получая предупреждение о неопределенном свойстве.
class stdClass { public function __construct(array $arguments = array()) { if (!empty($arguments)) { foreach ($arguments as $property => $argument) { if(is_numeric($property)): $this->{$argument} = null; else: $this->{$property} = $argument; endif; } } } public function __call($method, $arguments) { $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this). if (isset($this->{$method}) && is_callable($this->{$method})) { return call_user_func_array($this->{$method}, $arguments); } else { throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()"); } } public function __get($name){ if(property_exists($this, $name)): return $this->{$name}; else: return $this->{$name} = null; endif; } public function __set($name, $value) { $this->{$name} = $value; } } $obj1 = new stdClass(['property1','property2'=>'value']); //assign default property echo $obj1->property1;//null echo $obj1->property2;//value $obj2 = new stdClass();//without properties set echo $obj2->property1;//null
Вы также можете попробовать это.
<?php $obj = json_decode("{}"); var_dump($obj); ?>
Вывод:
object(stdClass)#1 (0) { }
Мы можем просто создать пустой объект с помощью этого метода:
$object = new ObjectClass();
Например:
class ObjectClass { // Something goes here } $object = new ObjectClass();
Теперь мы имеем переменную $object
которая является ObjectClass
но пустой. Обратите внимание, что если она содержит функцию __construct()
, то она может быть не пустой.
Я знаю, что это старый вопрос, но кажется, что некоторые люди забывают о конструкторах.
Если вы не хотите этого делать:
$myObj = new stdClass(); $myObj->key_1 = 'Hello'; $myObj->key_2 = 'Dolly';
Вы можете использовать одно из следующих действий:
PHP> = 5.4
$myObj = (object) [ 'key_1' => 'Hello', 'key_3' => 'Dolly', ];
PHP <5.4
$myObj = (object) array( 'key_1' => 'Hello', 'key_3' => 'Dolly', );
Вот пример с итерацией:
<?php $colors = (object)[]; $colors->red = "#F00"; $colors->slateblue = "#6A5ACD"; $colors->orange = "#FFA500"; foreach ($colors as $key => $value) : ?> <p style="background-color:<?= $value ?>"> <?= $key ?> -> <?= $value ?> </p> <?php endforeach; ?>
Используйте для него пары значений общего класса и карты.
$oVal = new stdClass(); $oVal->key = $value
Или нарисуйте массив в объект
$aVal = array( 'key'=>'value' ); $oVal = (object) $aVal;
У вас есть эта плохая, но полезная техника:
$var = json_decode(json_encode([]), FALSE);