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

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

Ответ 1

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.

Ответ 2

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

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

Я не верю в концепцию базового объекта в PHP

Ответ 3

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 с объектом страницы.

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

    $pageview=new PageShow($page);
    $pageview->show();

Ответ 4

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

Ответ 5

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

$array_user = array();
$array_user["name"] = "smith john";
$array_user["username"] = "smith";
$array_user["id"] = "1002";
$array_user["email"] = "[email protected]";

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

$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "[email protected]";

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

Ответ 6

Аналогично,

$myNewObj->setNewVar = 'newVal'; 

выводит объект stdClass - auto casted

Я нашел это сегодня, набрав:

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

Круто!

Ответ 7

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

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

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

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

Ответ 8

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

class emp{}

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

Ответ 9

Используемые объекты 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"]);

будет эхо

Джон Доу

Ответ 10

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

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

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

Output: again

Ответ 11

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

$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://www.amazon.com/dp/0439136369/";

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

Ответ 12

Пожалуйста, имейте в виду, что 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 >

Ответ 13

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

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

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

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

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

Ответ 14

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

Пример:

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

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

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

то php поставит приводит к .

просто говорит, что: look, у нас есть хорошие ДЕТИ [Объекты] Здесь, но без Родителей. Итак, мы отправим их в детский дом Care Home :

Ответ 15

Вы также можете использовать 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];

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

Ответ 16

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';

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