Czym jest stdClass w PHP?

Proszę określić czym jest stdClass.

 923
Author: random, 2009-05-31

16 answers

stdClass jest generyczną pustą klasą PHP, podobnie jak Object w Javie lub object w Pythonie (Edit: , ale w rzeczywistości nie jest używana jako uniwersalna klasa bazowa; dzięki @Ciaran za wskazując na to ).

Jest to przydatne dla obiektów anonimowych, właściwości dynamicznych, itd.

Łatwym sposobem na rozważenie StdClass jest alternatywa dla tablicy asocjacyjnej. Zobacz poniższy przykład pokazujący jak json_decode() pozwala uzyskać instancję klasy StdClass lub tablicę asocjacyjną. Również, ale nie w tym przykładzie SoapClient::__soapCall zwraca instancję klasy 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

Zobacz dynamiczne właściwości w PHP i StdClass aby uzyskać więcej przykładów.

 689
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-01 14:56:50

stdClass jest tylko ogólną "pustą" klasą, która jest używana podczas rzucania innych typów do obiektów. Pomimo tego, co mówią pozostałe dwie odpowiedzi, stdClass jest , a nie klasą bazową dla obiektów w PHP. Można to dość łatwo wykazać:

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

Nie wierzę, że istnieje pojęcie obiektu bazowego w PHP

 1062
Author: Ciaran McNulty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 10:17:50

StdClass to kolejna świetna funkcja PHP. Możesz utworzyć anonimową klasę PHP. Sprawdźmy przykład.

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

Teraz pomyśl, że masz inną klasę, która zainicjalizuje obiekt page i uruchomi na nim bazę.

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

Teraz musisz utworzyć nowy obiekt PageShow z obiektem Page.

Tutaj nie ma potrzeby pisania nowego szablonu klasy do tego możesz po prostu użyć stdClass, aby utworzyć klasę w locie.

    $pageview=new PageShow($page);
    $pageview->show();
 80
Author: Mrinmoy Ghoshal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-19 16:31:53

Warto również zauważyć, że obiekt stdClass można również utworzyć z użyciem json_decode().

 58
Author: mdpatrick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-02 14:04:38

Podobnie,

$myNewObj->setNewVar = 'newVal'; 

Daje obiekt stdClass - Auto casted

Znalazłem to dzisiaj przez pomyłkę w pisowni:

$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
Super!
 24
Author: Codename-Steeve-Knight,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-19 13:52:15

Za pomocą stdClass możesz utworzyć nowy obiekt z jego własnymi właściwościami. Rozważ poniższy przykład, który przedstawia szczegóły użytkownika jako tablicę asocjacyjną.

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

Jeśli chcesz przedstawić te same szczegóły co Właściwości obiektu, możesz użyć stdClass Jak Poniżej.

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

Jeśli jesteś programistą Joomla odnoszą się ten przykład w Joomla docs dla dalszego zrozumienia.

 21
Author: Bandula Dharmadasa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-13 09:57:54

Właściwie próbowałem stworzyć pustą klasę stdClass i porównałem szybkość do pustej klasy.

class emp{}

Następnie kontynuowano tworzenie 1000 klas STD i emps... puste klasy były wykonywane w około 1100 mikrosekund, podczas gdy klasy STD zajmowały ponad 1700 mikrosekund. Więc myślę, że lepiej jest stworzyć własną klasę atrapy do przechowywania danych, jeśli chcesz używać obiektów do tego tak źle (tablice są o wiele szybsze zarówno do pisania, jak i czytania).

 7
Author: Sage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-23 15:02:33

StdClass nie jest anonimową klasą ani anonimowym obiektem

Odpowiedzi zawierają wyrażenia, które stdClass są anonimową klasą lub nawet anonimowym obiektem. To nieprawda.

stdClass to zwykła, predefiniowana Klasa. Można to sprawdzić za pomocą operatora instanceof lub funkcji get_class. Nic specjalnego tu nie ma. PHP używa tej klasy podczas rzucania innych wartości do obiektu.

