PHP类与对象后期静态绑定操作实例详解


Posted in PHP onDecember 20, 2018

本文实例讲述了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 相关文章推荐
LotusPhp笔记之:Logger组件的使用方法
May 06 PHP
php获取网页标题和内容函数(不包含html标签)
Feb 03 PHP
php计算几分钟前、几小时前、几天前的几个函数、类分享
Apr 09 PHP
php连接odbc数据源并保存与查询数据的方法
Dec 24 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
AES加解密在php接口请求过程中的应用示例
Oct 26 PHP
PHP文件与目录操作示例
Dec 24 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP 中 var_export、print_r、var_dump 调试中的区别
Jun 19 PHP
php微信开发之关键词回复功能
Jun 13 PHP
PHP利用Mysql锁解决高并发的方法
Sep 04 PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 #PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 #PHP
PHP自定义错误处理的方法分析
Dec 19 #PHP
PHP异常类及异常处理操作实例详解
Dec 19 #PHP
PHP单例模式应用示例【多次连接数据库只实例化一次】
Dec 18 #PHP
You might like
如何对PHP程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
PHP翻页跳转功能实现方法
2020/11/30 PHP
PHP中__set()实例用法和基础讲解
2019/07/23 PHP
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
JavaScript 数组的 uniq 方法
2008/01/23 Javascript
在Javascript中 声明时用&quot;var&quot;与不用&quot;var&quot;的区别
2013/04/15 Javascript
JavaScript中Number.MIN_VALUE属性的使用示例
2015/06/04 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
vue-cli配置环境变量的方法
2018/07/09 Javascript
JavaScript中set与get方法用法示例
2018/08/15 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
node.js实现上传文件功能
2019/07/15 Javascript
vue 组件基础知识总结
2021/01/26 Vue.js
Python中的一些陷阱与技巧小结
2015/07/10 Python
详解Python的Django框架中的模版相关知识
2015/07/15 Python
请不要重复犯我在学习Python和Linux系统上的错误
2016/12/12 Python
Python面向对象中类(class)的简单理解与用法分析
2020/02/21 Python
python实现FTP循环上传文件
2020/03/20 Python
简单了解python列表和元组的区别
2020/05/14 Python
Tensorflow全局设置可见GPU编号操作
2020/06/30 Python
Pycharm安装第三方库失败解决方案
2020/11/17 Python
关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题
2020/11/28 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
html5+css3实现一款注册表单实例
2013/04/17 HTML / CSS
韩国休闲女装品牌网站:ANAIS
2016/08/24 全球购物
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
雷蛇美国官网:Razer
2020/04/03 全球购物
应届生体育教师自荐信
2013/10/03 职场文书
公司人力资源的自我评价
2014/01/02 职场文书
财务管理职业生涯规划书
2014/02/26 职场文书
公务员考察材料范文
2014/12/23 职场文书
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android