站長資訊網
        最全最豐富的資訊網站

        php中魔術方法和魔術常量是什么

        在php中,魔術方法是指以兩個下劃線“__”開頭的方法,例如“__call()”、“__get()”、“__set()”等;魔術常量是指會隨著他們所在代碼位置的變化而變化的8個常量,例如“__LINE__”、“__FILE__”等。

        php中魔術方法和魔術常量是什么

        本教程操作環境:windows7系統、PHP7.1版,DELL G3電腦

        魔術方法(Magic methods)

        PHP中把以兩個下劃線__開頭的方法稱為魔術方法,這些方法在PHP中充當了舉足輕重的作用。 魔術方法包括:

        • __construct(),類的構造函數
        • __destruct(),類的析構函數
        • __call(),在對象中調用一個不可訪問方法時調用
        • __callStatic(),用靜態方式中調用一個不可訪問方法時調用
        • __get(),獲得一個類的成員變量時調用
        • __set(),設置一個類的成員變量時調用
        • __isset(),當對不可訪問屬性調用isset()empty()時調用
        • __unset(),當對不可訪問屬性調用unset()時被調用。
        • __sleep(),執行serialize()時,先會調用這個函數
        • __wakeup(),執行unserialize()時,先會調用這個函數
        • __toString(),類被當成字符串時的回應方法
        • __invoke(),調用函數的方式調用一個對象時的回應方法
        • __set_state(),調用var_export()導出類時,此靜態方法會被調用。
        • __clone(),當對象復制完成時調用

        __construct()__destruct()

        構造函數和析構函數應該不陌生,他們在對象創建和消亡時被調用。例如我們需要打開一個文件,在對象創建時打開,對象消亡時關閉

        <?php  class FileRead {     protected $handle = NULL;      function __construct(){         $this->handle = fopen(...);     }      function __destruct(){         fclose($this->handle);     } } ?>

        這兩個方法在繼承時可以擴展,例如:

        <?php  class TmpFileRead extends FileRead {     function __construct(){         parent::__construct();     }      function __destruct(){         parent::__destruct();     } } ?>

        __call()__callStatic()

        在對象中調用一個不可訪問方法時會調用這兩個方法,后者為靜態方法。這兩個方法我們在可變方法(Variable functions)調用中可能會用到。

        <?php class MethodTest  {     public function __call ($name, $arguments) {         echo "Calling object method '$name' ". implode(', ', $arguments). "n";     }      public static function __callStatic ($name, $arguments) {         echo "Calling static method '$name' ". implode(', ', $arguments). "n";     } }  $obj = new MethodTest; $obj->runTest('in object context'); MethodTest::runTest('in static context'); ?>

        __get()__set()__isset()__unset()

        當get/set一個類的成員變量時調用這兩個函數。例如我們將對象變量保存在另外一個數組中,而不是對象本身的成員變量

        <?php  class MethodTest {     private $data = array();      public function __set($name, $value){         $this->data[$name] = $value;     }      public function __get($name){         if(array_key_exists($name, $this->data))             return $this->data[$name];         return NULL;     }      public function __isset($name){         return isset($this->data[$name])     }      public function unset($name){         unset($this->data[$name]);     } } ?>

        __sleep()__wakeup()

        當我們在執行serialize()unserialize()時,會先調用這兩個函數。例如我們在序列化一個對象時,這個對象有一個數據庫鏈接,想要在反序列化中恢復鏈接狀態,則可以通過重構這兩個函數來實現鏈接的恢復。例子如下:

        <?php class 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('server', 'username', 'password', 'db');     }      public function __wakeup()     {         $this->connect();     } } ?>

        __toString()

        對象當成字符串時的回應方法。例如使用echo $obj;來輸出一個對象

        <?php // Declare a simple class class TestClass {     public function __toString() {         return 'this is a object';     } }  $class = new TestClass(); echo $class; ?>

        這個方法只能返回字符串,而且不可以在這個方法中拋出異常,否則會出現致命錯誤。

        __invoke()

        調用函數的方式調用一個對象時的回應方法。如下

        <?php class CallableClass  {     function __invoke() {         echo 'this is a object';     } } $obj = new CallableClass; var_dump(is_callable($obj)); ?>

        __set_state()

        調用var_export()導出類時,此靜態方法會被調用。

        <?php class A {     public $var1;     public $var2;      public static function __set_state ($an_array) {         $obj = new A;         $obj->var1 = $an_array['var1'];         $obj->var2 = $an_array['var2'];         return $obj;     } }  $a = new A; $a->var1 = 5; $a->var2 = 'foo'; var_dump(var_export($a)); ?>

        __clone()

        當對象復制完成時調用。例如在設計模式詳解及PHP實現:單例模式一文中提到的單例模式實現方式,利用這個函數來防止對象被克隆。

        <?php  public class Singleton {     private static $_instance = NULL;      // 私有構造方法      private function __construct() {}      public static function getInstance() {         if (is_null(self::$_instance)) {             self::$_instance = new Singleton();         }         return self::$_instance;     }      // 防止克隆實例     public function __clone(){         die('Clone is not allowed.' . E_USER_ERROR);     } } ?>

        魔術常量(Magic constants)

        PHP中的常量大部分都是不變的,但是有8個常量會隨著他們所在代碼位置的變化而變化,這8個常量被稱為魔術常量。

        • __LINE__,文件中的當前行號
        • __FILE__,文件的完整路徑和文件名
        • __DIR__,文件所在的目錄
        • __FUNCTION__,函數名稱
        • __CLASS__,類的名稱
        • __TRAIT__,Trait的名字
        • __METHOD__,類的方法名
        • __NAMESPACE__,當前命名空間的名稱

        這些魔術常量常常被用于獲得當前環境信息或者記錄日志。

        推薦學習:《PHP視頻教程》

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久免费的精品国产V∧| 国产在线精品网址你懂的| 亚洲av永久无码精品国产精品| 久久成人影院精品777| 亚洲性日韩精品一区二区三区| 久久国产精品99精品国产987| 亚洲av日韩av天堂影片精品| 久久99精品久久久久久水蜜桃| 国产精品久久久久久久久鸭| 亚洲国产第一站精品蜜芽| 久久久精品久久久久久| 99精品国产一区二区| 国产小视频国产精品| 蜜国产精品jk白丝AV网站| 蜜臀av无码人妻精品| 蜜臀精品无码AV在线播放| 久久亚洲中文字幕精品一区| 亚洲麻豆精品国偷自产在线91 | 国产成人亚洲精品青草天美| 亚洲国产精品无码专区| 青青久久精品国产免费看| 精品国产亚洲男女在线线电影 | 国产精品人成在线观看| 亚洲一二成人精品区| 精品97国产免费人成视频| 亚洲精品国产成人专区| 99久久人妻无码精品系列蜜桃| 无码人妻精品一区二区三区东京热| 日韩精品无码久久一区二区三 | 日韩一区精品视频一区二区| 久久精品一本到99热免费| 国内精品久久久久久中文字幕 | 99精品热这里只有精品| 麻豆国内精品久久久久久| 久久精品一区二区| 国产探花在线精品一区二区| 日韩精品一区二区三区视频| 精品国产污污免费网站| 麻豆亚洲AV永久无码精品久久| 精品欧美小视频在线观看| 亚洲精品线在线观看|