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

五分鐘帶你了解PHP中的魔術方法(實例詳解)

在之前的文章中給大家帶來了《PHP中clone關鍵字和__clone()方法的使用(實例詳解)》,其中給大家詳細的介紹了PHP中的clone關鍵字和__clone()方法,本篇文章繼續給大家帶來PHP中的魔術方法,希望對大家有幫助!

五分鐘帶你了解PHP中的魔術方法(實例詳解)

在我們之前的文章中,我們介紹__clone()方法的時候提到,這是魔術方法的一種,《帶你分清類中的構造函數與析構函數》中也提到的構造函數與析構函數也叫作構造方法與析構方法,他們也是魔術方法的一種。那么什么是魔術方法?它有哪些常用的方法?它又是怎樣使用的?接下來我們一起來看一看吧。

PHP魔術方法

在PHP面向對象編程中,PHP里有一系列的魔術方法,這些魔術方法看看之前學習的__clone__construct__destruct我們能發現一個共同點,那就是它們都是由__兩個下劃線開始的,并且都是在某種特定的條件下自動調用的。

那接下來我們來看一看一些常用的魔術方法,結合實例來看一下它們的使用方法。

__set()方法

__set()方法用于在為當前環境下未定義或不可見的類屬性賦值時,需要注意的是所有的魔術方法,都是在某種特定條件下自動調用的,為當前環境下未定義或不可見的類屬性賦值時就是__set()方法調用的特定條件。

語法格式如下:

public function __set(要操作的變量, 要操作變量的值){     ... ... ; }

實例如下:

<?php     class father{         public $study1;         private $study2;         public function __set($key, $value){             echo '為“'.$key.'”賦值“'.$value.'”失敗!<br>';         }     }     $object          = new father();     $object -> study1  = '好好學習';     $object -> study2   = '天天向上';     $object -> study3 = '福如東海'; ?>

輸出結果:

五分鐘帶你了解PHP中的魔術方法(實例詳解)

由上述實例看出,當當前環境下未定義或不可見的類屬性賦值時,就會調用__set()方法。

__get()方法

自動調用 __get() 方法的特定條件是在調用或獲取當前環境下未定義或不可見的類屬性時,定義該方法的語法格式如下:

public function __get($name){     ... ... ; }

其中參數$name表示要操作的變量名稱,下面通過實例我們來看一下__get()方法的使用,實例如下:

<?php     class father{         public $study = '好好學習';         private $study1 = '天天向上';         public function __get($study1){             echo '獲取:“'.$study1.'”失??!';         }     }     $object = new father();     echo $object -> study.'<br>';     echo $object -> study1.'<br>';     echo $object -> study2.'<br>'; ?>

輸出結果:

五分鐘帶你了解PHP中的魔術方法(實例詳解)

由上述結果可以看出在調用或獲取當前環境下未定義或不可見的類屬性時,會自動調用 __get() 方法。

__isset() 方法

自動調用 __isset() 方法的特定條件是當在類外部對類中不可訪問或不存在的屬性使用 isset()empty() 函數時,該方法的語法格式如下:

public function __isset($name){     ... ... ; }

其中我們需要注意的是:

參數 $name 為要訪問的屬性名稱。

  • isset() 函數是用來檢查一個變量是否存在并且還要判斷不為 NULL,如果傳入的變量存在則傳回 true,不存在傳回 false。

  • empty() 函數是用來檢查一個變量是否為空,如果變量的值等于 FALSE,那么這個變量會被認為不存在。

  • 如果想要使用 isset() 或 empty() 函數對類中的私有屬性進行檢測的話,我們只需要在類中添加一個 __isset() 方法就可以了,當在類外部使用 isset() 或 empty() 函數時,會自動調用類里面的 __isset() 方法。

接下來我們通過實例來看一下__isset()方法的使用,實例如下:

<?php     class father{         public $study = '好好學習';         private $name = '天天向上';         public function __isset($name){             if(property_exists('Website', $name)){                 echo '成員屬性:“'.$name.'”存在!<br>';             }else{                 echo '成員屬性:“'.$name.'”不存在!<br>';             }         }     }     $object = new father();     isset($object -> mother);     isset($object -> name); ?>

