Was ist stdClass in PHP?

1049

Bitte definieren Sie was stdClassist.

Keira Fast
quelle

Antworten:

785

stdClassist die generische leere Klasse von PHP, ähnlich wie Objectin Java oder objectPython ( Bearbeiten: wird jedoch nicht als universelle Basisklasse verwendet; danke @Ciaran für den Hinweis ).

Es ist nützlich für anonyme Objekte, dynamische Eigenschaften usw.

Eine einfache Möglichkeit, die StdClass zu betrachten, ist eine Alternative zum assoziativen Array. Das folgende Beispiel zeigt, wie json_decode()eine StdClass-Instanz oder ein assoziatives Array abgerufen werden kann. Auch in diesem Beispiel nicht gezeigt, SoapClient::__soapCallgibt eine StdClass-Instanz zurück.

<?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

Weitere Beispiele finden Sie unter Dynamische Eigenschaften in PHP und StdClass .

Alex Martelli
quelle
7
Vielleicht hat er mysql_fetch_object benutzt. das schafft eine Instanz von stdlcass, wenn ich mich nicht irre.
Galen
69
Es ist keine Basisklasse in der Art, wie Javas Objekt ist, siehe meine Antwort unten.
Ciaran McNulty
1
Ich hoffe, Sie wissen, dass Objekt nicht die abgeleitete Klasse von "allen" Objekten in Python ist ... Zumindest nicht, bis Sie gezwungen sind, von Objekt in Python 3.0
Monokrom
11
Ich denke, die Leute sollten sagen, dass stdClass so etwas wie das {}Konstrukt von JavaScript ist .
Earth Engine
Sir, Ihre Antwort ist teilweise falsch, weil der Artikel falsch ist. Das einzige (und das ist auch falsch), was Sie durch die Erweiterung dieser Klasse erhalten, ist die Option, einen Hinweis einzugeben, dh zu function(StdClass $a, array $params)überprüfen, ob $aes sich um ein Objekt handelt und instanceof.
Dejan Marjanovic
1114

stdClassist nur eine generische 'leere' Klasse, die verwendet wird, wenn andere Typen in Objekte umgewandelt werden. Trotz der beiden anderen Antworten stdClassist dies nicht die Basisklasse für Objekte in PHP. Dies kann ziemlich leicht demonstriert werden:

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

Ich glaube nicht, dass es in PHP ein Konzept für ein Basisobjekt gibt

Ciaran McNulty
quelle
4
Wofür steht std?
Adam Waite
47
std = Standard -
Tomas Prado
1
Es ist eine Utility-Klasse! Übrigens ist das der wahre Kommentar!
Gustav
16
Tatsächlich beantwortet der erste Satz nach dem Code-Snippet die Frage.
MauganRa
2
@Miro Markaravanes: Dynamische Attribute können jeder Klasse in PHP zugewiesen werden, nicht nur stdClass.
StanE
95

stdClass ist eine weitere großartige PHP-Funktion. Sie können eine anonyme PHP-Klasse erstellen. Schauen wir uns ein Beispiel an.

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

Denken Sie jetzt, Sie haben eine andere Klasse, die mit einem Seitenobjekt initialisiert und darauf basierend ausgeführt wird.

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

Jetzt müssen Sie ein neues PageShow-Objekt mit einem Seitenobjekt erstellen.

Hier müssen Sie keine neue Klassenvorlage schreiben. Sie können einfach stdClass verwenden, um eine Klasse im laufenden Betrieb zu erstellen.

    $pageview=new PageShow($page);
    $pageview->show();
Mrinmoy Ghoshal
quelle
3
eine leere Klasse mit nützlichen Funktionen, die mit Zeilen arbeiten, auch ein besserer Codierungsstandard
Borrel
1
Es wäre dasselbe wie bei der Verwendung eines Arrays. Tatsächlich wird STDclass zum Zeitpunkt der Typ-Jonglier-Konvertierung von Array zu Objekt generiert.
Varuog
1
Bitte korrigieren Sie einen Tippfehler in Ihrem Code: ($ this-> currentpage-> name == 1) sollte sein ($ this-> currentpage-> status == 1)
Enriqe
7
"Sie können eine anonyme PHP-Klasse erstellen" - Es ist keine anonyme Klasse . Sie können instanceof, get_class, ...
John Smith
2
Diese Antwort ist jetzt besonders verwirrend, da PHP tatsächlich anonyme Klassen hat , die sich stark von unterscheiden stdClass.
IMSoP
59

Erwähnenswert ist auch, dass ein stdClassObjekt auch aus der Verwendung von erstellt werden kann json_decode().

mdpatrick
quelle
5
Wahr. Ich verwende häufig json_encode und json_decode, um bei Bedarf ein Array in ein Objekt in ein Array umzuwandeln.
Pinkal Vansia
6
$ x = json_decode (json_encode ($ object), True) dekodiert das Objekt in ein Array, ist jedoch nicht binärsicher. Wenn es sich nicht um Klartext handelt, kann es im Wesentlichen zu einer Unterbrechung von JSON kommen.
Simontemplar
@simontemplar In PHP sollten Sie nicht schreiben True. Boolesche Werte sind Kleinbuchstaben trueoder false.
BadHorsie
2
@simontemplar Das Handbuch tut dies nicht, PSR-2 jedoch. Wenn Sie also Standards befolgen , sollte dies in Kleinbuchstaben erfolgen. Sicher, wenn Sie es so schreiben möchten, ist es gültig, aber Sie sollten Standards befolgen. Die manuelle Dokumentation für Boolesche Werte wird extrem alt sein, wahrscheinlich bevor Standards gebildet wurden. Seien wir ehrlich, PHP wurde ursprünglich als komplettes Durcheinander ohne Standards geschrieben (siehe die breite Palette der verwendeten Konventionen zur Benennung von Variablen / Funktionen / Objekten). Ich habe ehrlich gesagt noch nie einen PHP-Code gesehen, in dem der Entwickler Ihr Format verwendet hat.
BadHorsie
2
Ich folge PSR-2 mit Ausnahme von True / False / Null und setze öffnende Klammern für Klassen in ihre eigenen Zeilen. Davon abgesehen ist es mir einfach egal. Wenn ich jedoch jemals den Code eines anderen bearbeite, folge ich dem Standard, den er verwendet (falls vorhanden, normalerweise keiner), und wenn dies nicht der Fall ist, mache ich PSR-2 auf die "richtige" Weise. Es gibt viele gottesfürchtige Codes mit unzähligen anderen Problemen, bei denen die Großschreibung von drei Schlüsselwörtern die geringste meiner Sorgen ist.
Simontemplar
26

Mit stdClass können Sie ein neues Objekt mit eigenen Eigenschaften erstellen. Betrachten Sie das folgende Beispiel, das die Details eines Benutzers als assoziatives Array darstellt.

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

Wenn Sie dieselben Details wie die Eigenschaften eines Objekts darstellen müssen, können Sie stdClass wie folgt verwenden .

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

Wenn Sie ein Joomla-Entwickler sind, lesen Sie dieses Beispiel in den Joomla-Dokumenten, um weitere Informationen zu erhalten.

Bandula Dharmadasa
quelle
24

Gleichfalls,

$myNewObj->setNewVar = 'newVal'; 

ergibt ein stdClass-Objekt - automatisch umgewandelt

Ich habe das heute durch Rechtschreibfehler herausgefunden:

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

Cool!

Codename-Steeve-Knight
quelle
9
Aber dies sollte eine E_NOTICE
Petah
3
@Petah Nur in PHP 5.3+, aber richtig? Aber ja, es ist sicher eine schlechte Praxis.
ChristoKiwi
15

stdClass ist keine anonyme Klasse oder ein anonymes Objekt

Die Antworten hier enthalten Ausdrücke, stdClassdie eine anonyme Klasse oder sogar ein anonymes Objekt sind. Es ist nicht wahr.

stdClassist nur eine reguläre vordefinierte Klasse. Sie können dies mit dem instanceofOperator oder der Funktion überprüfen get_class. Hier geht nichts Besonderes. PHP verwendet diese Klasse, wenn andere Werte in Objekte umgewandelt werden.

