Есть ли в PHP краткий синтаксис для объектов?

В 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, подобный созданию объектов, или я должен просто использовать ассоциативные массивы?


person Pim Jager    schedule 18.01.2009    source источник
comment
Не то чтобы я в курсе.. А зачем тебе? Javascript настолько ограничен в сравнении? Объекты должны быть описаны правильно, с охватом, намеками и т. д.   -  person DreamWerx    schedule 18.01.2009
comment
есть ли шанс, что вы можете изменить принятый ответ на этот вопрос? ответ на этот вопрос изменился за последние 6 лет. :)   -  person Kip    schedule 19.07.2015
comment
*в сокращении всегда одно слово.   -  person GeneC    schedule 13.05.2021


Ответы (7)


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

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

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

person Crescent Fresh    schedule 18.01.2009
comment
Хм, хорошо, я вижу некоторые ситуации, в которых это можно использовать, спасибо! - person Sander Versluys; 18.01.2009
comment
Да, в таком случае я мог бы также использовать обычный ассоциативный массив. - person Pim Jager; 19.01.2009
comment
$goose->foo намного красивее, чем $goose['foo']. ∴ полезно. - person RyanM; 25.09.2012
comment
работать с объектами проще, потому что если у вас есть сложная структура объектов, массивов и карт, вы можете перейти от чего-то вроде этого $group["id123abc"]["people"][0]["name"] к этому $group["id123abc"]->people[0]->name. Это облегчает понимание разницы между массивом, картой и объектом или структурой. - person santiago arizti; 29.07.2019

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


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

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

$obj = (object) ['foo'=>'bla', 'bar'=>2];
person Gumbo    schedule 18.01.2009
comment
Это реализовано в PHP 5.4. - person Tatu Ulmanen; 13.10.2011
comment
@Gumbo, в синтаксисе короткого массива используется =>, а не :. Отредактировал ответ для вас. :) - person salathe; 13.10.2011
comment
Интересно, будет ли когда-нибудь реализована сокращенная запись для объектов? Я использую stdClasses все время, но они кажутся такими неуклюжими по сравнению с литералами объектов javascript. - person Mahn; 22.08.2012
comment
Этот метод не работает в объявлении переменной класса. Например protected $test = (object) ['prop'=>'val']; не работает. - person Andy Fleming; 09.02.2014
comment
Да, этот метод теперь работает, но все же было бы неплохо иметь $obj = {'foo'=>'bla'} - person Phil Tune; 21.12.2017
comment
Существует неактивный RFC от 2011 года для сокращенного синтаксиса объекта. - person bit2shift; 24.12.2017

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

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

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

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

$object = (object) ['foo'=>'bla', 'bar'=>2];
person Matthew    schedule 20.09.2011

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

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

$array = [1,2,3];

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

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

Для объектов вы можете привести массив к объекту

$object = (object)['name'=>'Sanket','age'=>22];
person Sanket Sahu    schedule 11.10.2012

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

person Justin Poliey    schedule 18.01.2009
comment
Интересная идея, но разве это не откладывает синтаксический анализ до времени выполнения? Когда это будет иметь преимущество перед приведением массива с (object)? - person ToolmakerSteve; 07.03.2019

Метод, предоставленный crescentfresh, работает очень хорошо, но у меня возникла проблема с добавлением дополнительных свойств к объекту. чтобы обойти эту проблему, я реализовал spl 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";

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

person Ronald Conco    schedule 29.10.2009

Как и идея 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);
person James Hornitzky    schedule 05.01.2011