小米技术社区
小米技术社区管理员 关于小米

27岁,山西运城人,职业电商经理人,前端开发工作者,从事过网站建设、网络推广、SEO、SEM、信息流推广、二类电商、网络运维、软件开发,等相关电商工作,经验较为丰富,小米技术社区致力于为广大从事Web前端开发的人员提供一些力所能及的引导和帮助 ...[更多]

E-mail:mzze@163.com

Q Q:32362389

W X:xiaomi168527

小米技术社区大牛王飞 关于王飞

27岁,山西运城人,职业电商经理人,网络工程师兼运维,从事过运营商网络建设,企业网络建设、优化。数据中心网络维护等通过,经验丰富,座右铭:当自己休息的时候,别忘了别人还在奔跑。 ...[更多]

E-mail:wf_live@126.com

Q Q:3940019

微博:王小贱ss

小米技术社区设计小艳 关于小艳

大于花一样的年龄,河南郑州是我家,2010年在北京接触团购网,2011年进入天猫淘宝一待就是四年,如今已经将设计走向国际化(ps:误打误撞开始进入阿里巴巴国际站的设计,嘿嘿)五年电商设计,丰富经验,从事过天猫淘宝阿里各项设计,店铺运营,产品拍摄;我将我的经历与您分享是我的快乐!座右铭:越努力越幸运! ...[更多]

E-mail:97157726@qq.com

Q Q:97157726

标签云
精品推荐
您的位置:首页 > 后端编程 > PHP > PHP基础

PHP的常用魔术方法

分类: PHP基础74个赞

__construct()

构造方法

作用:当实例化对象的时候自动执行

__destruct()

析构方法

作用:当对象销毁的时候自动调用

__clone()

克隆方法


__tostring()、__invoke()


__tostring():将对象当成字符串使用的时候自动调用

__invoke():将对象当成函数使用的时候自动调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
class Student {
    //把对象当成字符串使用的时候自动执行
    public function __tostring() {
        return '这是一个对象,不是字符串<br>';
    }
    //把对象当成函数使用的时候自动执行
    public function __invoke() {
        echo '这是一个对象,不是函数<br>';
    }
}
$stu=new Student;
echo $stu; //当成字符串使用
$stu();     //当成函数使用


__set()、__get()、__isset()、__unset()

1
2
3
4
__set($k,$v):给无法访问的属性赋值的时候自动执行
__get($k):获取无法访问的属性值的时候自动调用
__isset($k):判断无法访问的属性是否存在自动调用
__unset($k):销毁无法访问的属性的时候自动执行


案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
class Student {
    private $name;
    private $sex;
    private $age;
    //给无法访问的属性赋值的时候自动执行
    public function __set($k,$v) {
        $this->$k=$v;
    }
    //获取无法访问的属性值的时候自动调用
    public function __get($k) {
        return $this->$k;
    }
    //判断无法访问的属性是否存在自动调用
    public function __isset($k) {
        return isset($this->$k);
    }
    //销毁无法访问的属性的时候自动执行
    public function __unset($k) {
        unset($this->$k);
    }
}
//测试
$stu=new Student;
//1、给私有属性赋值
$stu->name='tom';
$stu->sex='男';
$stu->age=22;
//2、获取私有属性的值
//echo $stu->name;
//3、判断私有属性是否存在
//var_dump(isset($stu->name));
//4、销毁私有属性
unset($stu->age);
print_r($stu);


应用:设置读写属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
class Student {
    private $name;         //读写属性
    private $add='中国'; //只读属性
    private $age;          //只写属性
     
    public function __set($k,$v) {
        if(in_array($k,array('name','age')))
            $this->$k=$v;
        else
            echo "{$k}属性是只读属性<br>";
    }
    public function __get($k) {
        if(in_array($k,array('name','add')))
            return $this->$k;
        else
            echo "{$k}是只写属性<br>";
    }
}
//测试
$stu=new Student;
$stu->name='tom';
$stu->age=22;
echo '姓名:'.$stu->name,'<br>';
echo '地址:'.$stu->add,'<br>';


__call()、__callstatic()

1
2
__call():调用无法访问的方法时自动执行
__callstatic():调用无法访问的静态方法时自动执行

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
class Student {
    /**
    *作用:调用无法访问的方法时自动执行
    *@param $fn_name string 方法名
    *@param $fn_args array 参数数组
    */
    public function __call($fn_name,$fn_args) {
        echo "{$fn_name}不存在<br>";
    }
    //调用无法访问的静态方法时自动执行
    public static function __callstatic($fn_name,$fn_args) {
        echo "{$fn_name}静态方法不存在<br>";   
    }
}
//测试
$stu=new Student;
$stu->show(10,20);
 
Student::show();

__sleep()、__wakeup()

1
2
__sleep():当序列化的时候自动调用
__wakeup():当反序列化的时候自动调用

案例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?php
class Student {
    private $name;
    private $sex;
    private $add='中国';
    public function __construct($name,$sex) {
        $this->name=$name;
        $this->sex=$sex;
    }
    /**
    *序列化的时候自动调用
    *@return array 序列化的属性名
    */
    public function __sleep() {
        return array('name','sex');
    }
    //反序列化的时候自动调用
    public function __wakeup() {
        $this->type='学生';
    }
}
//测试
$stu=new Student('tom','男');
$str=serialize($stu);   //序列化
$stu=unserialize($str); //反序列化
print_r($stu);


通过模拟方法重载
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
class Math {
    public function __call($fn_name,$fn_args) {
        $sum=0;
        foreach($fn_args as $v) {
            $sum+=$v;
        }
        echo implode(',',$fn_args).'的和是:'.$sum,'<br>';
    }
}
//利用魔术方法模拟方法重载
$math=new Math();
$math->call(10,20);
$math->call(10,20,30);
$math->call(10,20,30,40);


小米技术社区

本站内容均为小米原创,转载请注明出处:小米技术社区>> PHP的常用魔术方法