zoukankan      html  css  js  c++  java
  • php魔术方法的使用

    1、魔术方法:

    /**
     * @purpose: 魔术方法 __get() , __set(), __isset(), __call, __callStatic, __toString, __invoke 的使用
     * User: daicr
     * Date: 2019/3/4
     * Time: 11:10
     *
     * 1、当我们调用一个权限上不允许调用的属性,和不存在的属性时,__get魔术方法会自动调用
     *
     * 2、当为无权操作的属性赋值时,或不存在的属性赋值时,__set()自动调用
     *
     * 3、当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性),会引发 __isset()来执行
     * 
     * 4、当所调用对象的方法不存在时默认调用 __call
     * 
     * 5、当所调用对象的静态方法不存在时默认调用 __callStatic
     * 
     * 6、当一个类或者对象被当做字符串返回时,会调用 __toString 来输出
     * 
     * 7、当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
     */
    class Test
    {
        /**
         * @var string 私有属性,外部方法访问不了,会默认调用 __get
         */
        private $username = 'daicr';
    
        /**
         * @var array 存放对象的属性数组
         */
        protected $attributes = [];
    
        /**
         * @purpose: 当我们调用一个权限上不允许调用的属性,和不存在的属性时,__get魔术方法会自动调用
         * @param string $name 属性名
         * @return mixed
         */
        public function __get($name)
        {
            if(array_key_exists($name,$this->attributes)){
                return $this->attributes[$name];
            }
        }
    
        /**
         * @purpose: 当为无权操作的属性赋值时,或不存在的属性赋值时,__set()自动调用
         * @param string $name 属性名
         * @param mixed $value 属性值
         */
        public function __set($name, $value)
        {
            if(property_exists($this,$name)){
                $this->$name = $value;
            }else{
                $this->attributes[$name] = $value;
            }
        }
    
        /**
         * @purpose: 当 用isset() 判断对象不可见的属性时(protected/private/不存在的属性),会引发 __isset()来执行
         * @param string $name 属性名
         * @return bool
         */
        public function __isset($name)
        {
            if(isset($this->attributes[$name])){
                return true;
            }
        }
    
    
        /**
         * @purpose: 当所调用对象的方法不存在时默认调用 __call
         * @param string $name 方法名
         * @param mixed $arguments 参数
         */
        public function __call($name, $arguments)
        {
            // 注意: $name 的值区分大小写
            echo "对象方法名: '$name' , 参数:" . implode(', ', $arguments). "
    ";
        }
        /**
         * @purpose: 当所调用对象的静态方法不存在时默认调用 __callStatic
         * @param string $name 方法名
         * @param mixed $arguments 参数
         */
        public static function __callStatic($name, $arguments)
        {
            // 注意: $name 的值区分大小写
            echo "对象静态方法名: '$name' " . implode(', ', $arguments). "
    ";
        }
    
        /**
         * @purpose: 当一个类或者对象被当做字符串返回时,会调用 __toString 来输出
         * @return string
         */
        public function __toString()
        {
            return __CLASS__;
        }
    
        /**
         * @purpose: 当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
         */
        public function __invoke()
        {
            echo 'invoke';
        }
    
        /**
         * @purpose: 打印对象属性数组
         */
        public function index(){
            var_dump($this->attributes);
        }
    }

    2、调用魔术方法(在另外一个类的方法里面)

    public function index()
    {
        $testModel = new Test();
    
        // 访问一个私有属性,如果没有__get(),是会报错的。过程:$testModel->username--没有权限-->__get('username');
        echo $testModel->username;
    
        //$testModel没有age属性,但是会通过__set()进行赋值
        $testModel->age=26;
        $testModel->index(); //array(1) { ["age"]=> int(26) }
    
        echo $testModel->test('hello');  //"对象方法名: 'test' , 参数:hello
    
        echo $testModel::test( ['hello','world']);  //"对象静态方法名:'test' , 参数:hello
    
        //直接输出对象的时候,会输出对象名的字符串形式. 输出值为: Test
        echo $testModel;
    
        //把类当做方法来使用,会调用__invoke ,  输出值为:invoke.
        echo $testModel();
    }

    此文章为小代在工作中的总结,如有转载请注明出处https://www.cnblogs.com/chrdai/

  • 相关阅读:
    计算某天的下一天:黑盒测试之等价类划分+JUnit参数化测试
    黑盒测试之因果图法
    黑盒测试之等价类划分
    JUnit白盒测试之基本路径测试:称重3次找到假球
    Java实现称重3次找到假球
    用pymysql和Flask搭建后端,响应前端POST和GET请求,实现登录和注册功能
    【算法与数据结构】包含负数的基数排序
    【机器学习实战】第六章--支持向量机
    【机器学习实战】第四章朴素贝叶斯
    【算法与数据结构】--经典排序算法Python实现
  • 原文地址:https://www.cnblogs.com/chrdai/p/10470533.html
Copyright © 2011-2022 走看看