Як визначити порожній об’єкт у PHP


384

з новим масивом я це роблю:

$aVal = array();

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

Чи є подібний синтаксис для об’єкта

(object)$oVal = "";

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

13
$var = (object) (boolean) (string) (int) (array) new StdClass; Ви знаєте, щоб бути в безпеці.
Xeoncross

1
Google проіндексував цей заголовок питання , як: Arrays - How to define an empty object in PHP. Не має нічого спільного з масивами
Колонь Каньйон

Відповіді:


848
$x = new stdClass();

Коментар в ручному підсумовує найкраще:

stdClass - це об'єкт PHP за замовчуванням. stdClass не має властивостей, методів або батьківських. Він не підтримує магічні методи і не реалізує ніяких інтерфейсів.

Коли ви передаєте скаляр або масив як Object, ви отримуєте екземпляр stdClass. Ви можете використовувати stdClass, коли вам потрібен загальний екземпляр об'єкта.


5
$ o = (об'єкт) NULL; - Якщо об'єкт перетворений на об'єкт, він не змінюється. Якщо значення будь-якого іншого типу перетворюється на об'єкт, створюється новий примірник вбудованого класу stdClass. Якщо значення було NULL, новий примірник буде порожнім. Масиви перетворюють на об'єкт із властивостями, названими ключами, та відповідними значеннями. Для будь-якого іншого значення змінна члена з ім'ям скаляр буде містити це значення.
DDS

11
Я просто кажу stdClassв голові як "стандартний клас"
sjagr

1
Якщо ви
забудете,

26
Якщо ви зіткнулися з "не знайдено": new \stdClass(); PHP Namespace Doc
2540625

3
@IvanCastellanos ви могли б пояснити, як ви можете запам'ятати stdClass()слово AIDS?
Адам

117

Стандартний спосіб створення "порожнього" об'єкта:

$oVal = new stdClass();

Але, з PHP> = 5.4, я особисто вважаю за краще використовувати:

$oVal = (object)[];

Він коротший, і я особисто вважаю його більш зрозумілим, оскільки stdClass може ввести в оману початківців програмістів (тобто "Ей, я хочу об'єкт, а не клас!" ...).

Те саме з PHP <5.4:

$oVal = (object) array();

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

Дивіться посібник із PHP ( тут ):

stdClass : Створюється шляхом введення об'єкта введення.

і ( тут ):

Якщо об'єкт перетворений на об'єкт, він не змінюється. Якщо значення будь-якого іншого типу перетворюється на об'єкт, створюється новий примірник вбудованого класу stdClass .


Однак пам’ятайте, що порожній ($ oVal) повертає помилку , як сказав @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";

3
Замість того, щоб виправити проблему, ви створюєте нову. Проблема, яка потребує виправлення, полягає в тому, що люди повинні знати, що stdClassробить.
Pacerier

2
Я написав, що stdClassробить. Я використовував stdClassкод, який відповідає на питання. Вибачте, але я не створюю нової проблеми, це була моя особиста думка (як я писав).
cgaldiolo

6
"особисті переваги"! = "проблема"
cgaldiolo

4
@Pacerier, я не розумію твоєї впертості. Питання було "Як визначити порожній об'єкт у PHP". Моя відповідь правильна, і я написав використовувати "новий stdClass ()". Код, який я надав користувачеві 'ed209', є правильним, і я використав "new stdClass ()". Крім того, я додав особисту думку, і я використав сміливий "особисто", щоб зрозуміти, що це не "стандартний" шлях. На мою скромну думку, проблема, яка заслуговує на стільки коментарів, повинна бути як мінімум неправильною відповіддю. Натомість, якщо ви вважаєте особисту думку проблемою, можливо, це проблема конструктивного обміну ідеями.
cgaldiolo

9
Мені дуже подобається стенограма(object) []
Рахіль Вазір

35

Хочу зазначити, що в PHP немає такого поняття, як порожній об’єкт у сенсі:

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

але звичайно $ obj буде порожнім.

З іншого боку порожній масив означає порожній в обох випадках

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

Цитата з функції зміни журналу порожня

Об'єкти без властивостей більше не вважаються порожніми.


Я не зміг знайти цю цитату в журналі змін для порожньої.
powpow12

@ powpow12 Раніше там було . Це було змінено в 5.0.0.
Стенлі Умеанозі


14

Мені подобається, як легко створювати об’єкти анонімного типу в 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)"

