Как определить пустой объект в PHP

318

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

$aVal = array();

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

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

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
  • 12
    $var = (object) (boolean) (string) (int) (array) new StdClass; Вы знаете, просто чтобы быть в безопасности.
  • 1
    Google проиндексировал этот заголовок вопроса как: Arrays - How to define an empty object in PHP . Не имеет ничего общего с массивами
Теги:
object

16 ответов

731
Лучший ответ
$x = new stdClass();

A комментарий в руководстве подводит итог:

stdClass - это объект PHP по умолчанию. У stdClass нет свойств, методов или Родитель. Он не поддерживает магию методы и не реализует интерфейсов.

При сканировании или массиве Объект, вы получаете экземпляр StdClass. Вы можете использовать stdClass когда вам нужен общий объект экземпляр.

  • 28
    Я бы проголосовал несколько раз, если бы мог, так как я продолжаю смотреть на этот ответ снова и снова, чтобы напомнить себе о stdClass .
  • 57
    Легко запомнить; просто подумай о СПИДе и все, теперь ты никогда не сможешь забыть, даже если попробуешь.
Показать ещё 9 комментариев
69

Стандартный способ создания "пустого" объекта:

$oVal = new stdClass();

Но, с PHP >= 5.4, я лично предпочитаю использовать:

$oVal = (object)[];

Это короче, и я лично считаю его более ясным, потому что stdClass может вводить в заблуждение начинающих программистов (т.е. "Эй, я хочу объект, а не класс!"...).

То же самое с PHP < 5.4:

$oVal = (object) array();

(object)[] эквивалентен new stdClass().

См. руководство по PHP (здесь):

stdClass. Создается при помощи метода typecasting для объекта.

и (здесь):

Если объект преобразуется в объект, он не изменяется. Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса stdClass.


Однако помните, что empty ($ oVal) возвращает false, поскольку @PaulP сказал:

Объекты без свойств больше не считаются пустыми.

Относительно вашего примера, если вы пишете:

$oVal = new stdClass();
$oVal->key1->var1 = "something"; // PHP creates  a Warning here
$oVal->key1->var2 = "something else";

PHP создает следующее Предупреждение, неявно создающее свойство key1 (сам объект)

Предупреждение: создание объекта по умолчанию из пустого значения

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

$oVal = new stdClass();
@$oVal->key1->var1 = "something"; // the warning is ignored thanks to @
$oVal->key1->var2 = "something else";
  • 2
    Вместо того, чтобы решить проблему, вы создаете новую. Проблема, которая требует решения, состоит в том, что люди должны знать, что делает stdClass .
  • 2
    Я написал, что делает stdClass . Я использовал stdClass в коде, который отвечает на вопрос. Извините, но я не создаю новую проблему, это было мое личное мнение (как я писал).
Показать ещё 5 комментариев
31

Я хочу указать, что в PHP нет такой вещи, как пустой объект в смысле:

$obj = new stdClass();
var_dump(empty($obj)); // bool(false)

но, конечно, $obj будет пустым.

С другой стороны, пустой массив пуст в обоих случаях

$arr = array();
var_dump(empty($arr));

Цитата из функции changelog empty

Объекты без свойств больше не считаются пустыми.

16

php.net сказал, что это лучше всего:

$new_empty_object = new stdClass();
  • 0
    Да, это точно рекомендуемый способ.
10

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

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: "Bar value"
};
console.log(myObj.foo); //Output: Foo value

Поэтому я всегда стараюсь писать такие объекты на PHP, как javascript:

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => "Bar value"
];

//PHP < 5.4
$myObj = (object) array(
    "foo" => "Foo value",
    "bar" => "Bar value"
);

echo $myObj->foo; //Output: Foo value

Но поскольку это в основном массив, вы не можете делать такие вещи, как назначение анонимных функций для свойства, подобного js:

//JavaScript
var myObj = {
    foo: "Foo value",
    bar: function(greeting) {
        return greeting + " bar";
    }
};
console.log(myObj.bar("Hello")); //Output: Hello bar

