欢迎来到[自学php网] ①群 AG亚游集团

AG亚游集团 > php专栏 > php综合实列 >

PHP类与对象后期静态绑定操作实例详解

来源:未知 ?? 时间:2018-12-25 14:05?作者:小飞侠

[导读] 本文实例讲述了PHP类与对象后期静态绑定操作。分享给大家供大家参考,具体如下: 做项目是后期静态绑定非常有用。比如service层单例模式,使用后期静态绑定就非常好实现。 自 PH...

本文实例讲述了PHP类与对象后期静态绑定操作。分享给大家供大家参考,具体如下:

做项目是后期静态绑定非常有用。比如service层单例模式,使用后期静态绑定就非常好实现。

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式进行的静态调用:self::parent::static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。

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

<?php
class A {
  public static function who() {
    echo __CLASS__;
  }
  public static function test() {
    static::who(); / 后期静态绑定从这里开始
  }
}
class B extends A {
  public static function who() {
    echo __CLASS__;
  }
}
B::test();
?>

以上例程会输出:

B

Note:

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

Example #3 非静态环境下使用 static::

<?php
class A {
  private function foo() {
    echo "success!\n";
  }
  public function test() {
    $this->foo();
    static::foo();
  }
}
class B extends A {
  /* foo() will be copied to B, hence its scope will still be A and
  * the call be successful */
}
class C extends A {
  private function foo() {
    /* original method is replaced; the scope of the new one is C */
  }
}
$b = new B();
$b->test();
$c = new C();
$c->test();  /fails
?>

以上例程会输出:

success!
success!
success!
Fatal error: Call to private method C::foo() from context ‘A' in /tmp/test.php on line 7

Note:

后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。

Example #4 转发和非转发调用

<?php
class A {
  public static function foo() {
    static::who();
  }
  public static function who() {
    echo __CLASS__."\n";
  }
}
class B extends A {
  public static function test() {
    A::foo();
    parent::foo();
    self::foo();
  }
  public static function who() {
    echo __CLASS__."\n";
  }
}
class C extends B {
  public static function who() {
    echo __CLASS__."\n";
  }
}
C::test();
?>

以上例程会输出:

A
C
C

最新文章

点击排行

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号@版权所有AG亚游集团

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

美军特种部队遭伏击四人阵亡 视频还原悲惨全过程 英国“脱欧”将为德国银行业创造大量就业岗位 中国将建立本国适航标准体系 可为国产航发应用铺路 莫迪访索契见普京 期待加强印俄特惠战略伙伴关系 更美App完成美图领衔5000万美元D1轮融资 村支书为儿子操办“升学宴”40余桌 收礼金6万多 墨西哥旅游胜地渡轮疑现爆炸装置 美FBI介入调查 乌克兰:俄总统选举期间加强主要城市安防措施 俄前间谍女儿发声:父亲仍病重 没人替我们说话 筛查三十四万颗恒星“DNA”帮太阳找“兄妹” 围棋世界排名柯洁涨21分 芈昱廷赶超井山排第4 俄方:美欧不承认委内瑞拉选举结果 将致严重后果
半导体巨头ARM落户国内 将助成都融入全球产业链 4名少年当街侮辱残疾女子还发照炫耀 惹众怒被捕 台媒:大陆或闪电“武统”台湾 让台同胞享改革红利 特朗普:欧盟正对美国采取非常严厉的经济政策 特朗普决定解除迈克-马斯特的国家安全顾问职务 网友纷纷悼念史蒂芬·霍金:这是全人类的损失! 美国飞虎队陈纳德遗孀陈香梅逝世 中方:深表哀悼 富士胶片称施乐无权终止并购交易 考虑采取法律行动 美用新马歇尔计划“繁荣朝鲜”?韩方这边楼市火了 篮协新政让土豪球队难引援?广东一做法或已赢未来 斯托:要踢出中国最美丽足球 迎战国安非常刺激 华为:余承东对美国市场的评论不代表公司观点
定海神针复出!齐整恒大力争开胡 曾诚:已做好准备 玻利维亚为要回太平洋出海口 诞生世界最大旗帜 拼44分钟赛后让人搀扶 小丁:打完3节就没劲了 超奥胖升至历史第14!过气超巨本季场均16+12 震慑“台独”警告美国 解放军将用炮弹“说话” 河南三门峡女书记受贿细节:下属送百万获提拔(图) 技术冲击不可小觑 中美谈判将决定全球化的命运 津巴布韦执政党非洲民族联盟赢得议会多数席位 G20峰会美欲拉拢欧日未得逞 法财长警告贸易战没赢家 养一百只土鸡利润多少 开什么店比较有市场 笨蛋也能年赚100万 2016做什么生意有前景 AG亚游集团