In vielen Fällen, in denen stdClassdas Programm von den Programmierern verwendet wird, ist das Array aufgrund nützlicher Funktionen und der Tatsache, dass dieser Anwendungsfall die Datenstruktur kein reales Objekt darstellt, die bessere Option.

John Smith
quelle
8

Es ist auch erwähnenswert, dass Sie mit Casting kein Objekt erstellen müssen, wie in der Antwort von @Bandula angegeben. Stattdessen können Sie Ihr Array einfach in ein Objekt umwandeln und die stdClass wird zurückgegeben. Zum Beispiel:

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

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

Output: again

Antonius
quelle
Liebe es. Viel sauberer!
WebSpanner
7

Eigentlich habe ich versucht, eine leere stdClass zu erstellen und die Geschwindigkeit mit einer leeren Klasse verglichen.

class emp{}

Anschließend wurden 1000 stdClasses und emps erstellt. Leere Klassen wurden in etwa 1100 Mikrosekunden erstellt, während stdClasses über 1700 Mikrosekunden dauerte. Ich denke, es ist besser, eine eigene Dummy-Klasse zum Speichern von Daten zu erstellen, wenn Sie Objekte dafür so schlecht verwenden möchten (Arrays sind sowohl beim Schreiben als auch beim Lesen viel schneller).

Salbei
quelle
22
anscheinend wird der Unterschied durch den Unterschied in der Namenslänge verursacht. Wenn Sie die Klasse "averylongclassnamefornoapparentreason" nennen, dauert das Erstellen viel länger. Also geh Figur.
Salbei
27
Hmmm ... vorzeitige Optimierung. Ich würde lieber komplexe SQL-Abfragen oder andere Netzwerkengpässe finden, wenn ich mich wirklich mit Geschwindigkeit befasse, anstatt Zeit damit zu verbringen, 600 Mikrosekunden zu sparen. Eigentlich würde ich lieber zuerst prüfen, ob sich Javascript in der Fußzeile befindet, als sich darum zu kümmern, ob eine 600 Mikrosekunden schneller ist als die andere.
Ardee Aram
6
1000 ist zu klein für einen zuverlässigen Benchmark. Versuchen Sie es mit einer Milliarde.
Rechtsfalte
1
In der PHP-Welt ist es fast immer besser, Arrays zu verwenden.
Vahid Amiri
^ Auf keinen Fall so. Array Hell ist ein Albtraum, wenn man in einem Team an einem großen Projekt arbeitet.
Davie Dave
6

Verwendete stdClass-Objekte

Mit der stdClass können Sie anonyme Klassen erstellen und mit Objekt-Casting auch auf Schlüssel eines assoziativen Arrays im OOP-Stil zugreifen. Genau wie Sie auf die reguläre Objekteigenschaft zugreifen würden.

Beispiel

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

wird widerhallen

John Doe

DevWL
quelle
5

Wenn Sie schnell ein neues Objekt erstellen möchten, das einige Daten zu einem Buch enthält. Sie würden so etwas tun:

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

Weitere Informationen finden Sie auf der Website unter http://www.webmaster-source.com/2009/08/20/php-stdclass-storing-data-object-instead-array/ .

Niladri Banerjee - Uttarpara
quelle
4

Bitte beachten Sie, dass 2 leere stdClasses nicht unbedingt gleich sind. Dies ist sehr wichtig, wenn Sie spöttische Erwartungen schreiben.

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
quelle
Da es sich NICHT um dieselbe Instanz handelt, kann es daher nicht gleich sein. Ein strikter Vergleich von Klassen funktioniert mit der Instanzidentifikation. Jede Instanz einer Klasse hat eine eindeutige ID.
Bednic
3

Das Handbuch zu php.net enthält einige solide Erklärungen und Beispiele, die von Benutzern von stdClass beigesteuert wurden. Besonders gut gefällt mir dieses Handbuch http://php.net/manual/en/language.oop5.basic.php#92123 , https: // stackoverflow.com/a/1434375/2352773 .

