PHP魔术方(2)

PHP魔术方(2)

1、_ _toString 和 invoke (tostring 和 invoke 两者的触发形式接近。)

(1)、_ _tostring() 表达方式错误导致魔术方法触发。 触发时机:把对象当成字符串调用。

示例代码:

<?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个参数 a r g 1 , arg1, 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个参数 a r g 1 , arg1, 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个参数 a r g 1 , arg1, 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魔术方法。
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吃泡面不喝汤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值