__tostring()
当对象被当作字符串输出时,调用该方法。
class People{
public function __tostring(){
return 'this is a people';
}
}
$p1 = new People();
echo $p1;
__invoke
当对象被当作方法调用时,会调用该方法
class People{
public function __invoke($x){
echo 'invoke..'.$x;
}
}
$p1 = new People();
$p1(1);
__call()
当访问对象的方法不存在时,将会调用该方法
class People{
public function __call($name,$arguments){
echo 'call..'.$name.' with args '.implode(',',$arguments);
}
}
$p1 = new People();
$p1->hehe('2','1');
__staticcall()
当访问类静态方法不存在时,调用该方法
class People{
public static function __callStatic($name,$arguments){
echo 'calling static function '.$name.' with args '.implode(',',$arguments);
}
}
People::hehe('1','2');
__get()
当访问的属性不能正常访问时(没有该属性或者是private属性),调用该方法
class People{
public function __get($name){
return "try to get property:".$name;
}
}
$obj = new People();
echo $obj->name;
__set()
当要赋值的属性不能正常访问时(没有该属性或者是private属性),调用该方法
class People{
public function __set($name,$value){
echo "try to set property:".$name ." with value:".$value;
}
}
$obj = new People();
$obj->name = '11';
__isset()
当不可访问属性调用isset()和empty()
方法时,将会调用。
class People{
public function __isset($name){
echo "calling isset ".$name ;
return true;//return false;
}
}
$obj = new People();
isset($obj->name);
class People{
public function __isset($name){
echo "calling isset ".$name ;
return true;//return false;
}
}
$obj = new People();
empty($obj->name);
__unset()
当不可访问属性调用unset()
方法时,将会调用。
class People{
public function __unset($name){
echo "calling unset ".$name ;
return true;//return false;
}
}
$obj = new People();
unset($obj->name);
__clone()
如下的代码,如果直接使用赋值符号,那么两个变量p1和p2其实是指向同一个对象,如果修改p2,那么p1也会被修改
class People{
public $name;
}
$p1 = new People();
$p1->name = "name1";
$p2 = $p1;
$p2->name = "name2";
echo "p1's name:".$p1->name.'<br>';
echo "p2's name:".$p2->name;
我们可以使用clone关键字,复制一个对象(内存中重新开辟一个空间)
class People{
public $name;
}
$p1 = new People();
$p1->name = "name1";
$p2 = clone $p1;
$p2->name = "name2";
echo "p1's name:".$p1->name.'<br>';
echo "p2's name:".$p2->name;
在使用clone的时候,就会调用__clone()
方法
class People{
public $name;
function __clone(){
echo "calling clone<br>";
//可以在此处修改克隆后的值
$this->name = '111';
}
}
$p1 = new People();
$p1->name = "name1";
$p2 = clone $p1;
echo "p1's name:".$p1->name.'<br>';
echo "p2's name:".$p2->name;