//PHP >= 5.4
$myObj = (object) [
    "foo" => "Foo value",
    "bar" => function($greeting) {
        return $greeting . " bar";
    }
];
var_dump($myObj->bar("Hello")); //Throw 'undefined function' error
var_dump($myObj->bar); //Output: "object(Closure)"

Ну, вы можете это сделать, но IMO не практично/чисто:

$barFunc = $myObj->bar;
echo $barFunc("Hello"); //Output: Hello bar

Кроме того, используя этот синтаксис, вы можете найти забавные сюрпризы, но отлично работает в большинстве случаев.

9

В дополнение к зомбату ответ, если вы продолжаете забывать stdClass

   function object(){

        return new stdClass();

    }

Теперь вы можете сделать:

$str='';
$array=array();
$object=object();
5

Вы также можете попробовать этот путь.

<?php
     $obj = json_decode("{}"); 
     var_dump($obj);
?>

Вывод:

object(stdClass)#1 (0) { }
5

Вы можете использовать new stdClass() (который рекомендуется):

$obj_a = new stdClass();
$obj_a->name = "John";
print_r($obj_a);

// outputs:
// stdClass Object ( [name] => John ) 

Или вы можете преобразовать пустой массив в объект, который создает новый пустой экземпляр встроенного класса stdClass:

$obj_b = (object) [];
$obj_b->name = "John";
print_r($obj_b);

// outputs: 
// stdClass Object ( [name] => John )  

Или вы можете преобразовать значение null в объект, который создает новый пустой экземпляр встроенного класса stdClass:

$obj_c = (object) null;
$obj_c->name = "John";
print($obj_c);

// outputs:
// stdClass Object ( [name] => John ) 
5

для доступа к данным в stdClass аналогичным образом с асоциальным массивом просто используйте синтаксис {$ var}.

$myObj = new stdClass;
$myObj->Prop1 = "Something";
$myObj->Prop2 = "Something else";

// then to acces it directly

echo $myObj->{'Prop1'};
echo $myObj->{'Prop2'};

// or what you may want

echo $myObj->{$myStringVar};
4

Если вы хотите создать объект (например, в javascript) с динамическими свойствами, не получая предупреждение о свойстве undefined.

class stdClass {

public function __construct(array $arguments = array()) {
    if (!empty($arguments)) {
        foreach ($arguments as $property => $argument) {
            if(is_numeric($property)):
                $this->{$argument} = null;
            else:
                $this->{$property} = $argument;
            endif;
        }
    }
}

public function __call($method, $arguments) {
    $arguments = array_merge(array("stdObject" => $this), $arguments); // Note: method argument 0 will always referred to the main class ($this).
    if (isset($this->{$method}) && is_callable($this->{$method})) {
        return call_user_func_array($this->{$method}, $arguments);
    } else {
        throw new Exception("Fatal error: Call to undefined method stdObject::{$method}()");
    }
}

public function __get($name){
    if(property_exists($this, $name)):
        return $this->{$name};
    else:
        return $this->{$name} = null;
    endif;
}

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

}

$obj1 = new stdClass(['property1','property2'=>'value']); //assign default property
echo $obj1->property1;//null
echo $obj1->property2;//value

$obj2 = new stdClass();//without properties set
echo $obj2->property1;//null
4

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

Показать ещё 2 комментария
3

Мы можем просто создать пустой объект с помощью этого метода:

$object = new ObjectClass();

Например:

class ObjectClass
{
    // Something goes here
}

$object = new ObjectClass();

Теперь мы имеем переменную $object, которая является ObjectClass, но пустой. Обратите внимание, если он содержит функцию __construct(), тогда она может быть не пустой.

Я знаю, что это старый вопрос, но кажется, что некоторые люди забывают о конструкторах.

2

Используйте для него пары значений общего класса и карты.

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

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

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;
2

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

$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

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);
1

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

<?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

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

$var = json_decode(json_encode([]), FALSE);
  • 4
    плохо, плохо, очень плохо

Ещё вопросы

Сообщество Overcoder
Наверх
Меню