Текстовый объект PHP

В PHP я могу легко задавать литералы массивов:

array( array("name" => "John", "hobby" => "hiking"), array("name" => "Jane", "hobby" => "dancing"), ... ) 

Но что, если я хочу массив объектов? Как я могу указать литерал объекта в PHP? Т.е. в javascript это будет:

 [ {name: "John", hobby: "hiking"}, {name: "Jane", hobby: "dancing"} ] 

Как отметил BoltClock, в PHP нет объектного литерала, но вы можете сделать это простым типом массива массивов объектам:

 $testArray = array( (object)array("name" => "John", "hobby" => "hiking"), (object)array("name" => "Jane", "hobby" => "dancing") ); echo "Person 1 Name: ".$testArray[0]->name; echo "Person 2 Hobby: ".$testArray[1]->hobby; 

Начиная с PHP 5.4 вы также можете использовать синтаксис короткого массива:

 $json = [ (object) ['name' => 'John', 'hobby' => 'hiking'], (object) ['name' => 'Jane', 'hobby' => 'dancing'], ]; 

Как отмечали другие, в PHP нет объектного литерала, но вы можете «подделать» его, наведя массив на объект.

С PHP 5.4 это еще более кратким, потому что массивы могут быть объявлены с квадратными скобками . Например:

 $obj = (object)[ "foo" => "bar", "bar" => "foo", ]; 

Это даст вам объект с свойствами «foo» и «bar». Тем не менее, я не думаю, что это действительно дает много преимуществ перед использованием ассоциативных массивов. Это просто синтаксическая разница.

Подумайте об обретении уникальности и «вкуса» всех языков, которые вы используете. В JavaScript объектные литералы повсюду. В PHP ассоциативные массивы функционально совпадают с объектными литералами JavaScript, которые легко создавать и хорошо понимаются другими программистами PHP. Я думаю, вам лучше обнять этот «аромат», чем пытаться заставить его чувствовать себя как буквенный синтаксис объекта JavaScript.

Другой способ – использовать магический метод __set_state() :

 $object = stdClass::__set_state (array ( 'height' => -10924, 'color' => 'purple', 'happy' => false, 'video-yt' => 'AgcnU74Ld8Q' )); 

Еще один пример метода __set_state (), откуда он исходит и как он должен использоваться.

В PHP у вас есть ro, создающий экземпляр, прежде чем вы сможете использовать класс. Конечно, вы можете поместить экземпляры в массив позже.

Если вы хотите определить модули в шаблоне объектного литерала «как JavaScript», вы можете сделать что-то вроде этого:

 $object = (object) [ 'config' => (object) [ 'username' => 'Rob Bennet', 'email' => 'rob@madebyhoundstooth.com' ], 'hello' => function() use(&$object) { return "Hello " . $object->config->username . ". "; }, 'emailDisplay' => function() use(&$object) { return "Your email address is " . $object->config->email; }, 'init' => function($options) use(&$object) { $object->config = $options; $doUsername = $object->hello; $doEmail = $object->emailDisplay; return $doUsername() . $doEmail(); } ]; $sayMyInfo = $object->init; echo $sayMyInfo((object) [ 'username' => 'Logan', 'email' => 'wolverine@xmen.com' ]); по $object = (object) [ 'config' => (object) [ 'username' => 'Rob Bennet', 'email' => 'rob@madebyhoundstooth.com' ], 'hello' => function() use(&$object) { return "Hello " . $object->config->username . ". "; }, 'emailDisplay' => function() use(&$object) { return "Your email address is " . $object->config->email; }, 'init' => function($options) use(&$object) { $object->config = $options; $doUsername = $object->hello; $doEmail = $object->emailDisplay; return $doUsername() . $doEmail(); } ]; $sayMyInfo = $object->init; echo $sayMyInfo((object) [ 'username' => 'Logan', 'email' => 'wolverine@xmen.com' ]); 

В этом типе модульного сценария я обычно выбираю шаблон фасада , мне просто нравится писать мои звонки:

 Module::action()->item; 

или

 Post::get()->title; 

Ни один из этих шаблонов не позволяет легко (или даже иногда иногда) тестировать. Но это просто доказательство концепции. Технически «нет» в PHP нет объектного литерала, но если вы используете синтаксис JavaScript (который я больше, чем PHP), вы можете подделать его и сделать это. Как вы можете видеть, в PHP это намного беспорядочно, чем в JavaScript.

Мой путь к объектным литералам в стиле JavaScript в PHP выглядит следующим образом:

Сначала я создаю ассоциативный массив следующим образом:

 $test = array( 'name' => "test", 'exists' => true ); 

Тогда я легко сделаю объект таким:

 $test = (object)$test; 

Теперь вы можете проверить это:

 echo gettype($test); // "object" echo $test->name; // "test" 

Хотя кастинг как объект (объект) отлично работает на одном иерархическом уровне, он не углубляется. Другими словами, если мы хотим объекты на каждом уровне, нам нужно будет сделать что-то вроде:

 $foods = (object)[ "fruits" => (object)["apple" => 1, "banana" => 2, "cherry" => 3], "vegetables" => (object)["asparagus" => 4, "broccoli" => 5, "carrot" => 6] ]; 

Однако вместо того, чтобы выполнять множественное кастинг как объекты, мы можем обернуть все это в json_encode и json_decode следующим образом:

 $foods = json_decode(json_encode([ "fruits" => ["apple" => 1, "banana" => 2, "cherry" => 3], "vegetables" => ["asparagus" => 4, "broccoli" => 5, "carrot" => 6] ])); 

Это гарантирует, что это объект на самом глубоком уровне.