Что такое stdClass в PHP?

пожалуйста, определить, что stdClass есть.

16 ответов


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

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

простой способ рассмотреть 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 для получения дополнительных примеров.


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

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

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


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();

также стоит отметить, an


кроме того,

$myNewObj->setNewVar = 'newVal'; 

дает объект stdClass-auto casted

я узнал это сегодня, неправильно написав:

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

круто!


используя 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 для дальнейшего понимание.


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

class emp{}

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


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

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

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

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


Если вы хотите быстро создать новый объект для хранения некоторых данных о книге. Вы бы сделали что-то вроде этого:

$book = new stdClass;
$book->title = "Harry Potter and the Prisoner of Azkaban";
$book->author = "J. K. Rowling";
$book->publisher = "Arthur A. Levine Books";
$book->amazon_link = "http://rads.stackoverflow.com/amzn/click/0439136369";

пожалуйста, проверьте сайт - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ для получения более подробной информации.


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

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

пример

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"]);

Эхо

Вася Пупкин


php.net руководство имеет несколько твердых объяснений и примеров, представленных пользователями того, что stdClass, мне особенно нравится этотhttp://php.net/manual/en/language.oop5.basic.php#92123, https://stackoverflow.com/a/1434375/2352773.

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

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

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

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


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

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

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

Output: again


stClass-это пустой класс, созданный самим php , и должен использоваться только php, потому что это не просто "пустой" класс , php использует stdClass для преобразования массивов в стиль объекта если вам нужно использовать stdClass, я рекомендую два лучших варианта : 1-Использование массивов (намного быстрее, чем классы) 2-Сделайте свой собственный пустой класс и используйте его

//example 1
$data=array('k1'=>'v1' , 'k2'=>'v2',....);

//example 2
//creating an empty class is faster than instances an stdClass
class data={}
$data=new data();
$data->k1='v1';
$data->k2='v2';

что заставляет кого-то думать об использовании стиля объекта вместо стиля массива???


stdclass это способ, которым php избегайте остановки интерпретации скрипта, когда есть некоторые данные, которые должны быть помещены в класс, но к сожалению, этот класс не был определен

пример :

 return $statement->fetchAll(PDO::FETCH_CLASS  , 'Tasks');

здесь данные будут помещены в предопределенные "задачи". Но, если бы мы сделали код так:

 return $statement->fetchAll(PDO::FETCH_CLASS );

тут php поставит результаты в stdclass .

просто php говорит, что : смотрите, у нас есть хорошие дети[объекты] здесь, но без родителей . Итак, мы отправим их в детский дом stdclass :)


пожалуйста, голые в виду, что 2 пустые stdClasses не строго равны. Это очень важно при написании пародийных ожиданий.

php > $a = new stdClass();
php > $b = new stdClass();
php > var_dump($a === $b);
bool(false)
php > var_dump($a == $b);
bool(true)
php > var_dump($a);
object(stdClass)#1 (0) {
}
php > var_dump($b);
object(stdClass)#2 (0) {
}
php >

вы также можете использовать object для приведения массивов к объекту по вашему выбору:

Class Example
{
   public $name;
   public $age;
}

теперь, чтобы создать объект типа Example и инициализировать его вы можете сделать любое из этих:

$example = new Example();
$example->name = "some name";
$example->age = 22;

или

$example = new Example();
$example = (object) ['name' => "some name", 'age' => 22];

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