• 技术文章 >后端开发 >php教程

    php延迟绑定和非延迟绑定解析

    小云云小云云2018-03-01 13:42:17原创609
    php版本: php5.6

    延迟绑定有: get_class($this), get_called_class(), new static(), static::
    非延迟绑定有:get_class(), __CLASS__, new self(), self::

    使用new static()时

    <?phpclass NewStatic{
        //该类的实例
        private $newStatic;    //判断$newStatic是否为空,为空则实例化自身并存入$newStatic
        public function init()
        {
            if (empty($this -> newStatic)) {            $this -> newStatic = new static();            echo "该类已初始化";
            }        else {            $this -> newStatic -> exec();
            }
        }    //该类的执行方法
        public function exec()
        {
            echo "该类NewStatic已执行";
        }
    }class Sub extends NewStatic{
        //覆盖父类中的exec方法,用于区分
        public function exec()
        {
            echo "该类Sub已执行";
        }
    }echo "<h3>NewStatic的测试结果</h3>";$newStatic = new NewStatic();echo "第一次执行初始化的结果:<br>";$newStatic -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "<h3>NewStatic的子类Sub的测试结果</h3>";$sub = new Sub();echo "第一次执行初始化的结果:<br>";$sub -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$sub -> init();  //输出结果: 该类Sub已执行

    将static替换为self

    <?phpclass NewStatic{
        //该类的实例
        private $newStatic;    //判断$newStatic是否为空,为空则实例化自身并存入$newStatic
        public function init()
        {
            if (empty($this -> newStatic)) {            $this -> newStatic = new self();  //修改此处的static为self
                echo "该类已初始化";
            }        else {            $this -> newStatic -> exec();
            }
        }    //该类的执行方法
        public function exec()
        {
            echo "该类NewStatic已执行";
        }
    }class Sub extends NewStatic{
        //覆盖父类中的exec方法,用于区分
        public function exec()
        {
            echo "该类Sub已执行";
        }
    }echo "<h3>NewStatic的测试结果</h3>";$newStatic = new NewStatic();echo "第一次执行初始化的结果:<br>";$newStatic -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "<h3>NewStatic的子类Sub的测试结果</h3>";$sub = new Sub();echo "第一次执行初始化的结果:<br>";$sub -> init(); // 输出结果: 该类已初始化echo "<br>第二次执行初始化的结果:<br>";$sub -> init();  //输出结果: 该类NewStatic已执行 此处输出的结果发生了变化

    结论:

        如果在子类中调用父类中含有new static()的方法时,它实例化子类,但是如果是父类中使用的是new self()的话,那么实例化的就是父类了,new self()永远指向定义的那个类,而new static()
    会绑定调用时的那个类(延迟绑定)这就是new static()和new self()的区别。这个区别实际上跟static::和self::的区别是一样的,使用static::调用静态方法时调用的是延迟绑定后的类的静态方法,而self::指向定义的静态类的方法
    
    另外要补充的一点new self()等同于如下写法:$class = get_class(); //注意:这里的get_class()里边没有传递参数$obj = new $class();
    或者$class = __CLASS__;$obj = new $class();new static()等同于如下写法:$class = get_called_class();$obj = new $class();
    或者$class = get_class($this); // 这里get_class()有没有传递参数效果是不一样的,跟这个函数本身的特性有关$obj = new $class();

    相关推荐:

    php中关于静态延迟绑定与普通静态效率的对比详解

    PHP中父类与子类的晚期绑定/延迟绑定

    PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定_php实例

    以上就是php延迟绑定和非延迟绑定解析的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php 解析 绑定
    上一篇:PHP关于日期加减计算的代码分享 下一篇:php常量和数据类型实例详解
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• PHP文件上传后缀名与文件类型对照表整理_PHP教程• PHP开发中常用的字符串操作函数_PHP教程• PHP项目开发中最常用的自定义函数整理_PHP教程• PHP网站安装程序制作的原理、步骤、注意事项和示例代码_PHP教程• PHP 页面跳转到另一个页面的多种方法方法总结_PHP教程
    1/1

    PHP中文网