亚洲最大看欧美片,亚洲图揄拍自拍另类图片,欧美精品v国产精品v呦,日本在线精品视频免费

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

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

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

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

    本教程操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦

    魔術方法(Magic methods)

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

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

    __construct()__destruct()

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

    <?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()

    在對象中調用一個不可訪問方法時會調用這兩個方法,后者為靜態(tài)方法。這兩個方法我們在可變方法(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()

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

    <?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()導出類時,此靜態(tài)方法會被調用。

    <?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__,當前命名空間的名稱

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

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

    贊(0)
    分享到: 更多 (0)
    網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號