Co to jest stdClass w PHP?

1049

Proszę zdefiniować co stdClassjest.

Keira Nighly
źródło

Odpowiedzi:

785

stdClassjest ogólną pustą klasą PHP, trochę jak Objectw Javie lub objectPythonie ( Edycja: ale tak naprawdę nie jest używana jako uniwersalna klasa podstawowa; dzięki @Ciaran za zwrócenie na to uwagi ).

Jest przydatny w przypadku obiektów anonimowych, właściwości dynamicznych itp.

Prostym sposobem na rozważenie StdClass jest alternatywa dla tablicy asocjacyjnej. Zobacz poniższy przykład, który pokazuje, w jaki sposób json_decode()można uzyskać instancję StdClass lub tablicę asocjacyjną. Również, ale nie pokazano w tym przykładzie, SoapClient::__soapCallzwraca instancję 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.

Alex Martelli
źródło
7
może użył mysql_fetch_object. który tworzy instancję stdlcass, jeśli się nie mylę.
Galen
69
Nie jest to całkiem podstawowa klasa, jak obiekt Java, patrz moja odpowiedź poniżej.
Ciaran McNulty
1
Mam nadzieję, że wiesz, że obiekt nie jest pochodną klasą „wszystkich” obiektów w Pythonie ... Przynajmniej dopóki nie będziesz zmuszony wyprowadzić się z obiektu w Pythonie 3.0
monokrome
11
Myślę, że ludzie powinni powiedzieć, że stdClass jest jak {}konstrukcja JavaScript .
Earth Engine
Proszę pana, odpowiedź jest częściowo nieprawidłowa, ponieważ artykuł jest nieprawidłowy. Jedyną (i to też jest źle) rozszerzeniem tej klasy jest możliwość wpisania podpowiedzi, tj. function(StdClass $a, array $params)Sprawdzenie, czy $ajest obiektem i instanceof.
Dejan Marjanovic
1114

stdClassjest po prostu ogólną „pustą” klasą używaną podczas rzutowania innych typów na obiekty. Pomimo tego, co mówią dwie pozostałe odpowiedzi, niestdClass jest klasą podstawową 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 koncepcja podstawowego obiektu w PHP

Ciaran McNulty
źródło
4
co oznacza std?
Adam Waite
47
standardowe = standardowe -
Tomas Prado
1
To klasa użyteczności! Btw to prawdziwy komentarz!
Gustav
16
Właściwie pierwsze zdanie po fragmencie kodu odpowiada na pytanie.
MauganRa
2
@Miro Markaravanes: Atrybuty dynamiczne można przypisać do dowolnej klasy w PHP, nie tylko stdClass.
StanE
95

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

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

teraz myślę, że masz inną klasę, która zainicjuje się z obiektem strony i wykona 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 za pomocą obiektu strony.

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

    $pageview=new PageShow($page);
    $pageview->show();
Mrinmoy Ghoshal
źródło
3
pusta klasa z przydatnymi funkcjami, które działają z wierszami, a także jej lepszy standard kodowania
borrel
1
Byłoby to tak samo jak przy użyciu tablicy. W rzeczywistości STDclass jest generowany podczas żonglowania typami, jak konwersja tablic do obiektów.
varuog
1
Popraw literówkę w kodzie: ($ this-> currentpage-> name == 1) powinno być ($ this-> currentpage-> status == 1)
Enriqe
7
„Możesz stworzyć anonimową klasę PHP” - to nie jest anonimowa klasa . Możesz użyć instanceof, get_class, ...
John Smith
2
Ta odpowiedź jest szczególnie myląca, ponieważ PHP ma anonimowe klasy , które są bardzo różne stdClass.
IMSoP
59

Warto również zauważyć, że stdClassobiekt może zostać utworzony również z użycia json_decode().

