首頁  >  文章  >  後端開發  >  php魔術方法簡介

php魔術方法簡介

WJ
WJ轉載
2020-06-06 17:54:482351瀏覽

php魔術方法簡介

前面的話

  php在物件導向部分有很多相關的魔術方法,這些方法為物件導向實作提供了便利,本文將詳細介紹魔術方法

 

建構方法

  大多數類別都有一種稱為建構子的特殊方法。當建立一個物件時,它將自動呼叫建構函數,通常用它執行一些有用的初始化任務

  建構函數的宣告與其它操作的宣告一樣,只是其名稱必須是兩個下劃線__construct( )。這是PHP5中的變化;PHP4的版本中,建構子的名稱必須與類別名稱相同。為了向下相容,如果一個類別中沒有名為__construct( )的方法,PHP將搜尋一個與類別名稱相同的方法

void __construct ([ mixed $args [, $... ]] )

  如果子類別中定義了建構函式則不會隱含調用其父類別的建構子。要執行父類別的建構函數,需要在子類別的建構子中呼叫 parent::__construct()。如果子類別沒有定義建構函式則會如同一個普通的類別方法一樣從父類別繼承(假如沒有被定義為private 的話)

<?phpclass BaseClass {
   function __construct() {
       print "In BaseClass constructor
";
   }
}class SubClass extends BaseClass {
   function __construct() {
       parent::__construct();       print "In SubClass constructor
";
   }
}

 

析構方法

  與構造方法相對的就是析構方法。析構方法是PHP5新加入的內容,在PHP4沒有析構方法。析構方法是在物件被銷毀之前自動呼叫的方法,主要執行一些特定的操作,例如關閉文件,釋放結果集等

  與建構方法類似,一個類別的析構方法名稱必須是兩個底線__destruct( )。析構函數不能帶有任何參數

<?phpclass MyDestructableClass {
   function __construct() {
       print "In constructor
";       $this->name = "MyDestructableClass";
   }   function __destruct() {
       print "Destroying " . $this->name . "
";
   }
}//In constructor Destroying MyDestructableClass$obj = new MyDestructableClass();?>

 

不可存取屬性

#get()

  讀取不可存取屬性當 (protected、private)時,__get()會被調用,並將屬性名稱以第一個參數(string)傳進此方法中

public mixed __get ( string $name )

<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __get($name){
        echo "111{$name}111<br>";
    }
}$d1 = new demo;$d1->protected;//111protected111$d1->public;$d1->private;//111private111?>

set()

  在給不可存取屬性(protected、private)賦值時,__set() 會被調用,並將屬性名以第一個參數(string),值作為第二參數(mixed)傳進此方法中

public void __set ( string $name , mixed $value )
<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __set($name,$value){
        echo "0{$name}0{$value}<br>";
    }
}

isset()

  當對不可存取屬性( protected、private)呼叫isset() 或empty() 時,__isset() 會被呼叫

public bool __isset ( string $name )
<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __isset($name){
        echo "0{$name}0<br>";
    }
}

unset()

  當對不可存取屬性(protected、 private)呼叫unset()時,__unset()會被呼叫

public void __unset ( string $name )

<?phpclass demo{
    protected $protected = 1;    public $public = 2;    private $private = 3;    function __unset($name){
        echo "0{$name}0<br>";
    }
}

 

#物件複製

#clone()

  在物件複製時會自動呼叫clone()方法,這方法不需要任何參數,可以透過此方法對複製後的副本重新初始化

  clone()方法會自動包含this和that兩個物件的引用,this是副本物件的引用,that是原本物件的引用

<?php
    class Person{
        private $name;        private $sex;        private $age;        function __construct($name="",$sex="",$age=1){
            $this->name= $name;            $this->sex = $sex;            $this->age = $age;
        }        function __clone(){
            $this->name = $this->name."的副本";
        }        function say(){
            echo "我的名字:" .$this->name.",性别:".$this->sex.",年龄:".$this->age."<br>";
        }
    }

 

字串

toString()

  __toString()方法用於一個類別被當成字串時應怎樣回應,它是快速取得物件的字串表示的最便捷的方式,是直接輸出物件參考時自動呼叫的方法

27f86a6f2bfa46797024894dc6be4c25foo;
   }
}$class = new TestClass(Hello');echoclass/ }
}$class = new TestClass(Hello');echogello'); ?>

 

物件不存在

#call()

  在物件中呼叫一個不可存取方法時,__call()會被呼叫

callStatic()

  在靜態上下文中呼叫一個不可存取方法時,__callStatic()會被呼叫

<?phpclass MethodTest {
    public function __call($name, $arguments) 
    {
        echo "Calling object method &#39;$name&#39; "
             . implode(&#39;, &#39;, $arguments). "
";
    }    public static function __callStatic($name, $arguments) 
    {
        echo "Calling static method &#39;$name&#39; "
             . implode(&#39;, &#39;, $arguments). "
";
    }
}

 

自動載入類別

autoload()

  在PHP5中,可以定義一個__autoload()函數,它會在試圖使用尚未被定義的類別時自動呼叫。透過呼叫此函數,腳本引擎在PHP出錯失敗前有了最後一個機會載入所需的類別

<?phpfunction __autoload($class_name) {
    require_once $class_name . &#39;.php&#39;;
}

 

串行化

sleep()

###

  在调用serialize()函数将对象串行化时,检查类中是否存在一个魔术方法 __sleep()。如果存在,该方法会先被调用,然后才执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误

  __sleep()函数不需要接受任何参数,但需要返回一个数组,在数组中包含需要串行化的属性。未被包含在数组中的属性将在串行化时被忽略。如果没有在类中声明__sleep()方法,对象中的所有属性都将被串行化

wakeup()

  在调用unserialize()函数将对象反串行化对象时,则会自动调用对象中的__wakeup()方法,用来在二进制串重新组成一个对象时,为新对象中的成员属性重新初始化

  wakeup()经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作

<?phpclass Connection {
    protected $link;    private $server, $username, $password, $db;  
    public function __construct($server, $username, $password, $db)
    {
        $this->server = $server;        $this->username = $username;        $this->password = $password;        $this->db = $db;        $this->connect();
    }    private function connect()
    {
        $this->link = mysql_connect($this->server, $this->username, $this->password);        mysql_select_db($this->db, $this->link);
    }    public function __sleep()
    {
        return array(&#39;server&#39;, &#39;username&#39;, &#39;password&#39;, &#39;db&#39;);
    }    public function __wakeup()
    {
        $this->connect();
    }
}?>

 

函数调用

invoke()

  当尝试以调用函数的方式调用一个对象时,__invoke()方法会被自动调用

<?phpclass CallableClass {
    function __invoke($x) {
        var_dump($x);
    }
}

【补充】

set_state()

  当调用var_export()导出类时,set_state()方法会被调用,本方法的唯一参数是一个数组,其中包含按 array('property' => value, ...) 格式排列的类属性

  [注意]var_export()返回关于传递给该函数的变量的结构信息,它和var_dump()类似,不同的是其返回的表示是合法的PHP代码,也就是说,var_export返回的代码,可以直接当作php代码赋给一个变量。 而这个变量就会取得和被var_export一样的类型的值

8c94170b7cb538fd32c57939f0221304var1 = $an_array['var1'];        $obj->var2 = $an_array['var2'];        return $obj;
   }
}

相关参考:php中文网

以上是php魔術方法簡介的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51dev.com。如有侵權,請聯絡admin@php.cn刪除