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

日企人才争夺危机感加强 华为发动高薪攻势 都四亿妄为凭啥光巴黎吃瘪?曼城赢了一手瓜帅 牛汇:多家国际顶级机构最新市场点评一览 海军军事专家尹卓:辽宁舰编队初步形成作战能力 朝鲜战争美军遗骸回国仪式:棺材用联合国旗包裹 俄媒称俄重建远洋海军仍需时间 一问题格外明显 广州市委:坚决全面彻底肃清李嘉万庆良流毒影响 湖南代表团热议全国人大常委会报告:彰显监督勇气 博彩公司开出詹皇决定三赔率!火箭高居榜首 岛内民调指标“统升独降” 民族认同创历年新高 暗物质:背锅侠还是救火队长?身份仍是个谜 “台独”策动禁挂五星红旗 渔民:不挂被外国欺负
大乐透头奖空开率达28%!为何远超双色球? 世界最后一头雄性北方白犀牛患重病 临近灭绝 类似病毒的微粒研制新型癌症疫苗:肿瘤细胞免疫反应 内蒙古工商行政管理局副局长杜隽世接受审查调查 油价上涨将使美国人多花380亿美元 减税成果抹去1/3 逗妹吐槽:吃饭睡觉打巴萨! 罗马这集我好像看过 美国众议院披露基建计划,联邦燃油税25年来首次提高 这部目前中国最火的电影 竟干出一件惹怒美国人的事 美媒称俄罗斯向中国交付首批S400系统 可装备一个营 野村:特斯拉市值将达千亿美元 股价或将涨到500美元 海地“靠近大陆”呼声高涨 台当局已心慌到坐不住 白宫拟撤销一批前高官安全许可 被批“非常狭隘”
林郑月娥:粤港澳大湾区规划“令人雀跃” 浙大要恢复重建遵义校区? 官方回应:暂无打算 辽足连吃三张罚单 累计被罚23.4万冯伯元禁赛5场 美国得州高中枪击事件细节:枪手未能引爆爆炸物 恒大亚冠前瞻:死生战需谨记1大原则 于汉超或成后手 北约峰会中暴露美德分歧 美将德视为潜在危险对手 外媒盘点特朗普执政一周年:“旋风总统”不走寻常路 外交部长王毅回答中外记者提问 这十句话太提气 澳大利亚:大众汽车仍未解决尾气排放超标问题 如何创业白手起家 今年开什么店好 在家可开啥小型加工厂 白手起家什么意思 AG亚游集团