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 相关文章推荐
粗略计算在线时间,bug:ip相同
Dec 09 PHP
php快速url重写更新版[需php 5.30以上]
Apr 25 PHP
yii框架中的Url生产问题小结
Jan 16 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
Jan 23 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
Mac OS下配置PHP+MySql环境
Feb 25 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
Dec 07 PHP
在IIS下安装PHP扩展的方法(超简单)
Apr 10 PHP
PDO::query讲解
Jan 29 PHP
gearman中worker常驻后台,导致MySQL server has gone away的解决方法
Feb 27 PHP
thinkphp5.1 框架导入/导出excel文件操作示例
May 25 PHP
关于PHP求解三数之和问题详析
Nov 09 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的ob_start();控制您的浏览器cache!
2007/02/14 PHP
php递归json类实例
2014/12/02 PHP
php实现redis数据库指定库号迁移的方法
2015/01/14 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
php实现商城购物车的思路和源码分析
2020/07/23 PHP
JavaScript语法着色引擎(demo及打包文件下载)
2007/06/13 Javascript
解决jquery操作checkbox火狐下第二次无法勾选问题
2014/02/10 Javascript
JS实现禁止鼠标右键的功能
2016/10/15 Javascript
浅谈bootstrap使用中的一些问题以及解决过程
2016/10/18 Javascript
JavaScript获取服务器时间的方法详解
2016/12/11 Javascript
vue项目中使用百度地图的方法
2018/06/08 Javascript
Vue 实现列表动态添加和删除的两种方法小结
2018/09/07 Javascript
[04:40]2016国际邀请赛中国区预选赛全程TOP10镜头集锦
2016/07/01 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
python爬取m3u8连接的视频
2018/02/28 Python
python web基础之加载静态文件实例
2018/03/20 Python
对python实现模板生成脚本的方法详解
2019/01/30 Python
python lambda表达式在sort函数中的使用详解
2019/08/28 Python
python 初始化一个定长的数组实例
2019/12/02 Python
Django+RestFramework API接口及接口文档并返回json数据操作
2020/07/12 Python
Matplotlib 绘制饼图解决文字重叠的方法
2020/07/24 Python
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
智能电子应届生求职信
2013/11/10 职场文书
毕业生求职的求职信
2013/12/05 职场文书
酒吧创业计划书
2014/01/18 职场文书
幼儿园秋游感想
2014/03/12 职场文书
《冬阳童年骆驼队》教学反思
2014/04/15 职场文书
幼儿园小班评语
2014/04/18 职场文书
协议书的格式
2014/04/23 职场文书
俞敏洪北大演讲稿
2014/05/22 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
挂职个人工作总结
2015/03/05 职场文书
2015年度公共机构节能工作总结
2015/05/26 职场文书
ORACLE数据库应用开发的三十个注意事项
2021/06/07 Oracle
MySQL慢查询中的commit慢和binlog中慢事务的区别
2022/06/16 MySQL
小程序自定义轮播图圆点组件
2022/06/25 Javascript