关于魔术方法??
<?php
class Example
{
//不可访问的属性
protected $imooc="yes!";
//不可访问的普通方法
private function imooc(){
echo "问慕课!";
}
//不可访问的静态方法
private static function imoocReal(){
echo "还真真滴问慕课!他就是不告诉你";
}
//魔术方法
public function __set($n,$v){
if($n=='imooc'){
//注意这里!!!
$this->$imooc = $v;
echo "给不可访问属性赋值时触发".$n;
}else{
echo"弄死你啊,设置你妹啊!";
}
}
public function __get($n){
//注意这里!!!
// echo $this->$imooc;
if($n=='imooc'){
echo "调用不可访问属性时触发" .$n;
}else{
echo"弄死你啊,得不到!";
}
}
public function __isset($n){
if($n=='imooc'){
echo "对不可访问属性使用empty与isset()时触发" .$n."已经设置";
}else{
echo"弄死你啊,谁知道空不空?";
}
}
public function __unset($n){
if($n=='imooc'){
echo "对不可访问属性使用empty与isset()时触发" .$n."已经销毁";
}else{
echo"弄死你啊,销毁了!";
}
}
public function __call($name,$arg){
if($name=='imooc'){
echo "调用不可访问动态方法".$name."时触发<br>";
var_dump($arg);
}else{
echo "你大爷的,谁知道你触发了什么!!!!";
}
}
public static function __callStatic($name,$arg){
if($name=='imoocReal'){
echo "调用不可访问动态方法".$name."时触发<br>";
var_dump($arg);
}else{
echo "你大爷的,谁知道你触发了什么!!!!";
}
}
}
//实例化对象
$imooc = new Example;
//触发各种魔术方法
echo $imooc->imooc;
echo "<hr>";
$imooc->imooc = "真傻!";
echo "<hr>";
$imooc->imooc("慕课很呵呵呵!","我也是这么认为的!");
echo "<hr>";
Example::imoocReal("慕课很呵呵呵!!!","我也是这么认为的!");
echo "<hr>";
isset($imooc->imooc);
echo "<hr>";
unset($imooc->imooc);
echo "<hr>";
?>
我再使用__set、和__get方法时发现,第一次访问的属性名 都不是 调用时的属性名,都触发了else里的代码,这是为什么?
我猜想可能__set、和__get方法,也适用于类的内部调用??
在__get()方法里我调用了echo $this->$imooc; 但是读不出来还警告?这是为啥?
在__set()方法,我加了$this->$imooc = $v; 但是会先走一遍else语句,我猜这里又触发了__set()方法,这是为啥???
1
收起
正在回答
2回答
您好,魔术方法的作用:在给不可访问属性赋值时,__set() 会被调用。读取不可访问属性的值时,__get() 会被调用。
类外不可以调用和赋值受保护的$imooc属性,因此触发__set()__get()方法。
适用,第四点则是因为这个原因。
输出属性值应该是:echo $this->imooc;。
$this->$imooc = $v;中属性不存在则调用__set输出else区间内容。__set方法中写为$this->imooc = $v;则不会出现报错。设置属性出错。
另请同学采用文明用语。如果解决了您的问题,请采纳。祝学习愉快!
PHP常用技术与ThinkPHP5框架开发
- 参与学习 人
- 提交作业 225 份
- 解答问题 3372 个
掌握用PHP开发互联网网站的必备功能,掌握当下主流的Linux系统开发,并熟练使用热门框架ThinkPhp开发电商团购项目,是通向PHP工程师必经之路。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星