mdpatrick
źródło
5
Prawdziwe. Często używam json_encode i json_decode, aby w razie potrzeby konwertować tablicę na obiekt na tablicę.
pinkal vansia,
6
$ x = json_decode (json_encode ($ object), True) zdekoduje obiekt do tablicy, ale nie jest binarnie bezpieczny. Zasadniczo, jeśli nie jest to zwykły tekst, może się zepsuć w JSON.
simontemplar
@simontemplar W PHP nie powinieneś pisać True. Wartości logiczne są małymi literami truelub false.
BadHorsie,
2
@ simontemplar Instrukcja nie, ale PSR-2 tak, więc jeśli przestrzegasz jakichkolwiek standardów, powinna być pisana małymi literami. Jasne, jeśli chcesz napisać w ten sposób, jest poprawny, ale powinieneś przestrzegać standardów. Dokumentacja ręczna dla logów będzie bardzo stara, prawdopodobnie napisana przed utworzeniem standardów. Bądźmy szczerzy, PHP zostało pierwotnie napisane jako kompletny bałagan bez żadnych standardów (zobacz szeroki zakres używanych konwencji nazewnictwa zmiennych / funkcji / obiektów). Szczerze mówiąc, nigdy nie widziałem żadnego kodu PHP, w którym programista używałby twojego formatu.
BadHorsie,
2
Postępuję zgodnie z PSR-2, z wyjątkiem True / False / Null i umieszczam otwierające nawiasy klamrowe na własnych liniach dla klas. Poza tym po prostu mnie to nie obchodzi. Jeśli jednak edytuję czyjś kod, postępuję zgodnie ze standardem, którego używają (jeśli w ogóle nie ma), a jeśli tego nie zrobię, wykonaj PSR-2 „we właściwy” sposób. Istnieje mnóstwo okropnych kodów z mnóstwem innych problemów, że pisanie wielkimi literami trzech słów kluczowych jest najmniejszym z moich zmartwień.
simontemplar
26

Za pomocą stdClass możesz stworzyć nowy obiekt z własnymi właściwościami. Rozważ następujący przykład, który reprezentuje dane 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, zapoznaj się z tym przykładem w dokumentacji Joomla w celu dalszego zrozumienia.

Bandula Dharmadasa
źródło
24

Również,

$myNewObj->setNewVar = 'newVal'; 

zwraca obiekt stdClass - automatycznie rzutowany

Dowiedziałem się tego dzisiaj, popełniając błędy w pisowni:

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

Fajne!

Codename-Steeve-Knight
źródło
9
Ale to powinno podnieść E_NOTICE
Petah
3
@Petah Tylko w PHP 5.3+, prawda? Ale tak, to z pewnością zła praktyka.
ChristoKiwi
15

stdClass nie jest anonimową klasą ani anonimowym obiektem

Odpowiedzi tutaj obejmują wyrażenia stdClassbędące anonimową klasą lub nawet anonimowym obiektem. To nie prawda.

stdClassjest zwykłą predefiniowaną klasą. Możesz to sprawdzić za pomocą instanceofoperatora lub funkcji get_class. Nie ma tu nic specjalnego. PHP używa tej klasy do rzutowania innych wartości na obiekty.

W wielu przypadkach, gdy stdClasssą używane przez programistów, tablica jest lepszą opcją, ze względu na przydatne funkcje i fakt, że ta skrzynka reprezentuje strukturę danych, a nie rzeczywisty obiekt.

John Smith
źródło
8

Warto również zauważyć, że korzystając z Castingu, tak naprawdę nie musisz tworzyć obiektu, jak w odpowiedzi udzielonej przez @Bandula. Zamiast tego możesz po prostu rzucić tablicę na obiekt i zwracana jest klasa stdClass. Na przykład:

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

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

Output: again

Antony
źródło
Kocham to. Dużo czystsze!
WebSpanner
7

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

class emp{}

następnie kontynuował tworzenie 1000 stdClasses i emps ... puste klasy wykonano w około 1100 mikrosekund, podczas gdy stdClasses zajęły ponad 1700 mikrosekund. Sądzę więc, że lepiej jest stworzyć własną sztuczną klasę do przechowywania danych, jeśli chcesz tak źle używać obiektów (tablice są znacznie szybsze zarówno do zapisu, jak i odczytu).

szałwia
źródło
22
najwyraźniej różnica jest spowodowana różnicą długości imienia. jeśli nazwiesz klasę „klasą averyna” bez podania przyczyny, utworzenie zajmie znacznie więcej czasu. więc idź.
Sage
27
Hmmm ... przedwczesna optymalizacja. Wolę znaleźć złożone zapytania SQL lub inne wąskie gardła w sieci, jeśli naprawdę martwię się szybkością, zamiast tracić czas na 600 mikrosekund. Właściwie wolałbym najpierw sprawdzić, czy javascript znajduje się w stopce, a nie na głowie, niż dbać o to, czy jedna jest o 600 mikrosekund szybsza niż druga.
Ardee Aram
6
1000 jest za mały, aby można było go wiarygodnie porównać. Spróbuj miliarda.
prawej strony
1
W świecie PHP prawie zawsze lepiej jest używać tablic.
Vahid Amiri,
^ Zdecydowanie nie. Array Hell to koszmar podczas pracy w zespole przy dużym projekcie.
Davie Dave
6

używane obiekty stdClass

