Ich habe Objekteigenschaften in meinem Code, die folgendermaßen aussehen:
$obj ->field_name_cars[0];
$obj ->field_name_clothes[0];
Das Problem ist, dass ich Hunderte von Feldnamen habe und den Eigenschaftsnamen dynamisch schreiben muss. Andernfalls sind der Objektname und die Schlüssel für die Eigenschaft immer identisch. Also habe ich versucht:
$obj -> $field[0];
In der Hoffnung, dass der Name der Eigenschaft dynamisch geändert wird und auf die richtigen Werte zugegriffen wird. Aber ich bekomme immer wieder 'undefined property $ field in stdClass :: $ field;
Mehr oder weniger versuche ich, das PHP dynamisch zu schreiben, bevor es ausgeführt wird, damit es die richtigen Werte ausgeben kann. Gedanken darüber, wie man das angeht?
Ich denke, Sie suchen nach einer Typennotation mit variablen Variablen, die beim Zugriff auf Werte von anderen Arrays / Objekten am besten mit der folgenden Syntax für geschweifte Klammern erreicht wird:
$obj->{field[0]}
quelle
Die magische Methode __get ist dein Freund:
class MyClass { private $field = array(); public function __get($name) { if(isset($this->field[$name])) return $this->field[$name]; else throw new Exception("$name dow not exists"); } }
Verwendung:
$myobj = new MyClass(); echo $myobj->myprop;
Erläuterung: Alle Ihre Felddaten werden in einem Array gespeichert. Wenn Sie auf
$myobj->myprop
diese Eigenschaft zugreifen , ist sie in der Klasse offensichtlich nicht vorhanden. Dort__get
heißt es.__get
sucht den Namen imfield
Array und gibt den richtigen Wert zurück.quelle
aboulfazl, da PHP 5.3.3-Methoden mit demselben Namen wie die Klasse nicht als Konstruktor behandelt werden!
YourClass { public $any = false; public function __construct($any = null) { $this->any = (is_null($any) ? $this->any : $any); } }
Dies funktioniert, wurde aber nicht vom Themeninhaber gefragt, Jon gibt die Antwort!
quelle
Ich habe an Code gearbeitet, der dynamisch erstellte Objekteigenschaften verwendet. Ich fand die Verwendung dynamisch erstellter Objekteigenschaften ziemlich cool (meiner Meinung nach wahr). Die Ausführung meines Programms dauerte jedoch 7 Sekunden. Ich habe die dynamischen Objekteigenschaften entfernt und sie ersetzt, die als Teil jeder Klasse deklariert wurden (in diesem Fall öffentlich). Die CPU-Zeit stieg von über 7 Sekunden auf 0,177 Sekunden. Das ist ziemlich umfangreich.
Es ist möglich, dass ich bei der Verwendung dynamischer Objekteigenschaften etwas falsch gemacht habe. Es ist auch möglich, dass meine Konfiguration auf irgendeine Weise beschädigt ist. Natürlich sollte ich sagen, dass ich eine sehr einfache Vanille-PHP-Konfiguration auf meinem Computer habe.
quelle
Heute stehe ich vor dieser Herausforderung. Am Ende hatte ich diesen Entwicklungsstil
$countTickets = new \stdClass; foreach ($tickets as $key => $value) { if(!isset($countTickets->total)){ $countTickets->total = 0; } if(!isset($countTickets->{$value['categoryname']})){ $countTickets->{$value['categoryname']} = 0; } $countTickets->total += $value['number']; $countTickets->{$value['categoryname']} += $value['number']; }
quelle
Am besten können Sie die Instanz der PHP-Standardklasse Object verwenden, um ihr dynamisch Eigenschaften zuzuweisen
$inst=new \StdClass; $inst->any_property = '';
quelle
Mit Vererbung. zum Beispiel:
YourClass extends stdClass { public function YourClass() { $this->AnyProperty="any"; } }
Jetzt wird AnyProperty dynamisch deklariert.
quelle