Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-Klassen und -Objekte – Überladung

PHP-Klassen und -Objekte – Überladung

伊谢尔伦
伊谢尔伦Original
2016-11-23 14:03:22902Durchsuche

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 &#39;$name&#39; to &#39;$value&#39;<br>";
        $this->data[$name] = $value;
    }
    public function __get($name)
    {
        echo "Getting &#39;$name&#39;<br>";
        if(array_key_exists($name,$this->data)){
            return $this->data[$name];
        }
        $trace = debug_backtrace();
        trigger_error(&#39;未知属性 via __get():&#39;.$name.&#39; in &#39;.$trace[0][&#39;file&#39;].&#39; on line &#39;.$trace[0][&#39;line&#39;],
            E_USER_NOTICE);  
        return null;
    }
    /*PHP5.1.0之后的版本*/
    public function __isset($name){
        echo "Is &#39;$name&#39; set?<br>";
        return isset($this->data[$name]);
    }
    /*PHP5.1.0之后的版本*/
    public function __unset($name){
        echo "Unsetting &#39;$name&#39;<br>";
        unset($this->data[$name]);
    }
    /*非魔术方法*/
    public function getHidden(){
        return $this->hidden;
    }
}
echo &#39;<pre class="brush:php;toolbar:false">&#39;;
$obj = new PropertyTest;
$obj->a = 1;
echo $obj->a.&#39;<br>&#39;;
var_dump(isset($obj->a));
unset($obj->a);
echo &#39;<br>&#39;;
echo $obj->declared.&#39;<br>&#39;;
echo "Let&#39;s experiment with the private property named &#39;hidden&#39;:<br>";
echo "Privates are visible inside the class,so __set() not used...<br>";
echo $obj->getHidden().&#39;<br>&#39;;
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 &#39;$name&#39; ".implode(&#39;,&#39;,$argument).&#39;<br>&#39;;
    }
    //PHP5.3.0之后的版本
    public static function __callStatic($name,$arguments)
    {
        //注意:$name的值区分大小写
        echo "Calling static method &#39;$name&#39; ".implode(&#39;,&#39;,$argument).&#39;<br>&#39;;
    }
}
$obj = new MethodTest;
$obj -> runTest(&#39;in object context&#39;);
MethodTest::runTest(&#39;in static context&#39;);

Ausgabeergebnis:

Aufruf der Objektmethode „runTest“

Aufruf der Objektmethode 'runTest'


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