Bitte definieren Sie, was stdClass
ist.
Antworten
Zu viele Anzeigen?使用方法 stdClass können Sie ein neues Objekt mit seinen 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"] = "smith@nomail.com";
Wenn Sie die gleichen Details wie die Eigenschaften eines Objekts darstellen müssen, können Sie stdClass wie unten.
$obj_user = new stdClass;
$obj_user->name = "smith john";
$obj_user->username = "smith";
$obj_user->id = "1002";
$obj_user->email = "smith@nomail.com";
Wenn Sie ein Joomla-Entwickler sind, empfehlen dieses Beispiel in den Joomla-Dokumenten zum weiteren Verständnis.
Der Grund, warum wir stdClass ist, weil es in PHP keine Möglichkeit gibt, ein normales Array von einem assoziierten Array zu unterscheiden (wie in Javascript haben Sie {}
für Objekt und []
für das Array, um sie zu unterscheiden).
Dies stellt ein Problem für leere Objekte dar. Nehmen wir zum Beispiel dies.
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)
Nehmen wir an, Sie möchten die Variable $c in JSON kodieren
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {one: 1, two: 2}}
Nehmen wir nun an, Sie haben alle Schlüssel aus $b
und macht ihn leer. Da $b
jetzt leer ist (Sie haben alle Schlüssel gelöscht, erinnern Sie sich?), sieht es so aus []
das entweder ein Array oder ein Objekt sein kann.
Wenn Sie also erneut einen json_encode durchführen, wird die Ausgabe anders aussehen
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': []}
Dies ist ein Problem, denn wir wissen b
das eigentlich ein assoziiertes Array sein sollte, aber PHP (oder eine Funktion wie json_encode) tut das nicht.
Also kommt stdClass zur Rettung. Nehmen wir 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 nun alle Schlüssel aus $b
und machen Sie es leer, da es eine stdClass ist es keine Rolle, und wenn Sie json_encode es erhalten Sie diese:
echo json_encode($c);
// outputs => {'a': [1,2,3], 'b': {}}
Dies ist auch der Grund, warum json_encode
y json_decode
standardmäßig stdClass zurück.
$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
StdClass ist weder eine anonyme Klasse noch ein anonymes Objekt
Die Antworten umfassen Ausdrücke, die stdClass
ist eine anonyme Klasse oder sogar ein anonymes Objekt. Es ist kein echtes.
stdClass
ist einfach eine normale vordefinierte Klasse. Sie können dies überprüfen mit instanceof
Operator oder Funktion get_class
. Hier geht nichts Besonderes. PHP verwendet diese Klasse beim Casting anderer Werte in ein Objekt.
In vielen Fällen, in denen stdClass
von den Programmierern verwendet wird, ist das Array die bessere Option, weil es nützliche Funktionen bietet und die Tatsache, dass dieser Anwendungsfall die Datenstruktur und nicht ein echtes Objekt darstellt.
Es ist auch erwähnenswert, dass durch die Verwendung von Casting Sie nicht wirklich brauchen, um ein Objekt wie in der Antwort von @Bandula gegeben zu erstellen. 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
StdClass-Objekte in Verwendung
Mit der stdClass können Sie anonyme Klassen erstellen und mit Objekt-Casting können Sie auch auf Schlüssel eines assoziativen Arrays im OOP-Stil zugreifen. Genauso wie Sie auf die normale 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"]);
echot dann
Unbekannter