Подтвердить что ты не робот

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

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

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

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

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

Ответ 1

Как упоминалось в 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;

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 5

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

Ответ 6

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

$object = (object) [
    'config' => (object) [
        'username' => 'Rob Bennet',
        'email' => '[email protected]'
    ],

    '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' => '[email protected]'
]);

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

Module::action()->item;

или

Post::get()->title;

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

Ответ 7

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

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

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

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

$test = (object)$test;

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

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

Ответ 8

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

$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]
]));

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