PHP之常见的魔法方法

PHP魔法方法与序列化和反序列化

序列化与反序列化

数组的序列化

$stu = ['tom','berry','ketty'];
$str = serialize($stu);//序列化
file_put_contents('./a.txt',$str);

数组的反序列化

$str = file_get_contents('./a.txt');
$stu = unserialize($str);
echo '<pre>';
var_dump($stu);
print_r($stu);
//对象的序列化与反序列化接近都类似

魔术方法

知识点:
1. __construct():构造函数
2. __destruct():析构函数
3. __clone():调用clone指令的时候调用
4. __tostring():将对象当成字符串使用的时候自动调用
5. __invoke():将对象当成函数的时候自动调用
6. __set():给无法访问的属性赋值的时候自动调用
7. __get():获取无法访问的属性自动调用
8. __isset():判断无法访问的属性是否存在自动调用
9. __unset():销毁无法访问的属性的时候自动执行
10. __call():调用无法访问的方法时自动执行
11. __callstatic():调用无法访问的静态方法的时候自动执行
12. __sleep():当序列化的时候自动执行
13. __wakeup():当反序列化的时候自动执行

clone与__clone()

1. 创建对象的方法有:
2. 实例化
3. 克隆
class Student{
    public function __clone()
    {
        echo '正在克隆对象<br>';
    }
}
$stu = new Student();
$stu2 = clone $stu;
var_dump($stu,$stu2);//object(Student)#1 (0) { } object(Student)#2 (0) { }
echo '<br>';
小结:
1. clone的创建对象方法之一
2. 当执行clone指令的时候,会自动调用__clone()方法

__tostring和__invoke

class Student{
    //把对象当成字符串使用时自动执行
    public function __toString()
    {
        return '这是一个对象,不是字符串<br>';
    }
    //把对象当成函数使用的时候自动执行
    public function __invoke()
    {
        echo '这是一个对象,不是函数<br>';
    }
}
$stu = new Student;
echo $stu;//当成字符串使用
$stu();//当成函数使用

__set()__get()__isset()

class A{
    private $name;
    private $sex;
    private $age;
    //给无法访问的属性赋值的时候自动调用
    public function __set($name, $value)
    {
        $this->$name=$value;
    }
    //获取无法访问的属性值的时候自动执行
    public function __get($name)
    {
        return $this->$name;
    }
    //判断无法访问的属性是否存在自动调用
    public function __isset($name)
    {
        return isset($this->$name);
    }
}
//测试
$a = new A();
$a->name='tom';
$a->sex='男';
$a->age=22;
echo $a->name,'<br>';//tom
var_dump(isset($a->name));//bool(true)
例题
class B{
    private $name; //读写属性
    private $add='中国'; //只读属性
    private $age; //只写属性
    public function __set($name, $value)
    {
        if (in_array($name,array('name','age'))){
            $this->$name=$value;
        }
        else{
            echo "{$name}属性是只读属性<br>";
        }
    }
    public function __get($name)
    {
        if (in_array($name,array('name','add'))){
            return $this->$name;
        }
        else
            echo "{$name}是只写属性<br>";
    }
}
//测试
$b = new B();
$b->name='tom';
$b->age=88;
echo '姓名:'.$b->name,'<br>';
echo '地址:'.$b->add,'<br>';

__call()__callstatic()

class C{
    public function __call($name, $arguments)
    {
        echo "{$name}不存在<br>";
    }
    public static function __callStatic($name, $arguments)
    {
        echo "{$name}静态方法不存在<br>";
    }
}
$c = new C();
$c->show(11,22);//show不存在
C::show();//show静态方法不存在

__sleep()__wakeup()

class E{
    private $add='中国';
    private $name;
    private $sex;
    public function __construct($name,$sex)
    {
        $this->name=$name;
        $this->sex=$sex;
    }
    //序列化的时候自动调用
    public function __sleep()
    {
        return array('name','age');
    }
    //反序列化的时候自动调用
    public function __wakeup()
    {
        $this->type='学生';
    }
}
//测试
$e = new E('TOM','男');
$str = serialize($e);
echo $str,'<br>';//O:1:"E":2:{s:7:"Ename";s:3:"TOM";s:3:"age";N;}

使用魔法方法实现重载

class Math{
    public function __call($name, $arguments)
    {
        $sum = 0;
        foreach ($arguments as $v):
            $sum+=$v;
        endforeach;
        echo implode(',',$arguments).'的和为:'.$sum.'<br>';
    }
}
$math = new Math();
$math->add(10,20);
$math->add(10,30,40);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值