zoukankan      html  css  js  c++  java
  • 魔术变量__get和__set()和__call() 的详解

    在外部调用类中不公开的属性时(private,protected),程序会抛出错误信息
    Fatal error: Uncaught Error: Cannot access private property Db::$name
    有了__get()和__set()后,当外部调用类中不开的属性时,程序会自动调用__get()、__set()方法。
    在类中未声明魔术方法__get()、__set() 方法时,外部调用私有属性会报错:

    class User 
    {
        private $name = '大笑哈哈';
    }
    $user = new User;
    echo $user->name ; //Fatal error: Uncaught Error: Cannot access private property User::$name
    

    //Fatal error: Uncaught Error: Cannot access private property User::$name

    __get($name)

    当使用__get() 函数时,程序会自动调用__get()函数,__get($name)函数必须接收一个参数。看如下代码:

    class User
    {
        private $name = '大笑哈哈';
        //__get() 必须接受一个参数。
        public function __get($name)
        {
            return $name;
        }
    }
    
    $user = new User;
    echo $user->name; //name ;自动调用__get函数,并返回了当前调用的属性名称。
    

    __set($name ,$value);

    __set($name ,$value) ,设置不公开的属性。必须接受两个参数。实例代码:

    class User
    {
        private $name;
        public function __set($name ,$value)
        {
            $this->$name = $value;
        }
        
        public function getName()
        {
            return $this->name;
        }
    }
    $user = new User;
    $user->name = '大笑哈哈';
    echo $user->getName(); //'大笑哈哈';在外部修改了类中私有属性。
    
    

    __call($method ,$args);

    __call($method ,$args) 当调用类中不存在的方法时,则会调用__call方法,该方法接受两个参数,$method为当前调用不存在的方法名称,$args为方法中的参数,参数可能有多个,所有$args参数为数组,看实例代码:

    class User
    {
        /*
           $method [String] 方法名称
           $args   [Array]  方法参数
        */
        public function __call($method ,$args)
        {
            var_dump($method ,$args);
        }
    }
    
    $user = new User;
    
    //User类中没有index 方法,那么程序会自动调用__call方法。
    $user->index('大笑哈哈');// 返回__call方法的结果。string(5) "index" array(1) { [0]=> string(12) "大笑哈哈" }
    
    
  • 相关阅读:
    Aria2任意文件写入漏洞
    webpack添加node_path不是('webpack' 不是内部或外部命令,也不是可运行的程序或批处理文件?)
    闭包的7种形式
    首页 多级展示
    velocity模板入门
    AngularJs 时间控件
    mybatis按时间条件搜索
    数据结构之线性表(双向循环链表)
    数据结构之线性表(链表)
    数据结构之线性表(顺序表)
  • 原文地址:https://www.cnblogs.com/daxiaohaha/p/11539848.html
Copyright © 2011-2022 走看看