Ну, ви можете це зробити, але ІМО не практичний / чистий:

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

Також, використовуючи цей синтаксис, ви можете знайти кілька кумедних сюрпризів , але це працює чудово у більшості випадків.


1
Це має бути прийнята відповідь
Майк Арон

11

На додаток до відповіді зомба, якщо ви забудете stdClass

   function object(){

        return new stdClass();

    }

Тепер ви можете зробити:

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

Мені подобається ця методика, хоча більшість IDE не виділяють термін "об'єкт" як функцію, яка може заплутати інших програмістів. Але ей, це працює на мене!
Brixster

7

Ви можете використовувати 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

Як зазначали інші, ви можете використовувати 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 () замість синтаксису конструктора. Це нормальна функція, яка повертає значення, яке є менш обмеженим, ніж конструктор. Наприклад, ім'я функції може бути передано як рядок до функції, яка приймає параметр, що може викликати. Функція також підтримує ланцюжок. Тож ви можете зробити щось на кшталт:

Це чудовий початок для базової "мови" для побудови інших мовних шарів, при цьому верхній шар записується повністю внутрішніми DSL. Це схоже на стилі розробки, і PHP підтримує його набагато краще, ніж більшість людей усвідомлює. Я усвідомлюю, що це дещо дотична для питання, але питання стосується того, що, на мою думку, є базовим для повного використання потужності PHP.


2
@Pacerier Ви маєте на увазі бездітність? ;) cis.upenn.edu/~matuszek/General/JavaSyntax/parentheses.html
still_dreaming_1

1
Це помилка друку, це має бути безгрунтовність.
Пейс’єр


4

Якщо ви хочете створити об'єкт (наприклад, у 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

Ви можете спробувати і цим способом.

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

Вихід:

object(stdClass)#1 (0) { }

4

Використовуйте загальний об’єкт і нанесіть на нього пари значень ключових значень.

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

Або кинути масив в об’єкт

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

3

Якщо ви не хочете цього робити:

$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',
);

3

Ось приклад з ітерацією:

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

stdClass - це об'єкт PHP за замовчуванням. stdClass не має властивостей, методів або батьківських. Він не підтримує магічні методи і не реалізує ніяких інтерфейсів.

Коли ви передаєте скаляр або масив як Object, ви отримуєте екземпляр stdClass. Ви можете використовувати stdClass, коли вам потрібен загальний екземпляр об'єкта.

<?php
// ways of creating stdClass instances
$x = new stdClass;
$y = (object) null;        // same as above
$z = (object) 'a';         // creates property 'scalar' = 'a'
$a = (object) array('property1' => 1, 'property2' => 'b');
?>

stdClass НЕ є базовим класом! Класи PHP не успадковують автоматично жоден клас. Усі класи є окремими, якщо вони прямо не поширюють інший клас. PHP відрізняється від багатьох об'єктно-орієнтованих мов у цьому відношенні.

<?php
// CTest does not derive from stdClass
class CTest {
    public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass);            // false
var_dump(is_subclass_of($t, 'stdClass'));    // false
echo get_class($t) . "\n";                   // 'CTest'
echo get_parent_class($t) . "\n";            // false (no parent)
?>

Ви не можете визначити клас з назвою "stdClass" у своєму коді. Це ім'я вже використовується системою. Ви можете визначити клас під назвою "Об'єкт".

Ви можете визначити клас, який розширює stdClass, але ви не отримаєте користі, оскільки stdClass нічого не робить.

(тестовано на PHP 5.2.8)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.