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

小云云
Freigeben: 2023-03-20 15:40:01
Original
1153 人浏览过

php版本: php5.6

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

使用new static()时

 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 "

NewStatic的测试结果

";$newStatic = new NewStatic();echo "第一次执行初始化的结果:
";$newStatic -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "

NewStatic的子类Sub的测试结果

";$sub = new Sub();echo "第一次执行初始化的结果:
";$sub -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$sub -> init();  //输出结果: 该类Sub已执行
Nach dem Login kopieren

将static替换为self

 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 "

NewStatic的测试结果

";$newStatic = new NewStatic();echo "第一次执行初始化的结果:
";$newStatic -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$newStatic -> init(); //输出结果: 该类NewStatic已执行echo "

NewStatic的子类Sub的测试结果

";$sub = new Sub();echo "第一次执行初始化的结果:
";$sub -> init(); // 输出结果: 该类已初始化echo "
第二次执行初始化的结果:
";$sub -> init();  //输出结果: 该类NewStatic已执行 此处输出的结果发生了变化
Nach dem Login kopieren

结论:

    如果在子类中调用父类中含有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();
Nach dem Login kopieren

相关推荐:

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

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

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

以上是php延迟绑定和非延迟绑定解析的详细内容。更多信息请关注PHP中文网其他相关文章!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!