Wie kann ich eine Eigenschaft aus einem bestimmten Argument in der Methode eines Objekts erstellen?
class Foo{
public function createProperty($var_name, $val){
// here how can I create a property named "$var_name"
// that takes $val as value?
}
}
Und ich möchte in der Lage sein, auf die Immobilie zuzugreifen wie:
$object = new Foo();
$object->createProperty('hello', 'Hiiiiiiiiiiiiiiii');
echo $object->hello;
Ist es auch möglich, dass ich das Eigentum öffentlich / geschützt / privat machen könnte? Ich weiß, dass es in diesem Fall öffentlich sein sollte, aber ich möchte vielleicht einige magische Methoden hinzufügen, um geschützte Eigenschaften und Sachen zu erhalten :)
Ich glaube, ich habe eine Lösung gefunden:
protected $user_properties = array();
public function createProperty($var_name, $val){
$this->user_properties[$var_name] = $val;
}
public function __get($name){
if(isset($this->user_properties[$name])
return $this->user_properties[$name];
}
Denkst du, es ist eine gute Idee?
php
object
properties
Alex
quelle
quelle
$this->$name = $value;
sollte eigentlich sein$this->name = $value;
$this->{$name} = $value;
nein?$this->{$name}
Istead of$this->name
Cause" verwenden,$this->name
wird nur eineDas folgende Beispiel ist für diejenigen gedacht, die keine ganze Klasse deklarieren möchten.
$test = (object) []; $prop = 'hello'; $test->{$prop} = 'Hiiiiiiiiiiiiiiii'; echo $test->hello; // prints Hiiiiiiiiiiiiiiii
quelle
Die Überladung von Immobilien ist sehr langsam. Wenn Sie können, versuchen Sie es zu vermeiden. Wichtig ist auch die Implementierung der beiden anderen magischen Methoden:
__isset (); __unset ();
Wenn Sie später bei der Verwendung dieser Objektattribute keine häufigen Fehler finden möchten
Hier sind einige Beispiele:
http://www.php.net/manual/en/language.oop5.overloading.php#language.oop5.overloading.members
EDITIERT nach Alex Kommentar:
Sie können die Zeitunterschiede zwischen beiden Lösungen selbst überprüfen (ändern Sie $ REPEAT_PLEASE).
<?php $REPEAT_PLEASE=500000; class a {} $time = time(); $a = new a(); for($i=0;$i<$REPEAT_PLEASE;$i++) { $a->data = 'hi'; $a->data = 'bye'.$a->data; } echo '"NORMAL" TIME: '.(time()-$time)."\n"; class b { function __set($name,$value) { $this->d[$name] = $value; } function __get($name) { return $this->d[$name]; } } $time=time(); $a = new b(); for($i=0;$i<$REPEAT_PLEASE;$i++) { $a->data = 'hi'; //echo $a->data; $a->data = 'bye'.$a->data; } echo "TIME OVERLOADING: ".(time()-$time)."\n";
quelle
Verwenden Sie die Syntax: $ object -> {$ property} wobei $ property eine Zeichenfolgenvariable ist und $ object dies sein kann, wenn es sich innerhalb der Klasse oder eines Instanzobjekts befindet
Live-Beispiel: http://sandbox.onlinephpfunctions.com/code/108f0ca2bef5cf4af8225d6a6ff11dfd0741757f
class Test{ public function createProperty($propertyName, $propertyValue){ $this->{$propertyName} = $propertyValue; } } $test = new Test(); $test->createProperty('property1', '50'); echo $test->property1;
Ergebnis: 50
quelle