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

        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號
        主站蜘蛛池模板: 人妻少妇偷人精品无码| 国产精品igao视频网| 人人妻人人澡人人爽欧美精品 | 亚洲国产精品lv| 老司机性色福利精品视频| 九九线精品视频在线观看| 青草青草久热精品视频在线网站| 久久免费的精品国产V∧| 亚洲精品国产成人影院| 久久精品中文字幕一区| 国产精品免费看久久久香蕉 | 亚洲热线99精品视频| 久久久久久噜噜精品免费直播| 热re99久久精品国产99热| 国产精品综合色区在线观看| 无码精品国产一区二区三区免费| 日本国产精品久久| 久久99精品久久久久久水蜜桃 | 精品国产91久久久久久久a| 91精品国产品国语在线不卡| 精品亚洲综合久久中文字幕| 2020国产精品永久在线| 国产乱码精品一区二区三区中文| 久久精品亚洲精品国产色婷| 亚洲国产精品VA在线观看麻豆| 亚洲爆乳精品无码一区二区 | 综合在线视频精品专区| 亚洲AV蜜桃永久无码精品| 鲸鱼传媒绿头鱼实验室之炮机测评日韩精品一级毛 | 国产精品无码A∨精品影院 | 正在播放酒店精品少妇约| 亚洲精品专区在线观看| 亚洲成人国产精品| 一区二区国产精品 | 四虎国产精品成人| 欧美精品人爱a欧美精品| 久久精品成人免费国产片小草| 精品国产不卡一区二区三区| 久久99精品久久久久久野外| 日韩熟女精品一区二区三区| 亚洲精品无码久久毛片|