Вопрос

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

Это было полезно?

Решение

stdClass является ли общий пустой класс PHP, что-то вроде Object на Java или object в Python (Редактировать: но на самом деле не используется как универсальный базовый класс;Спасибо @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 для получения дополнительных примеров.

Другие советы

stdClass это просто универсальный "пустой" класс, который используется при приведении других типов к объектам.Несмотря на то, что говорится в двух других ответах, stdClass является нет базовый класс для объектов в 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;

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

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

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

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

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

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

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

Аналогично,

$myNewObj->setNewVar = 'newVal'; 

выдает объект стандартного класса - автоматическое приведение

Я узнал об этом сегодня из-за орфографической ошибки:

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

Круто!

stdClass - это не анонимный класс или анонимный объект

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

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

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

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

class emp{}

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

Используемые объекты стандартного класса

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

Пример

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

будет отдаваться эхом

Джон Доу

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

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

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

Output: again

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

$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/ для получения более подробной информации.

Пожалуйста, имейте в виду, что 2 пустых стандартных класса не являются строго равными.Это очень важно при написании ожиданий от издевательств.

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 >

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

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

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

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

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

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

Пример :

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

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

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

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

просто говорит , что :смотрите, у нас здесь хорошие ДЕТИ [Возражает] , но без родителей .Итак , мы отправим их в Дом престарелых :)

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top