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());
    }

}

以下是执行结果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_39004843/article/details/105685839