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

陆奇将卸任百度总裁兼COO 百度盘中股价大跌超5% 保姆纵火案现场视频首次公布 还原火场及救援经过 北京:个人名义募捐拟被禁 承诺捐款未履行将被诉 2018中乙规程发布将有与中甲附加赛 2019赛季扩军 安监总局公布今年首批安全生产联合惩戒黑名单 天王星云层被发现含硫化氢 像一颗大号臭鸡蛋(图) 墨西哥西南发生5.2级地震 市民纷纷上街避难(图) 他把相恋多年女友嫁给别人做老婆 结果被判刑 PGA年度最佳球员奖竞争激烈?DJ罗斯与托马斯互撕 十三届全国人大一次会议5日上午9时开幕 俄罗斯大选进行时 俄中选委信息中心遭黑客攻击 曝曼联挖巴萨大将真有戏 巴萨已提前找好备胎
赛季首秀!战梅县徐亮终于复出 周末再迎广东德比 美全球鹰无人机沿伊朗国境飞行 伊方:敢入境就打掉 国锦赛决赛丁俊晖全场梦游 1-10惨败塞尔比 美元融资成本逼近英国退欧公投时的高点 港汇弱势限制港股表现 短线50天线遇阻力 叙利亚一住宅楼发生爆炸 已致28死135伤 申花伤病危机升级:3人铁定缺战重庆 莫雷诺秦升待定 互金专委会:累计发现假虚拟货币421种 60%以上在境… 俄罗斯超过12万人申请“远东1公顷”土地 女子为留乡愁 捐万元从屠户刀下救下耕牛(图) 索萨:这种方式被绝杀无法接受 权敬源缺席有影响 美国数万教师走上街头 要求政府加大对教育投入
中方时隔11年再次向日本提供朱鹮 外交部回应 朝核问题可采用“利比亚模式”?中方:从来不赞成 迪士尼713亿美元收购21世纪福斯获股东批准 官网地图抹去大半中国 日企致歉后存留板块无台湾 BATJ区块链布局:各有侧重 “杀手级”应用未现 国内期市收盘涨跌分化 黑色走弱有色上涨焦炭跌逾2% 中超-高拉特双响拉维奇收礼 恒大2-2华夏近4场不胜 曝穆帅清洗3名将筹1.1亿!今夏将砸2亿招兵买马 长生生物被指上市时粉饰业绩 律师扩大索赔征集范围 怎么在家里挣钱 怎样白手起家赚钱 如何创业白手起家 什么项目前景好 AG亚游集团