首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

php中的魔术方法

php提供了内置拦截器,也称为“魔术方法”,它可以拦截发送到未定义的方法或属性的消息,并作出响应,注意,魔术方法通常是以两个下划线“__"开始

__set()和_get()方法:

__set()方法在试图给未定义的属性赋值时调用,或者在类外部修改被private修饰的类属性时调用。__get()方法是当类外部访问被private或者protected修饰的属性时调用。学过java的同学相信看一眼就懂了,这就相当于javabean中的set和get方法,用于外部实例化的类访问和修改被private修饰的属性。

其实php中也是很好理解的,你将一个属性修饰为private,就代表类外部的实例是无法访问和修改的,但是这样就变得很局限,因为在实际场景中,我们都需要随时能获取和修改属性值,于是提供了__set()和__get()方法。

__set($key,$value)方法需要传入两个参数(键值):属性名和属性值,$key代表属性名,$value代表变更后的属性值。

__get($key)方法只需要传入一个参数:属性名。

header("Content-type:text/html;charset=gbk");

class magic{

private $name;

private $age = '22';

function __set($key,$value){

echo "执行了_set()方法";

$this->$key = $value;

}

function __get($key){

echo "执行了__get()方法";

echo $this->$key;

}

}

$obj = new magic();

echo $obj->weight = '30kg';//访问不存在的weight属性会被_set()方法拦截

echo '

';

$obj->name = 'kshon';//在类外部修改private修饰的属性会调用_set()方法

echo $obj->sex; //访问不存在的属性时会报错

echo $obj->name; //访问被private修饰的属性

运行结果:

__isset()和__unset()方法

__isset()和__unset()方法都是在类外部对未定义的属性或者非公有属性(private,protected)使用isset()和unset()方法进行操作时调用。

__isset()方法其实就是判断非公有属性(private,protected)在类中是否存在,但是检测不到public修饰的公有属性

__unset()也是检查非公有属性是否存在,但是如果存在,执行unset()方法会将这个属性销毁,释放该属性的内存空间,下次访问时就不存在了,会返回NULL

header("Content-type:text/html;charset=gbk");

class magic{

private $name = 'kshon';

protected $age = '22';

public $weight = '30kg';

function __isset($key){

if(property_exists('magic',$key)){

echo "属性".$key."存在

";

}else{

echo "属性".$key."不存在

";

}

}

function __unset($key){

if(property_exists('magic',$key)){

unset($this->$key);

echo "属性".$key."存在

";

}else{

echo "属性".$key."不存在

";

}

}

}

$obj = new magic();

isset($obj->name); //被private修饰的属性

isset($obj->age); //被protected修饰的属性

isset($obj->weight); //被public修饰的属性,不会调用

isset($obj->hobby); //不存在的属性

echo "

";

unset($obj->name); //被private修饰的属性

unset($obj->age); //被protected修饰的属性

echo 'weight='.$obj->weight; //使用unset前的属性还存在

unset($obj->weight); //被public修饰的属性,不会调用

echo $obj->weight; //使用unset后的属性被销毁

unset($obj->hobby); //不存在的属性

执行结果:

其中property_exists($class,$key)方法是判断$class这个类中是否存在$key这个属性

__call()和__toString()方法:

__call()是在调用类中不存在的方法时调用,它有两个参数,即方法名和对应的参数,参数以索引数组的形式存在。

__toString()是使用echo和print打印对象时调用的方法,会将对象转换为字符串。

header("Content-type:text/html;charset=gbk");

class magic{

function __call($func,$param){

echo "$func方法不存在";

var_dump($param);

}

function __toString(){

return "这个对象为magic";

}

}

$obj = new magic();

$obj->login('参数1','参数2','参数3'); //调用不存的方法login

echo "

";

echo $obj; //打印magic对象

执行结果:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180609G15REY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券