• 售前

  • 售后

热门帖子
入门百科

PHP类与对象后期静态绑定利用实例详解

[复制链接]
胡37 显示全部楼层 发表于 2021-10-26 13:30:35 |阅读模式 打印 上一主题 下一主题
本文实例报告了PHP类与对象后期静态绑定操作。分享给大家供大家参考,具体如下:
做项目是后期静态绑定非常有用。比如service层单例模式,利用后期静态绑定就非常好实现。
自 PHP 5.3.0 起,PHP 增长了一个叫做后期静态绑定的功能,用于在继续范围内引用静态调用的类。
准确说,后期静态绑定工作原理是存储了在上一个“非转发调用”(non-forwarding call)的类名。当举行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部门);当举行非静态方法调用时,即为该对象所属的类。所谓的“转发调用”(forwarding call)指的是通过以下几种方式举行的静态调用:
  1. self::
复制代码
  1. parent::
复制代码
  1. static::
复制代码
以及
  1. forward_static_call()
复制代码
。可用
  1. get_called_class()
复制代码
函数来得到被调用的方法地点的类名,static:: 则指出了其范围。
该功能从语言内部角度考虑被定名为“后期静态绑定”。“后期绑定”的意思是说,
  1. static::
复制代码
不再被剖析为定义当火线法地点的类,而是在现实运行时计算的。也可以称之为“静态绑定”,由于它可以用于(但不限于)静态方法的调用。
  1. <?php
  2. class A {
  3.   public static function who() {
  4.     echo __CLASS__;
  5.   }
  6.   public static function test() {
  7.     static::who(); // 后期静态绑定从这里开始
  8.   }
  9. }
  10. class B extends A {
  11.   public static function who() {
  12.     echo __CLASS__;
  13.   }
  14. }
  15. B::test();
  16. ?>
复制代码
以上例程会输出:
  1. B
复制代码
Note:
在非静态情况下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则大概给出差别结果。另一个区别是 static:: 只能用于静态属性。
Example #3 非静态情况下利用 static::
  1. <?php
  2. class A {
  3.   private function foo() {
  4.     echo "success!\n";
  5.   }
  6.   public function test() {
  7.     $this->foo();
  8.     static::foo();
  9.   }
  10. }
  11. class B extends A {
  12.   /* foo() will be copied to B, hence its scope will still be A and
  13.   * the call be successful */
  14. }
  15. class C extends A {
  16.   private function foo() {
  17.     /* original method is replaced; the scope of the new one is C */
  18.   }
  19. }
  20. $b = new B();
  21. $b->test();
  22. $c = new C();
  23. $c->test();  //fails
  24. ?>
复制代码
以上例程会输出:
  1. success!
  2. success!
  3. success!
  4. Fatal error: Call to private method C::foo() from context ‘A' in /tmp/test.php on line 7
复制代码
Note:
后期静态绑定的剖析会一直到取得一个完全剖析了的静态调用为止。另一方面,假如静态调用利用
  1. parent::
复制代码
或者
  1. self::
复制代码
将转发调用信息。
Example #4 转发和非转发调用
  1. <?php
  2. class A {
  3.   public static function foo() {
  4.     static::who();
  5.   }
  6.   public static function who() {
  7.     echo __CLASS__."\n";
  8.   }
  9. }
  10. class B extends A {
  11.   public static function test() {
  12.     A::foo();
  13.     parent::foo();
  14.     self::foo();
  15.   }
  16.   public static function who() {
  17.     echo __CLASS__."\n";
  18.   }
  19. }
  20. class C extends B {
  21.   public static function who() {
  22.     echo __CLASS__."\n";
  23.   }
  24. }
  25. C::test();
  26. ?>
复制代码
以上例程会输出:
  1. A
  2. C
  3. C
复制代码
更多关于PHP相关内容感兴趣的读者可查察本站专题:《php面向对象程序设计入门教程》、《PHP数组(Array)操作技巧大全》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
盼望本文所述对大家PHP程序设计有所资助。

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作