Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung der magischen PHP-Methoden __get(), __set(), __call(), __callStatic() und der statischen Verwendung

Detaillierte Erläuterung der magischen PHP-Methoden __get(), __set(), __call(), __callStatic() und der statischen Verwendung

伊谢尔伦
伊谢尔伦Original
2017-07-03 11:43:443196Durchsuche

Nach PHP5 habe ich einige magische Methoden implementiert, die schon früher prozessorientierte Programmiermethoden verwendet haben und in letzter Zeit weniger über Oop-Sachen geforscht haben ist ganz interessant.

Es fühlt sich so an, als ob viele Dinge wie magische Methoden nur der Faulheit dienen. Ich erinnere mich, dass ich damals beim Bloggen ein ausländisches Open-Source-Framework namens Lifetype verwendet habe immer noch PHP4. 3. Aber alle Objekte sind in diesem Framework implementiert und alle Daten sind in Objekten gekapselt.

Nachdem eine Reihe von Dingen aus der Datenbank ausgewählt wurden, müssen diese in einer Schleife einzeln in Objekte gekapselt werden. Jedes Feld muss außerdem die Methoden getField() und getField() implementieren Etwas mühsam zu schreiben. Es fühlt sich an, als würde man sich wiederholende Arbeiten erledigen.

Dann löste die Geburt dieser magischen Methoden get(), set(), call(), callStatic() dieses Problem vollständig.

get() und set() sind für Attribute in der Klasse, call() ist für Methoden und callStatic() ist für statische Klassenmethoden.

1. Die magischen Methoden Get() und set():

Wenn ein Objekt instanziiert wird und ein Attribut aufgerufen wird, das in der Klasse nicht vorhanden ist oder keine Zugriffsberechtigung hat , PHP wird standardmäßig aufgerufen. Dies spart nicht nur viel Code und macht die Struktur klarer, sondern bietet auch eine Methode für den externen Zugriff auf private Mitglieder der Klasse.

Zum Beispiel:

<?php
class testGet
{
  private $name = &#39;test&#39;;
}
$test = new testGet();
$test->name;

Wenn wir den obigen Code ausführen, wird ein Fehler gemeldet: PHP Fatal error: Cannot access private property testGet::$name in /Library/WebServer/ Dokuments/workspace/learn/call/a.php in Zeile 7

Aber ändern wir es und greifen wir über die get()-Methode darauf zu

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
}
$test = new testGet();
echo $test->name . PHP_EOL;

Code Änderungen Danach wird es für uns kein Problem mehr sein, uns erneut zu besuchen.

Hinweis: Wenn das Attribut als statisch definiert ist, wird auch beim Zugriff über get() ein Fehler gemeldet. Der Grund dafür ist, dass statische Mitglieder zur Klasse selbst gehören und sich aufgrund der Instanziierung nicht ändern, sodass Sie sie selbst testen können.

Mit der set()-Methode können Sie die dynamische Erstellung von Klassenattributen verhindern, wodurch unnötige Probleme für nachfolgende Entwickler oder Programmbetreuer vermieden werden können.

funciton set($property) {

//$property erhält den Namen der Eigenschaft

}

Um ehrlich zu sein, wird das Design von oop mit vielen eigenen Ideen des Designers vermischt, wenn es keine Dokumentation gibt, wird es für Nachzügler immer noch sehr schwierig sein Den Code zu lesen hat natürlich auch viel mit dem Niveau der Nachzügler zu tun.

Das Folgende ist ein Beispiel für die gemeinsame Verwendung von get und set:

<?php
class testGet
{
  private $name = &#39;test&#39;;

  function get($property) {
    if ( isset($this->$property) ) 
      return $this->$property;
    else
      return NULL;
  }
  
  public function set($property, $value) {
    if ( isset($this->$property) )
      $this->$property = $value;
    else
      return NULL;
  }
}
$test = new testGet();
$test->name = &#39;my test name&#39;;
echo $test->name . PHP_EOL;

function set($property, $value) {

//$property erhält den Namen des Attributs

//$value erhält den Wert des Attributs

}

2. Methoden call() und callStatic():

Wenn das Objekt eine Methode in der Klasse aufruft, die nicht existiert oder keine Zugriffsberechtigung hat, wird der Aufruf( )-Methode wird automatisch aufgerufen.

Ich erinnere mich, dass mich ein Kollege zuvor gefragt hat, warum es im TP-Framework viele Low-Level-Methoden gibt, die nicht verfügbar sind, aber dennoch in der oberen Ebene aufgerufen werden können. Tatsächlich ist es call(). Methode, die funktioniert.

Wenn Sie diese Methode nicht kennen, werden Sie sicherlich verwirrt sein und das Problem wird schwer zu lokalisieren sein.

<?php
abstract class Obj 
{
        private $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public function call($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return $this->objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return $this->objData[strtolower($matches[1])] = $args[0];
            }   
        }   
}
class User extends Obj
{
        
}
$user = new User();
$user->setName(&#39;test&#39;);
echo $user->getName();

Die User-Klasse macht nichts, aber alles (getName und setName), indem sie die call()-Methode der Klasse erbt.

function call($methodName, $args) {

//Der von $methodName aufgerufene Methodenname

//Von $argsarray

übergebene Parameter und call() entsprechen callStatic() Methoden dienen statischen Methoden statischer Klassen.

Beispiel:

<?php
    abstract class Obj 
    {
        private static $objData        = array();
        /** 
         * call魔术方法,如果对象请求的方法不存在或者没有权限访问的时候
         * 调用魔术方法
         */
        public static function callStatic($name, $args) {
            $field = preg_match(&#39;/^get(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] )
                return self::$objData[strtolower($matches[1])];
            $field = preg_match(&#39;/^set(\w+)/&#39;, $name, $matches);
            if ( $field && $matches[1] ) { 
                return self::$objData[strtolower($matches[1])] = $args[0];
            }   
        }   
    }
    class User extends Obj 
    {
    
    }
    User::setName(&#39;test&#39;);
    echo User::getName() . PHP_EOL;

3. Verzögerte statische Bindung: statisches Objekt

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der magischen PHP-Methoden __get(), __set(), __call(), __callStatic() und der statischen Verwendung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn