__get($property) 访问未定义的属性时被调用
__set($property,$value) 给未定义的属性赋值时被调用
__isset($property) 对未定义的属性调用isset()时被调用
__unset($property) 对未定义的属性调用unset()时被调用
__call($method,$arg_array) 调用未定义的方法时被调用
__get()和__set()方法用于处理类(或其父类)中未声明的属性
-------------------__get()----------------------
----------------------__set()---------------------
__isset()和__get相对应,当在一个未定义的属性上调用isset()时,__isset被调用
---------------------__isset()-------------------------
__unset()和__set相对应,当unset()在一个未定义的属性上被调用时,__unset()会被调用,并以该属性的名称作为参数,然后可以根据属性名进行必要的处理。
----------------------__unset()------------------------
__call()方法可能是最有用的拦截器方法,当程序中要调用类中未定义的方法时,__call()会被调用。__call()带有两参数,一个是方法名,一个是传递给要调用方法的所有参数(数组)。__call()方法返回的任何值都会返回给调用它的地方。
---------------------__call()--------------------------
上面这个例子是通过__call()方法去实现委托。
__set($property,$value) 给未定义的属性赋值时被调用
__isset($property) 对未定义的属性调用isset()时被调用
__unset($property) 对未定义的属性调用unset()时被调用
__call($method,$arg_array) 调用未定义的方法时被调用
__get()和__set()方法用于处理类(或其父类)中未声明的属性
-------------------__get()----------------------
class Person {
function __get($property){
$method = "get{$property}";
if(method_exists($this,$method)){
return $this->$method();
}
}
public function getName(){
return "Bob";
}
}
$p = new Person();
echo $p->name; //输出Bob
----------------------__set()---------------------
class Person {
private $_name;
private $_age;
function __set($property,$value){
$method = "set{$property}";
if(method_exists($this,$method)){
return $this->$method($value);
}
}
function setName($name){
$this->_name = $name;
if(!is_null($name)){
$this->_name = strtoupper($this->_name);
}
echo $this->_name;
}
}
$p = new Person();
$p->name = 'bob'; //$p->_name为BOB;
__isset()和__get相对应,当在一个未定义的属性上调用isset()时,__isset被调用
---------------------__isset()-------------------------
function __isset($property){
$method = "get{$property}";
return (method_exists($this,$method));
}
__unset()和__set相对应,当unset()在一个未定义的属性上被调用时,__unset()会被调用,并以该属性的名称作为参数,然后可以根据属性名进行必要的处理。
----------------------__unset()------------------------
function __unset($property){
$method = "set{$property}";
if(method_exists($this,$method)){
$this->$method(null);
}
}
__call()方法可能是最有用的拦截器方法,当程序中要调用类中未定义的方法时,__call()会被调用。__call()带有两参数,一个是方法名,一个是传递给要调用方法的所有参数(数组)。__call()方法返回的任何值都会返回给调用它的地方。
---------------------__call()--------------------------
class PersonWriter {
function writeName(Person $p){
echo $p->getName() . "\n";
}
function writeAge(Person $p){
echo $p->getAge() . "\n";
}
}
class Person {
private $writer;
function __construct(PersonWriter $writer){
$this->writer = $writer;
}
function __call($methodName,$args){
if(method_exists($this->writer,$methodName)){
return $this->writer->$methodName($this);
}
}
function getName(){
return 'Bob';
}
function getAge(){
return 44;
}
}
$person = new Person(new PersonWriter);
$person->writeName(); //输出 Bob
上面这个例子是通过__call()方法去实现委托。