php攔截器方法有:1、「__get」方法、2、「__set()」方法;3、「__isset()」方法;4、「__unset($property)」方法;6、 “__call()”方法。
php提供了哪些攔截器方法
序號 | 方法名稱 | 作用 | 實作版本 |
1 | __get($property) | 存取未定義的屬性時候,呼叫該方法 | >= PHP 5.3.0 |
2 | __set($property, $value) | 給未定義屬性設定值的時候,呼叫該方法 | >= PHP 5.3.0 |
3 | __isset($property) | #對未定義屬性呼叫isset()時,呼叫該方法 | > = PHP 5.1.0 |
4 | __unset($property) | 對未定義屬性呼叫unset()時,呼叫該方法 | >= PHP 5.1.0 |
5 | __call($property, $args_array) | 當呼叫未定義方法時,執行此方法 | >= PHP 5.3.0 |
#詳細情況請見http://php.net/manual/zh/language.oop5. magic.php介紹
什麼是PHP攔截器?
英文名稱 “interceptor”,作用是 攔截 發送未定義的方法和屬性的訊息。
先看一段程式碼,定義了一個School類,實例化一個物件$obj,取得一個未定義的屬性teacher,會發生什麼事?
<?php class School { } $obj = new School; var_dump($obj->teacher);
如果使用php命令列執行,可以看出,php報了一個未定義屬性的Notice, $obj->teacher值是空值,所以印出NULL
[root@localhost php]# php538 interceptor.php PHP Notice: Undefined property: School::$teacher in /usr/local/sina_mobile/apache/htdocs/php/interceptor.php on line 11NULL
這裡說明一下,php命令列執行和瀏覽器頁面執行不一定完全一樣,我們可以看下面截圖,web server是apache執行同樣腳本時候,apache回告瀏覽器的是未帶php報出的Notice,回傳給瀏覽器的是一個200 OK,這裡面有這php和web server的互動以及web server和瀏覽器的互動問題。
針對前面的程式碼,我們想,如果訪問teacher的時候,teacher屬性不存在,我們可以攔截到對teacher的呼叫請求,並且做一些操作,那麼這個就是php的攔截器,php攔截器提供了多種方法,這裡__get方法就是存取未定義的屬性時候被呼叫的。
我們看下面程式碼和結果
<?php class School { function __get($var) { echo $var; echo "\r\n"; return "hello"; } public $name = "Tom"; } $obj = new School; var_dump($obj->teacher); var_dump($obj->name);
執行以下結果如下,說明一下,__get方法必須擁有一個參數,該參數就是呼叫的未定義的屬性名稱,函數會將return 結果賦值給該呼叫的未知屬性。
[root@localhost php]# php538 interceptor.php teacher string(5) "hello" string(3) "Tom"
更多相關知識,請造訪 PHP中文網! !
以上是php有哪些攔截器方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!