Das muss einfach sein, aber ich kann anscheinend keine Antwort finden ...
Ich habe ein generisches stdClass-Objekt $foo
ohne Eigenschaften. Ich möchte eine neue Eigenschaft hinzufügen $bar
, die noch nicht definiert ist. Wenn ich das mache:
$foo = new StdClass();
$foo->bar = '1234';
PHP im strengen Modus beschwert sich.
Was ist der richtige Weg (außerhalb der Klassendeklaration), um einem bereits instanziierten Objekt eine Eigenschaft hinzuzufügen?
HINWEIS: Ich möchte, dass die Lösung mit dem generischen PHP-Objekt vom Typ stdClass funktioniert.
Ein kleiner Hintergrund zu diesem Thema. Ich decodiere eine JSON-Zeichenfolge, die ein Array von JSON-Objekten ist. json_decode()
generiert ein Array von StdClass-Objekten. Ich muss diese Objekte manipulieren und jedem eine Eigenschaft hinzufügen.
TRUE
als 2. Parameter an zu übergebenjson_decode
. Sie erhalten ein assoziatives Array anstelle eines Arrays von Objekten.Antworten:
Wenn Sie die Eigenschaft unbedingt zum Objekt hinzufügen müssen, können Sie sie meiner Meinung nach als Array umwandeln, Ihre Eigenschaft (als neuen Array-Schlüssel) hinzufügen und dann als Objekt zurücksetzen. Das einzige Mal,
stdClass
wenn Sie auf Objekte stoßen (glaube ich), ist, wenn Sie ein Array als Objekt umwandeln oder wenn Sie ein neuesstdClass
Objekt von Grund auf neu erstellen (und natürlich, wenn Siejson_decode()
etwas tun - dumm, dass ich es vergessen habe!).Anstatt:
$foo = new StdClass(); $foo->bar = '1234';
Du würdest tun:
$foo = array('bar' => '1234'); $foo = (object)$foo;
Oder wenn Sie bereits ein vorhandenes stdClass-Objekt hatten:
$foo = (array)$foo; $foo['bar'] = '1234'; $foo = (object)$foo;
Auch als 1 Liner:
$foo = (object) array_merge( (array)$foo, array( 'bar' => '1234' ) );
quelle
error_reporting(E_STRICT);
aufPHP 5.3.15-1~dotdeb.0 with Suhosin-Patch
, ich bekomme keine Fehler oder Hinweise , wenn eine nicht vorhandene Eigenschaft auf einem stdClass Objekt zu setzen versucht. Welche Version von PHP verwenden Sie?Mach es so:
$foo = new stdClass(); $foo->{"bar"} = '1234';
Versuchen Sie jetzt:
echo $foo->bar; // should display 1234
quelle
Wenn Sie den dekodierten JSON bearbeiten möchten, versuchen Sie, ihn als assoziatives Array anstelle eines Arrays von Objekten abzurufen.
$data = json_decode($json, TRUE);
quelle
Ich benutze immer so:
$foo = (object)null; //create an empty object $foo->bar = "12345"; echo $foo->bar; //12345
quelle
Sie sollten magische Methoden __Set und __get verwenden. Einfaches Beispiel:
class Foo { //This array stores your properties private $content = array(); public function __set($key, $value) { //Perform data validation here before inserting data $this->content[$key] = $value; return $this; } public function __get($value) { //You might want to check that the data exists here return $this->$content[$value]; } }
Verwenden Sie dieses Beispiel natürlich nicht wie folgt: überhaupt keine Sicherheit :)
EDIT: Ihre Kommentare gesehen, hier könnte eine Alternative sein, die auf Reflexion und einem Dekorateur basiert:
class Foo { private $content = array(); private $stdInstance; public function __construct($stdInstance) { $this->stdInstance = $stdInstance; } public function __set($key, $value) { //Reflection for the stdClass object $ref = new ReflectionClass($this->stdInstance); //Fetch the props of the object $props = $ref->getProperties(); if (in_array($key, $props)) { $this->stdInstance->$key = $value; } else { $this->content[$key] = $value; } return $this; } public function __get($value) { //Search first your array as it is faster than using reflection if (array_key_exists($value, $this->content)) { return $this->content[$value]; } else { $ref = new ReflectionClass($this->stdInstance); //Fetch the props of the object $props = $ref->getProperties(); if (in_array($value, $props)) { return $this->stdInstance->$value; } else { throw new \Exception('No prop in here...'); } } } }
PS: Ich habe meinen Code nicht getestet, nur die allgemeine Idee ...
quelle
Ich weiß nicht, ob es die neuere Version von PHP ist, aber das funktioniert. Ich benutze PHP 5.6
<?php class Person { public $name; public function save() { print_r($this); } } $p = new Person; $p->name = "Ganga"; $p->age = 23; $p->save();
Das ist das Ergebnis. Die Speichermethode erhält tatsächlich die neue Eigenschaft
Person Object ( [name] => Ganga [age] => 23 )
quelle
Ja, es ist möglich, einem PHP-Objekt dynamisch Eigenschaften hinzuzufügen.
Dies ist nützlich, wenn ein Teilobjekt aus Javascript empfangen wird.
JAVASCRIPT Seite:
var myObject = { name = "myName" }; $.ajax({ type: "POST", url: "index.php", data: myObject, dataType: "json", contentType: "application/json;charset=utf-8" }).success(function(datareceived){ if(datareceived.id >= 0 ) { /* the id property has dynamically added on server side via PHP */ } });
PHP-Seite:
$requestString = file_get_contents('php://input'); $myObject = json_decode($requestString); // same object as was sent in the ajax call $myObject->id = 30; // This will dynamicaly add the id property to the myObject object
ODER SENDEN SIE NUR EIN DUMMY-EIGENTUM aus Javascript, das Sie in PHP ausfüllen werden.
quelle