stdClass ist das Standard-PHP-Objekt. stdClass hat keine Eigenschaften, Methoden oder Eltern. Es unterstützt keine magischen Methoden und implementiert keine Schnittstellen.

Wenn Sie einen Skalar oder ein Array als Objekt umwandeln, erhalten Sie eine Instanz von stdClass. Sie können stdClass verwenden, wenn Sie eine generische Objektinstanz benötigen.

stdClass ist KEINE Basisklasse! PHP-Klassen erben nicht automatisch von einer Klasse. Alle Klassen sind eigenständig, es sei denn, sie erweitern explizit eine andere Klasse. PHP unterscheidet sich in dieser Hinsicht von vielen objektorientierten Sprachen.

Sie könnten eine Klasse definieren, die stdClass erweitert, aber Sie würden keinen Vorteil erhalten, da stdClass nichts tut.

Danijel
quelle
3

ist eine Art und Weise, in der die Vermeiden Sie es, die Interpretation des Skripts zu beenden, wenn Daten in eine Klasse eingefügt werden müssen. Leider wurde diese Klasse nicht definiert

Beispiel:

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

Hier werden die Daten in die vordefinierten 'Aufgaben' gestellt. Aber wenn wir den Code so gemacht hätten:

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

dann ist die wird die Ergebnisse in setzen .

einfach sagt das: schau, wir haben ein gutes KINDER [Objekte] Hier aber ohne Eltern. Also werden wir sie in ein Kinderbetreuungsheim schicken :) :)

Nasir Nasrallah
quelle
2

Sie können auch objectArrays in ein Objekt Ihrer Wahl umwandeln:

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

Um nun ein Objekt vom Typ zu erstellen Exampleund zu initialisieren, haben Sie folgende Möglichkeiten:

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

ODER

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

Die zweite Methode ist hauptsächlich nützlich, um Objekte mit vielen Eigenschaften zu initialisieren.

Vahid Amiri
quelle
1

stClass ist eine leere Klasse, die von PHP selbst erstellt wurde und nur von PHP verwendet werden sollte, da es sich nicht nur um eine "leere" Klasse handelt. PHP verwendet stdClass, um Arrays in den Objektstil zu konvertieren, wenn Sie stdClass verwenden müssen. Ich empfehle zwei bessere Optionen : 1- Verwenden Sie Arrays (viel schneller als Klassen) 2- Erstellen Sie Ihre eigene leere Klasse und verwenden Sie sie

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

Was bringt jemanden dazu, über die Verwendung des Objektstils anstelle des Array-Stils nachzudenken?

Sherif Eldeeb
quelle
0

Der Grund, warum wir stdClass haben, ist, dass es in PHP keine Möglichkeit gibt, ein normales Array von einem zugeordneten Array zu unterscheiden (wie in Javascript, das Sie {}für Objekt und []Array haben, um sie zu unterscheiden).

Dies schafft also ein Problem für leere Objekte. Nehmen Sie das zum Beispiel.

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)

Angenommen, Sie möchten die Variable $ c mit JSON codieren

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

Angenommen, Sie haben alle Schlüssel gelöscht $b, um sie leer zu machen. Da $bes jetzt leer ist (Sie haben alle Schlüssel gelöscht, erinnern Sie sich?), Sieht es so aus, als könnte es []sich entweder um ein Array oder ein Objekt handeln, wenn Sie es betrachten.

Wenn Sie also erneut einen json_encode ausführen, ist die Ausgabe anders

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

Dies ist ein Problem, da wir wissen, bdass dies ein assoziiertes Array sein sollte, PHP (oder eine Funktion wie json_encode) jedoch nicht.

Also kommt stdClass zur Rettung. Nehmen Sie noch einmal das gleiche Beispiel

$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)

Selbst wenn Sie jetzt alle Schlüssel aus löschen $bund leer machen, spielt es keine Rolle, da es sich um eine stdClass handelt. Wenn Sie json_encode verwenden, erhalten Sie Folgendes:

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

Dies ist auch der Grund, warum json_encodeund json_decodestandardmäßig stdClass zurückgegeben wird.

 $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
quelle