TypechoJoeTheme

Dcr163的博客

统计

PHP面向对象魔术方法__get,__set,__isset,__unset笔记

2015-10-18
/
0 评论
/
750 阅读
/
正在检测是否收录...
10/18

/* 魔术方法:
是指某些情况下,会自动调用的方法,称为魔术方法
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');
 */

朗读
赞(0)
版权属于:

Dcr163的博客

本文链接:

https://dcr163.cn/33.html(转载时请注明本文出处及文章链接)

评论 (0)

人生倒计时

今日已经过去小时
这周已经过去
本月已经过去
今年已经过去个月

最新回复

  1. William Tardent
    2024-02-27
  2. Maryann Hamer
    2024-02-27
  3. Sanora Pantano
    2024-02-24
  4. aa
    2024-02-21
  5. Kassie Baum
    2024-01-28

标签云