StdClass pozwala tworzyć anonimowe klasy, a rzutowanie obiektów umożliwia dostęp do kluczy tablicy asocjacyjnej w stylu OOP. Tak jak w przypadku dostępu do 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"]);

odbije się echem

nieznany z nazwiska

DevWL
źródło
5

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

Proszę sprawdzić stronę - http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/, aby uzyskać więcej informacji.

Niladri Banerjee - Uttarpara
źródło
4

Należy pamiętać, że 2 puste klasy stdClass nie są ściśle równe. Jest to bardzo ważne przy pisaniu kpiących 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 >
jakub wrona
źródło
Ponieważ NIE jest to ta sama instancja, ergo nie może się równać. Ścisłe porównanie klas działa z identyfikacją instancji. Każde wystąpienie dowolnej klasy ma unikalny identyfikator.
Bednic
3

Podręcznik php.net zawiera kilka solidnych wyjaśnień i przykładów dostarczonych przez użytkowników na temat tego, 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 ma właściwości, metod ani elementu nadrzędnego. Nie obsługuje magicznych metod i nie implementuje interfejsów.

Kiedy rzutujesz skalar lub tablicę jako Object, dostajesz instancję stdClass. Możesz użyć stdClass, ilekroć potrzebujesz ogólnej instancji obiektu.

stdClass NIE jest klasą podstawową! Klasy PHP nie dziedziczą automatycznie po żadnej klasie. Wszystkie klasy są samodzielne, chyba że jawnie rozszerzają inną klasę. Pod tym względem PHP różni się od wielu języków obiektowych.

Możesz zdefiniować klasę rozszerzającą stdClass, ale nie uzyskałbyś żadnej korzyści, ponieważ stdClass nic nie robi.

Danijel
źródło
3

jest sposobem, w jaki unikaj przerywania interpretacji skryptu, gdy pewne dane muszą zostać umieszczone w klasie, 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 gdybyśmy zrobili kod w ten sposób:

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

a później umieści wyniki .

po prostu mówi: patrz, mamy dobre DZIECI [Przedmioty] Tutaj, ale bez Rodziców. Wyślemy je więc do Domu Opieki nad Niemowlakiem :)

Nasir Nasrallah
źródło
2

Możesz także użyć objectdo rzutowania tablic na wybrany obiekt:

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

Teraz, aby utworzyć obiekt typu Examplei zainicjować 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 najbardziej przydatna do inicjowania obiektów o wielu właściwościach.

Vahid Amiri
źródło
1

stClass jest pustą klasą utworzoną przez sam php i powinien być używany tylko przez php, ponieważ nie jest to 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żyj tablic (znacznie szybciej niż klasy) 2- utwó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 tablicowego?

Sherif Eldeeb
źródło
0

Powodem, dla którego mamy stdClass, jest to, że w PHP nie ma sposobu, aby odróżnić normalną tablicę od tablicy powiązanej (tak jak w JavaScript masz {}obiekt i []tablicę, aby je odróżnić).

Stwarza to problem dla pustych obiektów. Weź to na przykład.

PHP:

$a = [1, 2, 3]; // this is an array
$b = ['one' => 1, 'two' => 2]; // this is an associate array (aka hash)
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Załóżmy, że chcesz JSON zakodować zmienną $ c

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}

Powiedzmy teraz, że usunąłeś wszystkie klucze z $bpustych. Ponieważ $bjest teraz pusty (usunąłeś wszystkie klucze, pamiętasz?), Wygląda na to, że []może to być tablica lub obiekt, jeśli na to spojrzysz.

Więc jeśli ponownie zrobisz kod_json, wynik będzie inny

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}

Jest to problem, ponieważ wiemy, bże miała to być tablica stowarzyszona, ale PHP (lub jakakolwiek funkcja taka jak json_encode) nie.

Więc stdClass przychodzi na ratunek. Ponownie biorąc ten sam przykład

$a = [1, 2, 3]; // this is an array
$b = (object) ['one' => 1, 'two' => 2]; // this makes it an stdClass
$c = ['a' => $a, 'b' => $b]; // this is also an associate array (aka hash)

Więc teraz, nawet jeśli usuniesz wszystkie klucze z $bi sprawisz, że będą puste, ponieważ jest to stdClass, nie będzie to miało znaczenia, a kiedy json_encode to otrzymasz:

echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}

Jest to również powód json_encodei json_decodedomyślnie zwraca stdClass.

 $c = json_decode('{"a": [1,2,3], "b": {}}', true); //true to deocde as array
 // $c is now ['a' => [1,2,3], 'b' => []] in PHP
 // if you json_encode($c) again your data is now corrupted
supersan
źródło