Bitte definieren Sie was stdClass
ist.
Bitte definieren Sie was stdClass
ist.
Antworten:
stdClass
ist die generische leere Klasse von PHP, ähnlich wie Object
in Java oder object
Python ( 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::__soapCall
gibt 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 .
{}
Konstrukt von JavaScript ist .
function(StdClass $a, array $params)
überprüfen, ob $a
es sich um ein Objekt handelt und instanceof
.
stdClass
ist nur eine generische 'leere' Klasse, die verwendet wird, wenn andere Typen in Objekte umgewandelt werden. Trotz der beiden anderen Antworten stdClass
ist 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
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();
stdClass
.
Erwähnenswert ist auch, dass ein stdClass
Objekt auch aus der Verwendung von erstellt werden kann json_decode()
.
True
. Boolesche Werte sind Kleinbuchstaben true
oder false
.
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"] = "smith@nomail.com";
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 = "smith@nomail.com";
Wenn Sie ein Joomla-Entwickler sind, lesen Sie dieses Beispiel in den Joomla-Dokumenten, um weitere Informationen zu erhalten.
Gleichfalls,
$myNewObj->setNewVar = 'newVal';
ergibt ein stdClass-Objekt - automatisch umgewandelt
Ich habe das heute durch Rechtschreibfehler herausgefunden:
$GLOBASLS['myObj']->myPropertyObj->myProperty = 'myVal';
Cool!
Die Antworten hier enthalten Ausdrücke, stdClass
die eine anonyme Klasse oder sogar ein anonymes Objekt sind. Es ist nicht wahr.
stdClass
ist nur eine reguläre vordefinierte Klasse. Sie können dies mit dem instanceof
Operator 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 stdClass
das 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.
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
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).
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.
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
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/ .
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 >
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.
Standardklasse ist eine Art und Weise, in der die php 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 php wird die Ergebnisse in setzen Standardklasse .
einfach phpsagt das: schau, wir haben ein gutes KINDER [Objekte] Hier aber ohne Eltern. Also werden wir sie in ein Kinderbetreuungsheim schickenStandardklasse :) :)
Sie können auch object
Arrays in ein Objekt Ihrer Wahl umwandeln:
Class Example
{
public $name;
public $age;
}
Um nun ein Objekt vom Typ zu erstellen Example
und 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.
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?
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 $b
es 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, b
dass 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 $b
und 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_encode
und json_decode
standardmäß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