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

苹果放弃在爱尔兰建设数据中心计划 因审批拖延太久 男子聚会饮酒死亡 同事无过错被酌情判补5.6万元 PRTS排名:斯维托丽娜升至第四 沃兹仍高居首位 潘建伟:合肥成继京沪后又一个大科学装置集中地 厉害了 中国建的这栋大楼印在了科威特纸币上(图) 美首位女中情局长诞生:系职业特工 多次卧底海外 富力12天4战体能是最大敌人 外援轮换斯帅改变传控 数据趣谈:8连胜之队两巨头用连续8场20+黑考神 日高官刚上任被扒黑料 安倍原以为选了“正经人” 扎克伯格4小时过堂 坦陈8700万用户数据泄露我之过 巨婴滴滴还能撑多久?烧了240亿美金仍未能盈利 越南政府同意台商悬挂“青天白日旗”?外交部回应
AETOS艾拓思:反欧党派领先 意大利政治风险上升 得分王装备科比技能包!2球打蒙对手但咋只11分 加密数字货币交易平台币安被攻击 用户损失无法挽回 前队友又狂赞詹皇!跟他打球有一点实在太舒服 纳粹独裁者希特勒到底死了没?牙齿鉴定揭真相 要立法禁狗肉?韩国人爱喝的“补食汤”或将消失 去年光伏组件出口达到37.9GW 出口额或较2016年… 狗从哪里来?关于动物的“知识考古学” 李霄鹏:鲁能没有老少和外援 板凳厚队员竞争上岗 汶川地震十年后 敬礼娃娃想找救他的解放军叔叔 河南西峡一钢厂发生安全事故 已致1死14伤 叙利亚全面解放南部边境省份 为全国解放打下基础
媒体评性侵举报:让肆无忌惮的咸猪手有所敬畏 传家乐福或将中国业务出售给阿里巴巴 但家乐福否认 美国商会警告政府:勿对从中国进口产品加征关税 张德江:人大常委会5年立法25件 修改法律127件次 拳击手私家车位被占 上演泰拳砸车发朋友圈被拘 北京发布暴雨蓝色预警 至21时城区将有短时强降水 官宣!上海与张兆旭完成续约 效力8年不离不弃 上港全力备战上海德比 不考虑复仇足协杯着眼未来 新华社评论员:确保党的领导更加坚强有力 女生适合开什么店 藏在农村的暴利小生意 中国食品品牌排行榜 加盟什么店最赚钱 AG亚游集团