Heim > Artikel > Backend-Entwicklung > PHP-Klassen und -Objekte – Überladung
Das von PHP bereitgestellte „Überladen“ bezieht sich auf das dynamische „Erstellen“ von Klassenattributen und -methoden. Wir tun dies durch magische Methoden.
Überladene Methoden werden aufgerufen, wenn Klassenattribute oder Methoden aufgerufen werden, die in der aktuellen Umgebung undefiniert oder unsichtbar sind.
Alle überladenen Methoden müssen als öffentlich deklariert werden.
Hinweis:
1) Keiner der Parameter dieser magischen Methoden kann als Referenz übergeben werden.
2) „Überladen“ in PHP unterscheidet sich von den meisten anderen objektorientierten Sprachen. Traditionelles „Überladen“ wird verwendet, um mehrere Klassenmethoden mit demselben Namen bereitzustellen, aber die Parametertypen und -nummern jeder Methode sind unterschiedlich.
Eigenschaftsüberladung
public void__set(string$name, mixed$value) publicmixed__get(string$name) publicbool__isset(string$name) publicvoid__unset(string$name)
Wenn einer unzugänglichen Eigenschaft ein Wert zugewiesen wird, wird __set() aufgerufen.
Beim Lesen des Werts einer unzugänglichen Eigenschaft wird __get() aufgerufen.
Wenn isset() oder empty() für eine unzugängliche Eigenschaft aufgerufen wird, wird __isset() aufgerufen.
Wenn unset() für eine unzugängliche Eigenschaft aufgerufen wird, wird __unset() aufgerufen.
Der Parameter $name bezieht sich auf den Namen der zu bedienenden Variablen. Der Parameter $value der Methode __set() gibt den Wert der Variablen $name an.
Eigenschaftsüberladung kann nur in Objekten durchgeführt werden. In statischen Methoden werden diese magischen Methoden nicht aufgerufen. Daher kann keine dieser Methoden als statisch deklariert werden. Ab PHP 5.3.0 wird eine Warnung generiert, wenn diese magischen Methoden als statisch definiert werden.
Hinweis:
Aufgrund der Art und Weise, wie PHP Zuweisungsvorgänge verarbeitet, wird der Rückgabewert von __set() ignoriert. Ebenso wird __get() in der folgenden Kettenzuweisung nicht aufgerufen:
$a = $obj->b = 8;
Hinweis:
Überladene Eigenschaften kann nicht in anderen Sprachkonstrukten außer isset() verwendet werden, was bedeutet, dass die überladene Magic-Methode nicht aufgerufen wird, wenn empty() für eine überladene Eigenschaft verwendet wird.
Um diese Einschränkung zu vermeiden, müssen Sie das überladene Attribut einer lokalen Variablen zuweisen und dann empty() verwenden.
Beispiel #1 Verwenden Sie __get(), __set(), __isset() und __unset() für die Attributüberladung
class PropertyTest{ /*被重载的数据保存在此*/ private $data = array(); /*重载不能被用在已经定义的属性*/ public $declared = 1; /*只有从类外部访问这个属性时,重载才会发生*/ private $hidden = 2; public function __set($name,$value) { echo "Setting '$name' to '$value'<br>"; $this->data[$name] = $value; } public function __get($name) { echo "Getting '$name'<br>"; if(array_key_exists($name,$this->data)){ return $this->data[$name]; } $trace = debug_backtrace(); trigger_error('未知属性 via __get():'.$name.' in '.$trace[0]['file'].' on line '.$trace[0]['line'], E_USER_NOTICE); return null; } /*PHP5.1.0之后的版本*/ public function __isset($name){ echo "Is '$name' set?<br>"; return isset($this->data[$name]); } /*PHP5.1.0之后的版本*/ public function __unset($name){ echo "Unsetting '$name'<br>"; unset($this->data[$name]); } /*非魔术方法*/ public function getHidden(){ return $this->hidden; } } echo '<pre class="brush:php;toolbar:false">'; $obj = new PropertyTest; $obj->a = 1; echo $obj->a.'<br>'; var_dump(isset($obj->a)); unset($obj->a); echo '<br>'; echo $obj->declared.'<br>'; echo "Let's experiment with the private property named 'hidden':<br>"; echo "Privates are visible inside the class,so __set() not used...<br>"; echo $obj->getHidden().'<br>'; echo "Privates not visible outside of class,so __get() is used...<br>"; echo $obj->hidden;
Ausgabeergebnis:
Setting 'a ' zu '1'
'a' abrufen
1
Ist 'a' gesetzt?
bool(true)
Deaktivieren von 'a '
1
Lassen Sie uns mit der privaten Eigenschaft namens „hidden“ experimentieren:
Private sind innerhalb der Klasse sichtbar, daher wird __set() nicht verwendet...
2
Privates sind außerhalb des Unterrichts nicht sichtbar, daher wird __get() verwendet...
Werden „versteckt“
Methodenüberladung
public mixed __call ( string$name , array$arguments ) public static mixed __callStatic ( string$name , array$arguments )
Wenn eine unzugängliche Methode in einem Objekt aufgerufen wird, wird __call() aufgerufen.
Beim Aufrufen einer unzugänglichen Methode im statischen Modus wird __callStatic() aufgerufen.
Der Parameter $name ist der Name der aufzurufenden Methode. Der Parameter $arguments ist ein Aufzählungsarray, das die Parameter enthält, die an die Methode $name übergeben werden sollen.
Beispiel #2 Verwenden Sie __call() und __callStatic(), um die Methode zu überladen
class MethodTest { public function __call($name,$arguments) { //注意:$name的值区分大小写 echo "Calling object method '$name' ".implode(',',$argument).'<br>'; } //PHP5.3.0之后的版本 public static function __callStatic($name,$arguments) { //注意:$name的值区分大小写 echo "Calling static method '$name' ".implode(',',$argument).'<br>'; } } $obj = new MethodTest; $obj -> runTest('in object context'); MethodTest::runTest('in static context');
Ausgabeergebnis:
Aufruf der Objektmethode „runTest“
Aufruf der Objektmethode 'runTest'