PHP面向对象魔术方法__get,__set,__isset,__unset笔记
/* 魔术方法:
是指某些情况下,会自动调用的方法,称为魔术方法
PHP面向对象中,提供了这几个魔术方法,他们的特点都是以 双下划线__开始头
__construct :构造方法
__destruct :析构方法
__construct(), __destruct(), __call(), __callStatic(), __get(), __set(),
__isset(), __unset(), __sleep(), __wakeup(), __toString(), __invoke(),
__set_state(), __clone() 和 __debugInfo() 等方法在 PHP 中被称为"魔术方法"(Magic methods)。
__clone() 克隆方法,当对象被克隆时,将会自动调用
*/
/* class Human {
public $height=360;
public function __clone() {
echo '魔术方法->克隆';
}
}
$a=new Human();
$a->__clone();
class Human {
private $money='2800';
protected $height='168cm';
public $name='Jun';
}
$dede=new Human();
echo $dede->name; //Jun
echo $dede->height; //Fatal error 无权调用
*/
class Human {
private $money='2800';
protected $height='168cm';
public $name='Jun';
public function __get($single){ //__get()魔术方法
echo '访问的是',$single,'属性吗?','<br />';
}
}
$dede=new Human();
echo $dede->height; //成功调用
echo $dede->money; //成功
echo $dede->phone; //也成功
/* 可以总结出:
当我门调用一个 权限上不允许调用的属性和不存在的属性 时,__get魔术方法自动调用,
并且自动传参,参数值是属性名。
流程:
$dede->height---无权-->自动调用了__get(height);
$dede->phone--->没有此属性-->__get('phone');
生活中,你帮别人看小买部
买辣条-->好,给你辣条
买牙刷-->好,给你牙刷
这个POS机不错-->(pos机是商店工具,不卖的你是无权购买的),但是我门用
__get魔术方法就会有个友好的处理机会
系统就会直接报错,甚至fatal error,通过__get,我们就能字定义用户访问时的处理行为
*/
echo '<hr />';
$dede->a ='hhh';
$dede-> b='eee';
/*
竟然给加上了
其实,对象就是一个属性集,在JS中更明显
如果这么随便就能加了属性,导致这个对象属性过多不好管理
*/
echo '<hr />';
class wHuman {
private $money='222';
protected $height='168cm';
public $name='啸聚';
public function __set($a,$b) {
echo '这是设置',$a,'属性的值',$b;
}
}
$de=new wHuman();
var_dump($de->money=1111,'<br />');
var_dump( $de->height='178cm','<br />');
var_dump($de->kk =123,'<br />');
var_dump($de);
$de->name='lanlan';
var_dump($de);
/* 如上,总结出 __set的作用
当为无权操作的属性赋值时,或不存在的属性赋值时
__set()自动调用
且自动传2个参数 属性 属性值
例:
$de->$money-->无权操作-->__set('height','178cm')
*/
echo '<hr />';
class pig {
private $age=16;
public $weight='250KG';
public function __isset($a){
echo '这是检测',$a,'属性存不存在<br />';
return 1;
}
public function __unset($a){
echo '这是要销毁',$a,'属性!!<br />';
}
}
$zhu=new pig();
if (isset($zhu->pig)) {
echo '有这个属性';
} else {
echo '没有这个属性';#p#分页标题#e#
}
/* __isset()方法:
当isset()判断对象不可见的属性时(private/protected/不存在的属性)
就会引发__isset()来执行
问:isset($obj->aaa) 属性为真,这能说明 类声明了一个aaa属性吗?
答:不能,因为加了个return
*/
echo '<hr />';
echo '__unset方法测试';
var_dump($zhu);
unset($zhu->weight);
unset($zhu->pi);
unset($zhu->age);
var_dump($zhu);
/* __unset使用方法:
当用unset 销毁对象的不可见属性时,会引发__unset();
unset($zhu->pi)--->没有pi属性--->__unset('pi');
unset($zhu->age)-->age是手保护的--->__unset('age');
*/
Dcr163的博客
http://dcr163.cn/33.html(转载时请注明本文出处及文章链接)