W wielu przypadkach, gdzie stdClass jest używany przez programistów, tablica jest lepszym rozwiązaniem, ze względu na użyteczne funkcje i fakt, że ta baza danych reprezentuje strukturę danych, a nie rzeczywisty obiekt.

 6
Author: John Smith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-13 07:54:37

Jeśli chcesz szybko utworzyć nowy obiekt do przechowywania danych o książce. Zrobiłbyś coś takiego:

$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";

Proszę sprawdzić stronę - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array / Po Więcej Szczegółów.

 3
Author: Niladri Banerjee - Uttarpara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 10:02:57

Obiekty StdClass w użyciu

StdClass pozwala na tworzenie anonimowych klas i przy odlewaniu obiektów można również uzyskać dostęp do kluczy tablicy asocjacyjnej w stylu OOP. Podobnie jak w przypadku zwykłej właściwości obiektu.

Przykład

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

Will echo

John Doe

 3
Author: DevWL,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-08 17:31:51

Php.net manual ma kilka solidnych wyjaśnień i przykładów dodanych przez użytkowników, czym jest stdClass, szczególnie podoba mi się ten http://php.net/manual/en/language.oop5.basic.php#92123, https://stackoverflow.com/a/1434375/2352773 .

StdClass jest domyślnym obiektem PHP. stdClass nie posiada właściwości, metody lub rodzica. Nie wspiera metod magicznych i wdraża brak interfejsów.

Kiedy rzucisz Skalar lub tablicę jako obiekt, otrzymasz przykład Klasa STD. Możesz użyć stdClass, gdy potrzebujesz obiektu generycznego przykład.

StdClass nie jest klasą bazową! Klasy PHP nie dziedziczą automatycznie z każdej klasy. Wszystkie klasy są samodzielne, chyba że wyraźnie przedłużyć kolejną klasę. PHP różni się od wielu języków obiektowych pod tym względem.

Możesz zdefiniować klasę, która rozszerza stdClass, ale nie dostaniesz korzyści, ponieważ stdClass nic nie robi.

 2
Author: Danijel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:59

Warto również zauważyć, że używając castingu nie musisz tworzyć obiektu, jak w odpowiedzi udzielonej przez @ Bandula. Zamiast tego możesz po prostu oddać tablicę do obiektu i zwracana jest klasa stdClass. Na przykład:

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

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

Output: again

 2
Author: Antony,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-11 11:35:34

StClass jest pustą klasą stworzoną przez php i powinna być używana tylko przez php, bo to nie jest tylko "pusta" Klasa , php używa stdClass do konwersji tablic na styl obiektowy jeśli potrzebujesz użyć stdClass, polecam dwie lepsze opcje : 1-używaj tablic (dużo szybciej niż klasy) 2-Stwórz własną pustą klasę i użyj jej

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

Co sprawia, że ktoś myśli o użyciu stylu obiektowego zamiast stylu tablicy???

 1
Author: Sherif Eldeeb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-11 21:34:23

Stdclass jest sposobem, w jaki php unikają przestania interpretacji skryptu, gdy w klasie muszą być umieszczone pewne dane, ale niestety ta klasa nie została zdefiniowana

Przykład:

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

Tutaj dane zostaną umieszczone w predefiniowanych "zadaniach". Ale jeśli zrobimy kod Tak:

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

Następnie php umieści wyniki w stdclass.

Simply php says that: look, we have a good KIDS [Objects] Here ale bez rodziców . Więc wyślemy je do domu opieki dla niemowląt stdclass :)

 1
Author: Nasir Nasrallah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-29 12:38:49

Proszę pamiętać, że 2 puste klasy Std nie są ściśle równe. Jest to bardzo ważne przy pisaniu szyderczych oczekiwań.

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 >
 1
Author: jakub wrona,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-13 10:48:21

Możesz również użyć object do rzucania tablic do wybranego obiektu:

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

Teraz, aby utworzyć obiekt typu Example i zainicjalizować go, możesz wykonać jedną z następujących czynności:

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

Lub

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

Druga metoda jest głównie przydatna do inicjalizacji obiektów o wielu właściwościach.

 0
Author: Vahid Amiri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-28 07:35:13