Как определить пустой объект в PHP - PullRequest
336 голосов
/ 16 сентября 2009

с новым массивом я делаю это:

$aVal = array();

$aVal[key1][var1] = "something";
$aVal[key1][var2] = "something else";

Есть ли подобный синтаксис для объекта

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";

Ответы [ 15 ]

4 голосов
/ 27 августа 2014

Как уже отмечали другие, вы можете использовать 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.

3 голосов
/ 16 июня 2017

Используйте общий объект и сопоставьте ему пары значений ключей.

$oVal = new stdClass();
$oVal->key = $value

Или приведите массив в объект

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;
3 голосов
/ 31 января 2017

Если вы не хотите этого делать:

$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 </strong>

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);
2 голосов
/ 03 февраля 2017

Вот пример с итерацией:

<?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; ?>
0 голосов
/ 13 июня 2014

У вас плохая, но полезная техника:

$var = json_decode(json_encode([]), FALSE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...