PHP魔术方法(2)
PHP魔术方(2)1、_ _toString 和 invoke (tostring 和 invoke 两者的触发形式接近。)2、_ _call( ) 用来检测所调用的成员方法是否存在。3、_ _callStatic( )4、_ _get()5、_ _set()6、_ _isset()7、_ _unset()8、_ _clone()
1、_ _toString 和 invoke (tostring 和 invoke 两者的触发形式接近。)
示例代码:
<?php
class User {
var $benben = "this is test";
public function __toString(){
return '格式不对,无法输出';
}
}
$test = new User();
print_r($test);
echo "\n";
echo $test; //将对象当成字符串调用,执行toString
?>
(2)、_ _invoke() 格式表达错误导致魔术方法触发。触发时机:把对象当成函数调用。
示例代码:
<?php
class User {
var $lantu = "this is a test!!";
public function __invoke(){
echo '它不是个函数';
}
}
$test = new User();
echo $test-> lantu;
echo "\n";
echo $test()-> lantu; //将test当成函数调用,触发invoke
?>
2、_ _call( ) 用来检测所调用的成员方法是否存在。
触发时机:调用一个不存在的方法。
参数:2个参数 $arg1,$arg2
返回值:调用的不存在的方法的名称和参数。
代码示例:
<?php
class User{
public function __call($arg1,$arg2){
echo"$arg1,$arg2[0]";
}
}
$test = new User();
$test -> call11('a'); //调用call11方法,此方法不存在,触发call
?>
3、_ _callStatic( )
触发时机:静态调用或调用成员常量时使用的方法不存在
参数:2个参数 $arg1,$arg2
返回值:调用的不存在的方法的名称和参数
示例代码:
<?php
class User{
public function __callStatic($arg1,$arg2){
echo"$arg1,$arg2[0]";
}
}
$test = new User();
$test::call11('a'); //跟call差不多,但是callStatic用于静态调用时触发
$test ->call11('a');//不会调用callStatic
?>
4、_ _get()
触发时机:调用的成员属性不存在
参数:1个参数 $arg1
返回指:不存在的成员属性的名称
示例代码:
<?php
class User{
public $var1;
public function __get($arg1)
{
echo $arg1."不存在";
}
}
$test = new User();
$test ->var2; //User中不存在成员属性var2,此时会调用get
?>
5、_ _set()
触发时机:给不存在的成员属性赋值。
参数:2个参数 $arg1,$arg2
返回指:不存在的成员属性的名称和赋的值
示例代码:
<?php
class User{
public $var1;
public function __set($arg1,$arg2){
echo $arg1.','.$arg2;
}
}
$test = new User();
$test ->var2=1; //var2 不存在的成员属性,为其赋值时会调用set
?>
6、_ _isset()
触发时机:对不可访问属性使用isset()或empty()时,isset()会被调用。
参数:传参 $arg1
返回值:不存在的成员属性的名称。
<?php
class User{
protected $var1;
private $var;
public function __isset($arg1){
echo $arg1;
}
}
$test = new User();
isset($test->var1); //protected 只能在该类和该类的子类中使用,因此此处也会触发isset魔术方法。
echo "\n";
isset($test->var); //外部无法访问,触发isset
?>
7、_ _unset()
触发时机:对不可访问属性使用unset()时
参数:1个参数
返回值:不存在的成员属性的名称
示例代码:
//这里代码基本跟isset相同。
<?php
class User{
protected $var1;
private $var;
public function __unset($arg1){
echo $arg1;
}
}
$test = new User();
unset($test->var1);
echo "\n";
unset($test->var);
?>
8、_ _clone()
触发时机:当使用clone关键字拷贝完成一个对象后,新对象会自动调用定义的魔术方_ _clone()。
示例代码:
<?php
class User{
private $var;
public function __clone(){
echo "__clone test";
}
}
$test = new User();
$newclass = clone ($test); //此处调用clone魔术方法。
?>