php 后期延迟静态绑定(初步了解)

php中文网
发布: 2016-06-23 13:04:13
原创
1008人浏览过

(刚接触这个高大上的东西,还不是特别的了解,不过基本是搞明白一些了。)

从PHP 5.3.0开始,PHP增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。 该功能从语言内部角度考虑被命名为“后期静态绑定”。 “后期绑定”的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。 也可以称之为”静态绑定“,因为它可以用于(但不限于)静态方法的调用。

科普几个:1.什么是静态调用?并不是说有::就是静态调用,而是看calling scope。2.$this指针指向的对象就是这个方法被调用时刻的calling scope,静态调用是没有calling scope的,非静态调用this−>abc()中的this−>abc()中的this指向的对象就是calling scope。3.大家尽量要避免使用”::”来调用一个非静态的方法.4.this,self,parent三个关键字从字面上比较好理解,分别是指这、自己、父亲。this是指向当前对象的指针,self是指向当前类的指针,parent是指向父类的指针。5.静态环境即静态域。public static function
登录后复制

引用参考:

http://www.laruence.com/2012/06/14/2628.html

知了zKnown
知了zKnown

知了zKnown:致力于信息降噪 / 阅读提效的个人知识助手。

知了zKnown 65
查看详情 知了zKnown
http://www.cnblogs.com/yjf512/archive/2012/09/12/2682556.html

第一个例子

Example #1 self:: 用法< ?phpclass A {    public static function who() {//这是一个静态域        echo __CLASS__;    }    public static function test() {         self::who(); //self关键字是调用自身的静态域方法,调用的是上面那个    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();  //这里因为b继承了a,理论上B::test()应该是出现B的输出,但是因为使用 self:: ,self是调用自身            //所以输出A?>以上例程会输出:A
登录后复制

第二个例子

Example #2 static:: 简单用法< ?phpclass A {    public static function who() {        echo __CLASS__;    }    public static function test() {  //这是一个静态作用域        static::who(); // 后期静态绑定从这里开始                       // 虽然B继承A,B在调用test方法的时候,静态作用域会解析为了当前类B类,这就是“static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。”                       //所以会调用B类的who方法,所以输出B    }}class B extends A {    public static function who() {        echo __CLASS__;    }}B::test();  ?>以上例程会输出:B
登录后复制

在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。

立即学习PHP免费学习笔记(深入)”;

第三个例子

Example #3 非静态环境下使用 static::< ?phpclass A {    private function foo() {  //这不是一个静态域        echo "success!\n";    }    public function test() { //这不是一个静态域        $this->foo();        echo "---------\n";        var_dump($this);        static::foo();        echo "+++++++++\n";    }}class B extends A {   /* foo() will be copied to B, hence its scope will still be A and    * the call be successful */    //scope依然是A,所以能够调用private的foo}class C extends A {    private function foo() {        /* original method is replaced; the scope of the new one is C */        //因为c重写了foo方法,所以scope是c,而test是scope A,所以无法调用private的foo    }}$b = new B();$b->test();echo "--------分隔线,下面是c类相关调用\n";$c = new C();$c->test();   //fails?>以上例程会输出:success!---------object(B)#1 (0) {}success!+++++++++--------分隔线,下面是c类相关调用success!---------object(C)#2 (0) {}Fatal error: Call to private method C::foo() from context 'A'
登录后复制

目前还不知道怎么证明,但是可以知道一些东西,这个不是static作用域,所以有所属的scope,而函数本身的scope只能是自己,而不能是别人,即使是继承,除非用parent::来传递scope

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号