Heim  >  Artikel  >  Backend-Entwicklung  >  [PHP-Klassen und -Objekte] überladen

[PHP-Klassen und -Objekte] überladen

不言
不言Original
2018-04-13 10:52:281469Durchsuche

Der Inhalt, der in diesem Artikel mit Ihnen geteilt wird, befasst sich mit der Überladung von [PHP-Klassen und -Objekten], die einen bestimmten Referenzwert haben.

Überladung (Überladung)

Definition: Bezieht sich auf das dynamische „Erstellen“ von Klassenattributen und -methoden.

Implementierung: Magische Methode.

Ü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

Keiner der Parameter dieser magischen Methoden kann als Referenz übergeben werden.


Attributüberladung

public void __set ( string $name , mixed $value )
在给不可访问属性赋值时,__set() 会被调用。public mixed __get ( string $name )
读取不可访问属性的值时,__get() 会被调用.public bool __isset ( string $name )
当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。public void __unset ( string $name )
当对不可访问属性调用 unset() 时,__unset() 会被调用。

Parameter $name bezieht sich auf den Namen der Variablen, die bearbeitet werden soll. Der $value-Parameter der __set()-Methode gibt den Wert der $name-Variablen an.

Eigenschaftsüberladung kann nur in Objekten durchgeführt werden. Ab PHP 5.3.0 führt die Definition dieser magischen Methoden als statisch zu einer Warnung. In statischen Methoden werden diese magischen Methoden nicht aufgerufen. Daher kann keine dieser Methoden als statisch deklariert werden.

【未懂】
在除 isset() 外的其它语言结构中无法使用重载的属性,这意味着当对一个重载的属性使用 empty() 时,重载魔术方法将不会被调用。

为避开此限制,必须将重载属性赋值到本地变量再使用 empty()。
Example #1 使用 __get(),__set(),__isset() 和 __unset() 进行属性重载

<?php
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;\n";
        $this->data[$name] = $value;
    }    public function __get($name) 
    {
        echo "Getting &#39;$name&#39;\n";        if (array_key_exists($name, $this->data)) {            return $this->data[$name];
        }

        $trace = debug_backtrace();
        trigger_error(            &#39;Undefined property 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;
    }    /**  PHP 5.1.0之后版本 */
    public function __isset($name) 
    {
        echo "Is &#39;$name&#39; set?\n";        return isset($this->data[$name]);
    }    /**  PHP 5.1.0之后版本 */
    public function __unset($name) 
    {
        echo "Unsetting &#39;$name&#39;\n";
        unset($this->data[$name]);
    }    /**  非魔术方法  */
    public function getHidden() 
    {        return $this->hidden;
    }
}


echo "<pre class="brush:php;toolbar:false">\n";

$obj = new PropertyTest;

$obj->a = 1;   //__set():  Setting &#39;a&#39; to &#39;1&#39;echo $obj->a . "\n\n";     //__get():  Getting &#39;a&#39;var_dump(isset($obj->a));  //__isset():    Is &#39;a&#39; set? bool(true)unset($obj->a);        //__unset():    Unsetting &#39;a&#39;var_dump(isset($obj->a));  //__isset():    Is &#39;a&#39; set? bool(false)echo "\n";

echo $obj->declared . "\n\n";  //可访问,__get()不被调用:1echo "Let&#39;s experiment with the private property named &#39;hidden&#39;:\n";
echo "Privates are visible inside the class, so __get() not used...\n";
echo $obj->getHidden() . "\n"; //可访问,__get()不被调用:2echo "Privates not visible outside of class, so __get() is used...\n";
echo $obj->hidden . "\n";  //__get():  Notice:  Undefined property via __get(): hidden in D:\phpStudy2018\PHPTutorial\WWW\index.php on line 75 in D:\phpStudy2018\PHPTutorial\WWW\index.php on line 31?>

Methodenüberladung

public mixed __call ( string $name , array $arguments )
在对象中调用一个不可访问方法时,__call() 会被调用。public static mixed __callStatic ( string $name , array $arguments )
在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。

Verwandte Empfehlungen:

Ausführliche Erklärung der Überladung in PHP

Einführung in das PHP-Neuladen

Das obige ist der detaillierte Inhalt von[PHP-Klassen und -Objekte] überladen. 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