PHP常见__construct、__call()等魔术方法的使用

常见魔术方法

参考: PHP常用的魔术方法及规则

1.__construct 具有构造函数的类会在每次创建新对象时先调用此方法;初始化工作执行。
3.__call() 在对象中调用一个不可访问方法时,__call() 会被调用。
4.__callStatic() 在静态上下文中调用一个不可访问方法时,__callStatic() 会被调用。
5.__set() 在给不可访问的属性赋值时调用
6.__get() 读取不可访问的属性值是自动调用
7.__isset() 当对不可访问的私有属性使用isset或empty时自动调用
8.__unset() 当对不可访问的私有属性使用unset时;自动调用
9.__toString()当一个类的实例对象;被当成一个字符串输出时调用

实例:(我直接用laravel的Controller来做实验了,实例里的dump() 是laravel 的断点函数)
1.父类:

class ParentController
{
    private $name = 'xiaochi';

    public function __construct($data = [])
    {
        dump('调用父类 __construct 构造函数');
    }

    private function syfun()
    {
        dump('这是私有方法');
    }

    private static function syfunStatic()
    {
        dump('这是静态私有方法');
    }

    //访问私有方法
    public function __call($method, $arg_array)
    {
        dump("访问私有方法:".$method." ,自动调用了父类__call方法");
        return $this->$method();
    }

    //访问静态私有方法
    public static function __callStatic($method, $arg_array)
    {
        dump("访问静态私有方法:".$method." ,自动调用了父类__callStatic方法");
        return self::$method();
    }

    //获取私有属性
    public function __get($attribute){
        dump("访问私有属性:".$attribute.",自动调用了父类__get()方法");
        if(isset($this->$attribute)){
            return $this->$attribute;
        } else{
            dump($attribute);
            return $attribute;
        }
    }

    //设置私有属性
    public function __set($attribute,$val){
        dump("赋值私有属性:".$attribute." 值:" .$val." ,自动调用了父类__set()方法为私有属性赋值");
        $this->$attribute = $val;
    }

    //  当对不可访问属性调用 isset() 或 empty() 时,__isset() 会被调用。
    public function __isset($attribute)
    {
        dump("是否定义 ".$attribute." 值?\n");
    }

    // 当对不可访问属性调用 unset()会被调用
    public function __unset($attribute)
    {
        dump("销毁私有变量 ".$attribute." 时调动");
    }

    // 当类 被当成字符串时 会被调用
    public function __toString() {
        return __CLASS__.'类 被当做字符串调用';
    }
}

子类:

class TestController extends ParentController
{
    public function __construct($data = [])
    {
        //子类的构造方法中不会自动的调用父类的构造方法 		  
        parent::__construct();  //执行父类的构造函数
        dump('调用子类 __construct 构造函数');
    }

    private $name2 = 'cyk';

    public function magicFun()
    {
        echo $this->name;  //获取父类private私有属性值自动调用父类__get()方法
        $this->name = $this->name2;  ///设置父类private私有属性值自动调用父类__get()方法
        echo $this->name;

        $this->syfun();
        ParentController::syfunStatic();

        dump(isset($this->name));
        dump(empty($this->name));
        unset($this->name);

        echo (new ParentController());
    }

}

以下是执行结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值