Что такое stdClass в PHP? - PullRequest
981 голосов
/ 31 мая 2009

Укажите, что такое stdClass.

Ответы [ 16 ]

1089 голосов
/ 14 июня 2009

stdClass - это просто общий «пустой» класс, который используется при приведении других типов к объектам. Несмотря на то, что говорят два других ответа, stdClass - это , а не базовый класс для объектов в PHP. Это можно продемонстрировать довольно легко:

class Foo{}
$foo = new Foo();
echo ($foo instanceof stdClass)?'Y':'N';
// outputs 'N'

Я не верю, что в PHP есть понятие базового объекта

734 голосов
/ 31 мая 2009

stdClass - это общий пустой класс PHP, вроде Object в Java или object в Python ( Edit: , но фактически не используется в качестве универсального базового класса; спасибо @ Ciaran для указывая на это ).

Полезно для анонимных объектов, динамических свойств и т. Д.

Простой способ рассмотреть StdClass - это альтернатива ассоциативному массиву. Посмотрите этот пример ниже, который показывает, как json_decode() позволяет получить экземпляр StdClass или ассоциативный массив. Также, но не показано в этом примере, SoapClient::__soapCall возвращает экземпляр StdClass.

<?php
//Example with StdClass
$json = '{ "foo": "bar", "number": 42 }';
$stdInstance = json_decode($json);
echo $stdInstance->foo . PHP_EOL; //"bar"
echo $stdInstance->number . PHP_EOL; //42
//Example with associative array
$array = json_decode($json, true);
echo $array['foo'] . PHP_EOL; //"bar"
echo $array['number'] . PHP_EOL; //42

См. Динамические свойства в PHP и StdClass для дополнительных примеров.

90 голосов
/ 08 декабря 2012

stdClass - еще одна замечательная функция PHP. Вы можете создать анонимный класс PHP. Давайте рассмотрим пример.

$page=new stdClass();
$page->name='Home';
$page->status=1;

Теперь подумайте, что у вас есть другой класс, который инициализируется объектом страницы и выполняет на нем базу.

<?php
class PageShow {

    public $currentpage;

    public function __construct($pageobj)
    {
        $this->currentpage = $pageobj;
    }

    public function show()
    {
        echo $this->currentpage->name;
        $state = ($this->currentpage->status == 1) ? 'Active' : 'Inactive';
        echo 'This is ' . $state . ' page';
    }
}

Теперь вам нужно создать новый объект PageShow с объектом Page.

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

    $pageview=new PageShow($page);
    $pageview->show();
59 голосов
/ 11 октября 2011

Также стоит отметить, что stdClass объект может быть создан с использованием json_decode().

25 голосов
/ 06 апреля 2015

Используя stdClass , вы можете создать новый объект со своими собственными свойствами. Рассмотрим следующий пример, который представляет детали пользователя в виде ассоциативного массива.

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "smith@nomail.com";

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

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";

Если вы являетесь разработчиком Joomla, обратитесь к этому примеру в документации Joomla для дальнейшего понимания.

24 голосов
/ 19 мая 2010

Аналогично,

$myNewObj->setNewVar = 'newVal'; 

возвращает объект stdClass - автоматически приведен

Я узнал об этом сегодня по ошибке:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';

Cool!

9 голосов
/ 05 марта 2016

stdClass не является анонимным классом или анонимным объектом

Ответы здесь включают выражения, что stdClass является анонимным классом или даже анонимным объектом. Это не правда.

stdClass - это обычный предопределенный класс. Вы можете проверить это с помощью оператора instanceof или функции get_class. Ничего особенного здесь не происходит. PHP использует этот класс при приведении других значений к объекту.

Во многих случаях, когда stdClass используется программистами, массив является лучшим вариантом из-за полезных функций и того факта, что этот вариант использования представляет структуру данных, а не реальный объект.

7 голосов
/ 23 марта 2013

На самом деле я попытался создать пустой stdClass и сравнил скорость с пустым классом.

class emp{}

затем приступил к созданию 1000 stdClasses и emps ... пустые классы были созданы примерно за 1100 микросекунд, в то время как stdClasses заняло более 1700 микросекунд. Поэтому я думаю, что лучше создать свой собственный фиктивный класс для хранения данных, если вы хотите так плохо использовать объекты (массивы намного быстрее и для записи, и для чтения).

5 голосов
/ 11 января 2018

Стоит также отметить, что при использовании Casting вам не нужно создавать объект, как в ответе @Bandula. Вместо этого вы можете просто привести ваш массив к объекту и вернуть stdClass. Например:

$array = array(
    'Property1'=>'hello',
    'Property2'=>'world',
    'Property3'=>'again',
);

$obj = (object) $array;
echo $obj->Property3;

Output: again

5 голосов
/ 23 апреля 2017

Используемые объекты stdClass

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

Пример

class Example {

  private $options;

  public function __construct(Array $setup)
  {
    // casting Array to stdClass object
    $this->options = (object) $setup;

    // access stdClass object in oop style - here transform data in OOP style using some custom method or something...
    echo $this->options->{'name'}; // ->{'key'}
    echo $this->options->surname;  // ->key
  }

}

$ob1 = new Example(["name" => "John", "surname" => "Doe"]);

будет эхом

Джон Доу

...