请选择 进入手机版 | 继续访问电脑版
绿茶科技社区

PHP后期静态绑定实例浅析

2019-9-29 02:41
1443
这篇文章主要介绍了PHP后期静态绑定,结合实例形式分析了php后期静态绑定相关概念、原理、使用方法与相关注意事项,需要的朋友可以参考下
本文实例讲述了PHP后期静态绑定。分享给大家供大家参考,具体如下:
从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类
该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的,也可以成为“静态绑定”;因为他可以用于(但不限于静态方法的调用)。
self::的限制
使用self::或者_class_对当前类的静态引用,取决于定义当前方法所在的类
例子:
  1. class A {
  2.   public static function who() {
  3.     echo __CLASS__;
  4.   }
  5.   public static function test() {
  6.     self::who();
  7.   }
  8. }
  9. class B extends A {
  10.   public static function who() {
  11.     echo __CLASS__;
  12.   }
  13. }
  14. B::test(); //A
复制代码
打印结果:
  1. A
复制代码
后期静态绑定的用法
后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制。简单的说,这个关键字能够让你在上述中调用test()时引用的类是B而不是A。最终决定不引用新的关键字,而是使用已经预留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
复制代码
后期静态绑定的处理方式解决了以往完全没有解决的静态调用,另外一方面,如果静态调用使用parent::或者self::将转发调用信息
  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
复制代码
例子:
  1. <?php
  2. class a {
  3. static public function test() {
  4.   print get_called_class();
  5. }
  6. }
  7. class b extends a {
  8. }
  9. a::test();
  10. b::test();
  11. ?>
复制代码
打印结果:
  1. a
  2. b
复制代码
特别声明:

get_called_class();获得类的名称静态方法中调用



分享到 :
0 人收藏

3 个回复

倒序浏览
Zachary_Fan  高级会员 | 2019-9-29 03:02:23
广告位,,坐下看看
 高级会员 | 2019-10-14 18:34:56
顶顶更健康
sparkdev  高级会员 | 2019-10-16 22:52:30
珍爱生命,果断回帖。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

举报|Archiver|手机版|小黑屋|Lvchakeji Inc.  

Powered by Discuz! X3.3 © 2001-2016 Comsenz Inc.

返回顶部