Поддерживает ли PHP сокращенный синтаксис для объектов? - PullRequest
34 голосов
/ 18 января 2009

В JavaScript вы можете легко создавать объекты и массивы, например, так:

var aObject = { foo:'bla', bar:2 };
var anArray = ['foo', 'bar', 2];

Возможно ли подобное в PHP?
Я знаю, что вы можете легко создать массив, используя функцию массива, что едва ли более трудоемко, чем синтаксис javascript, но существует ли подобный синтаксис для создания объектов? Или мне просто использовать ассоциативные массивы?

$anArray = array('foo', 'bar', 2);
$anObjectLikeAssociativeArray = array('foo'=>'bla',
                                      'bar'=>2);

Итак, подведем итог:
Есть ли в PHP javascript для создания объектов или я должен просто использовать ассоциативные массивы?

Ответы [ 7 ]

44 голосов
/ 18 января 2009

Для простых объектов вы можете использовать синтаксис ассоциативного массива и приведение типа, чтобы получить объект:

<?php
$obj = (object)array('foo' => 'bar');
echo $obj->foo; // yields "bar"

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

40 голосов
/ 18 января 2009

Было предложено реализовать этот синтаксис массива . Но он был отклонен.


Обновление Сокращенный синтаксис для массивов был повторно обсужден, принят и теперь доступен для выпуска с PHP 5.4 .

Но для объектов по-прежнему нет сокращений. Вам, вероятно, нужно явно привести к object :

$obj = (object) ['foo'=>'bla', 'bar'=>2];
10 голосов
/ 21 сентября 2011

Начиная с PHP 5.4, вы можете сделать это:

$array = ['foo'=>'bla', 'bar'=>2];

Это не намного короче, но вы оцените это, если вам нужно использовать много жестко закодированных вложенных массивов (что не так уж и редко).

Если вам нужен объект, вам все равно нужно привести каждый массив:

$object = (object) ['foo'=>'bla', 'bar'=>2];
7 голосов
/ 11 октября 2012

Согласно новым синтаксисам PHP,

Вы можете использовать

$array = [1,2,3];

А для ассоциативных массивов

$array = ['name'=>'Sanket','age'=>22];

Для объектов вы можете указать массив для объекта

$object = (object)['name'=>'Sanket','age'=>22];
3 голосов
/ 18 января 2009

В PHP нет сокращения объекта, но вы можете использовать точный синтаксис Javascript при условии, что вы используете функции json_encode и json_decode .

2 голосов
/ 29 октября 2009

Метод, предоставленный crescentfresh, работает очень хорошо, но у меня возникла проблема с добавлением дополнительных свойств к объекту. Чтобы обойти эту проблему, я реализовал Sp ArrayObject.

class ObjectParameter extends ArrayObject  {
     public function  __set($name,  $value) {
        $this->$name = $value;
    }

    public function  __get($name) {
      return $this[$name];
    }
}

//creating a new Array object
$objParam = new ObjectParameter;
//adding properties
$objParam->strName = "foo";
//print name
printf($objParam->strName);
//add another property
$objParam->strUser = "bar";

С этим подходом можно многое сделать, чтобы упростить создание объектов даже из массивов, надеюсь, это поможет.

1 голос
/ 05 января 2011

Как идея json_decode, написал это:

function a($json) {
 return json_decode($json, true); //turn true to false to use objets instead of associative arrays
}

//EXAMPLE
$cat = 'meow';

$array = a('{"value1":"Tester", 
  "value2":"'.$cat.'", 
  "value3":{"valueX":"Hi"}}');

print_r($array);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...