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


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

$aVal = array();

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

Существует ли аналогичный синтаксис для объекта

(object)$oVal = "";

$oVal->key1->var1 = "something";
$oVal->key1->var2 = "something else";
 302
Author: Sumurai8, 2009-09-16

16 answers

$x = new stdClass();

Комментарий в руководстве подводит итог лучше всего:

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

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

 694
Author: zombat, 2009-09-17 06:07:49

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

$oVal = new stdClass();

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

$oVal = (object)[];

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

То же самое с PHP

$oVal = (object) array();

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

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

Стандартный класс: Создается путем приведения к объекту.

И ( здесь):

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


Однако помните, что пустой ($овальный) возвращает 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";
 69
Author: cgaldiolo, 2017-05-26 15:53:03

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

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

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

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

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

Цитата из функции журнала изменений пустая

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

 32
Author: PaulP, 2011-08-26 14:04:25

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

$new_empty_object = new stdClass();
 16
Author: HungryCoder, 2013-08-22 13:21:13

Мне нравится, как легко создавать объекты анонимного типа в 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

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

 10
Author: campsjos, 2017-05-23 12:26:35

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

   function object(){

        return new stdClass();

    }

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

$str='';
$array=array();
$object=object();
 8
Author: RafaSashi, 2015-01-30 12:27:37

Для доступа к данным в стандартном классе аналогично тому, как вы это делаете с ассоциативным массивом, просто используйте синтаксис {$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};
 5
Author: GCoro, 2015-02-20 09:04:44

Вы можете использовать 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
Author: Amr, 2015-12-14 00:57:56

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

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

Вывод:

object(stdClass)#1 (0) { }
 5
Author: Mukesh Jeengar, 2016-11-24 09:36:25

Как указывали другие, вы можете использовать stdClass. Однако я думаю, что это чище без (), вот так:

$obj = new stdClass;

Однако, исходя из вопроса, похоже, что вы действительно хотите иметь возможность добавлять свойства к объекту на лету. Вам не нужно использовать stdClass для этого, хотя вы можете. На самом деле вы можете использовать любой класс. Просто создайте экземпляр объекта любого класса и начните задавать свойства. Мне нравится создавать свой собственный класс, имя которого просто o с некоторыми базовыми расширенными функциональность, которую мне нравится использовать в этих случаях, и она хороша для расширения из других классов. В основном это мой собственный базовый класс объектов. Мне также нравится иметь функцию с простым именем o(). Вот так:

class o {
  // some custom shared magic, constructor, properties, or methods here
}

function o() {
  return new o;
}

Если вам не нравится иметь свой собственный базовый тип объекта, вы можете просто попросить o() вернуть новый стандартный класс. Одним из преимуществ является то, что o легче запомнить, чем stdClass, и он короче, независимо от того, используете ли вы его в качестве имени класса, имени функции или и того, и другого. Даже если у вас внутри нет никакого кода ваш класс o, его все еще легче запомнить, чем неуклюже написанный с заглавной буквы и названный stdClass (который может вызвать идею "класса заболеваний, передающихся половым путем"). Если вы настроите класс o, вы можете найти применение функции o() вместо синтаксиса конструктора. Это обычная функция, которая возвращает значение, которое менее ограничено, чем конструктор. Например, имя функции может быть передано в виде строки функции, которая принимает вызываемый параметр. Функция также поддерживает сковывание цепями. Таким образом, вы можете сделать что-то вроде: $результат= o($internal_value)->некоторая операция_ или_конверсия_он_это_значение();

Это отличное начало для базового "языка" для создания других языковых слоев, на которых верхний слой написан в полном объеме внутренних DSL. Это похоже на стиль разработки lisp, и PHP поддерживает его намного лучше, чем большинство людей понимают. Я понимаю, что это немного касается вопроса, но вопрос касается того, что я считаю основой для полного использования мощь PHP.

 4
Author: still_dreaming_1, 2015-03-29 23:11:31

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

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
Author: fredtma, 2015-11-26 15:02:34

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

$object = new ObjectClass();

Например:

class ObjectClass
{
    // Something goes here
}

$object = new ObjectClass();

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

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

 3
Author: AbdulRhaman Rizk, 2017-01-01 22:54:05

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

$myObj = new stdClass();
$myObj->key_1 = 'Hello';
$myObj->key_2 = 'Dolly';

Вы можете использовать одно из следующих действий:

PHP >=5.4

$myObj = (object) [
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
];

PHP

$myObj = (object) array(
    'key_1' => 'Hello',
    'key_3' => 'Dolly',
);
 2
Author: Vasil Nikolov, 2017-01-31 10:22:35

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

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

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

$aVal = array( 'key'=>'value' );
$oVal = (object) $aVal;
 2
Author: Anthony Awuley, 2017-06-16 20:50:29

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

<?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; ?>
 1
Author: fingerman, 2017-02-03 18:31:38

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

$var = json_decode(json_encode([]), FALSE);
 0
Author: Kerollmops, 2014-06-12 21:37:58