Как определить пустой объект в 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 ]

767 голосов
/ 16 сентября 2009
$x = new stdClass();

A комментарий в руководстве лучше всего резюмирует:

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

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

90 голосов
/ 19 марта 2015

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

$oVal = new stdClass();

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

$oVal = (object)[];

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

То же самое с PHP <5.4: </p>

$oVal = (object) array();

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

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

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

и ( здесь ):

Если объект преобразован в объект, он не изменяется. Если значение любого другого типа преобразуется в объект, создается новый экземпляр встроенного класса 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";
33 голосов
/ 26 августа 2011

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

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

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

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

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

Цитата из журнала изменений пусто

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

17 голосов
/ 12 сентября 2010

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

$new_empty_object = new stdClass();
12 голосов
/ 14 января 2016

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

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

11 голосов
/ 30 января 2015

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

   function object(){

        return new stdClass();

    }

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

$str='';
$array=array();
$object=object();
6 голосов
/ 14 декабря 2015

Вы можете использовать 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 голосов
/ 20 февраля 2015

для доступа к данным в 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 голосов
/ 24 ноября 2016

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

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

Выход:

object(stdClass)#1 (0) { }
4 голосов
/ 26 ноября 2015

Если вы хотите создать объект (как в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...