輸出結果:

五分鐘帶你了解PHP中的魔術方法(實例詳解)

其中我們需要注意的是,property_exists() 函數可以用來檢測類中是否定義了該屬性,語法格式為

 property_exists($class_name,$property_name)

其中 $class_name 為字符串形式的類名,即判斷類 class_name 中是否定義了 property_name 屬性。

__unset() 方法

自動調用__unset() 方法的特定條件是當在類外部對類中不可訪問或不存在的屬性使用 unset() 函數時,該方法的語法格式如下:

public function __unset($name){     ... ... ; }

其中我們需要注意的是:

  • 參數 $name 為要訪問的屬性名稱。

  • unset() 函數的作用是刪除指定的變量,需要傳入一個或多個變量作為參數,另外,該函數沒有返回值。

  • 可以使用 unset() 函數在類外部去刪除類中的成員屬性。如果要刪除類中的公有屬性的話直接使用 unset() 函數即可;

  • 如果要刪除類中的私有屬性的話,則需要在類中添加一個 __unset() 方法。

接下來我們通過實例來看一下__unset()方法的使用,實例如下:

<?php     class father{         public $name = 'http://c.biancheng.net/php/';         private $study = 'C語言中文網';         public function __unset($study){             if(property_exists('father', $study)){                 unset($this->$study);                 echo '移除成員屬性:“'.$study.'”成功!<br>';             }else{                 echo '成員屬性:“'.$study.'”不存在!<br>';             }         }     }     $object = new father();     unset($object->name);     unset($object->study);     unset($object->study1); ?>

輸出結果:

五分鐘帶你了解PHP中的魔術方法(實例詳解)

由上述實例看出當在類外部對類中不可訪問或不存在的屬性使用 unset() 函數時,__unset() 方法會被自動調用。

上述實例中給大家介紹了一些常用的魔術方法,但這并不是魔術方法的全部,那接下來再給大家列舉一些魔術方法:

  • __call() — 調用一個不存在的方法時自動調用

  • __sleep() — 使用 serialize 序列化時自動調用

  • __toString() — 把對象轉換成字符串時自動調用

  • __invoke() — 當嘗試把對象當方法調用時自動調用

  • __wakeup() — 使用 unserialize 反序列化時自動調用

  • __callStatic() — 調用一個不存在的靜態方法時自動調用

  • __debugInfo() — 使用 var_dump() 打印對象信息時自動調用

  • __set_state() — 當使用 var_export() 函數時自動調用,接受一個數組參數

大家如果感興趣的話,可以點擊《PHP視頻教程》進行

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
国产精品无码久久久久久| 中文字幕日韩丝袜一区| 久久棈精品久久久久久噜噜| 91在线视频精品| 亚洲精品色婷婷在线影院| 亚洲AV日韩AV天堂久久| 日本精品久久久久久福利| 亚洲精品无码mⅴ在线观看| 精品久久久久久中文字幕大豆网| 亚洲国产精品久久久久久| 精品日产一区二区三区手机| 中文精品人人永久免费| 久久精品国产一区二区电影| 亚洲精品无码久久不卡| 合区精品中文字幕| 日韩精品一区二区三区视频| 日韩a在线观看免费观看| 中文字幕日韩精品一区二区三区| 日韩精品一区二区三区影院 | 国产大陆亚洲精品国产| 日韩精品中文乱码在线观看| 久久久久亚洲精品无码网址色欲| 国产精品俺来也在线观看| 国产精品麻豆高清在线观看| 亚洲精品一卡2卡3卡三卡四卡| 久久精品亚洲精品国产色婷| 99视频都是精品热在线播放| 嫩草伊人久久精品少妇AV| 亚洲av成人无码久久精品 | 国产精品嫩草影院在线播放| 日本精品3d动漫一区二区| 在线观看精品国产福利片87| 国产美女精品视频免费观看| 精品久久久久久亚洲综合网| 国产精品区一区二区三| 国产午夜久久精品| 国产亚洲美女精品久久久久| 精品国产亚洲AV麻豆| 国产精品好好热在线观看| 亚洲性日韩精品一区二区三区| 中日韩产精品1卡二卡三卡|