PHP提供了内置的攔截器(intercepter),它可以攔截發送到未定義的屬性或者方法的消息。它也被稱為重載。不過我們為了避免和java和c++中的重載歧義還是叫攔截器。
攔截器可以是類更加完善和安全。對于調用的未知的屬性或者方法可以自定義的處理。不管是自己猜測處理或者傳回自定義的資訊。
<?php
/**
* PHP5中攔截器學習測試
* __get( $property ) 通路未定義的屬性時候被調用
* __set( $property, $value) 給未定義的屬性指派時被調用
* __isset( $property ) 給未定義的屬性調用isset()時候被調用
* __unset( $property ) 給未定義的屬性調用unset()的時候被調用
* __call( $method, $arg_array ) 調用未定義的方法時候被調用
*
*/
error_reporting(E_ALL);
class person {
public $name;
public $age;
public function __get( $property ) {
return null;
}
public function __set( $property, $value) {
public function __isset( $property ) {
return false;
public function __unset( $property ) {
return true;
public function __call( $method,$arg_array ) {
return $arg_array;
public function initialize($name,$age) {
$this->name = $name;
$this->age = $age;
}
$person = new person();
$person->sex; //傳回null 因為類中沒有定義這個屬性
isset($person->age); //如果類中有這個屬性 但是沒有指派 那麼不會 不會走__isset 會直接傳回false或者true
$person->sex = 'male';//如果對一個不存在的屬性定義那麼會調用__get 方法
$person->init('ZhangSan','20');// 這個會走__call 參數會當作數組 $arg_array傳入
unset($person->sex);//這裡會調用__unset 方法
本文轉自kefirking 51CTO部落格,原文連結:http://blog.51cto.com/phpzf/804700,如需轉載請自行聯系原作者