欢迎来到[自学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

单眼盲人不能拿教师资格证?女子体检3次都不合格 法国多所大学遭抗议学生封锁 期末考试被迫延后 印媒解读印度潜艇实力:远超巴铁但比中国少了60艘 马航MH370失联乘客家属:马方新报告有错误 新研究指抗抑郁药有效 为医学界一大争议划句号 穆帅遭英媒挖坟!当年嘲笑弗格森 现在遭报应了 一带一路国象大师进校园 卜祥志杜道与小朋友互动 富力危机公关或难救斯托被追罚 大将肘击也将停赛 经济强劲的体现?美债收益率18年来首超其他发达国家 前希捷科技CFO加盟特斯拉:填补公司首席会计官空缺 C罗加盟中超?!转会专家惊曝天津球队接触C罗 扎哈维2018要破个人进球纪录:续约是对我的尊重
印度一辆客车坠桥 已致10死35伤 野生亚洲象闯云南普洱城区 途经6个小区损坏道路 山西孝义市委书记马文革涉违纪被审查(简历) 优酷清理涉嫌侮辱戏谑英烈视频 已下线暴走大事件 大东建托女子赛黄雅琳继续领先 鲁婉遥滑落到T16 亚运会奇葩赛程助中国男篮夺冠?两大主力存隐患 外媒:美国在人工智能领域领先 但中国已缩小差距 进球gif-张文钊助攻高拉特梅开二度 恒大3-0亚泰 人民日报:法治的分量在人心的秤上 巴萨官方宣布B队主帅下课 原青年队主帅接替执教 天津市长“刮骨疗毒” 厅官就地免职 网约车危害乘客事件频发 交通部:乘客安全是底线
2018阿根廷青奥会圣火点燃 青奥会首登南美大陆 1岁男婴脸上缝了45针 只因碰了家里的这个 昂山素季签署通告 谴责缅甸腊戍爆炸恐怖行径 英媒:英国几乎肯定普京参与对俄前特工毒杀行动 SEC同意共同基金不披露资产流动性数据 为“邻居”做好后勤保障 达美看重与美国大师赛合作 羊城晚报:现在的中国女排还输得起 尤文新球衣设计惹球迷不满 上万名球迷申请修改 富士康完成IPO战投初步遴选 BAT等大概率入围 藏在农村的暴利小生意 未来10年最赚钱行业 笨蛋也能年赚100万 白手起家什么意思 AG亚游集团