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 相关文章推荐
防止用户利用PHP代码DOS造成用光网络带宽
Mar 01 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
PHP实现将科学计数法转换为原始数字字符串的方法
Dec 16 PHP
通过php添加xml文档内容的方法
Jan 23 PHP
PHP中使用register_shutdown_function函数截获fatal error示例
Apr 21 PHP
使用纯php代码实现页面伪静态的方法
Jul 25 PHP
Laravel 5.3 学习笔记之 安装
Aug 28 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
php基于curl重写file_get_contents函数实例
Nov 08 PHP
PHP缩略图生成和图片水印制作
Jan 07 PHP
php处理抢购类功能的高并发请求
Feb 08 PHP
php实现微信公众平台发红包功能
Jun 14 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中使用Curl、socket、file_get_contents三种方法POST提交数据
2011/08/12 PHP
php实现文件下载代码分享
2014/08/19 PHP
php通过正则表达式记取数据来读取xml的方法
2015/03/09 PHP
详解PHP序列化反序列化的方法
2015/10/27 PHP
php简单的上传类分享
2016/05/15 PHP
php中10个不同等级压缩优化图片操作示例
2016/11/14 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
JavaScript定时器详解及实例
2013/08/01 Javascript
js实现的点击div区域外隐藏div区域
2014/06/30 Javascript
JS对象创建的几种方式整理
2017/02/28 Javascript
vue事件修饰符和按键修饰符用法总结
2017/07/25 Javascript
jQuery菜单实例(全选,反选,取消)
2017/08/28 jQuery
纯js实现隔行变色效果
2017/11/29 Javascript
关于Angularjs中自定义指令一些有价值的细节和技巧小结
2018/04/22 Javascript
Angularjs之ngModel中的值验证绑定方法
2018/09/13 Javascript
jquery层次选择器的介绍
2019/01/18 jQuery
vue实现简单计算商品价格
2020/09/14 Javascript
[00:37]DOTA2上海特级锦标赛 OG战队宣传片
2016/03/03 DOTA
easy_install python包安装管理工具介绍
2013/02/10 Python
解读Python中degrees()方法的使用
2015/05/18 Python
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
Pycharm 设置自定义背景颜色的图文教程
2018/05/23 Python
python 读取摄像头数据并保存的实例
2018/08/03 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
cProfile Python性能分析工具使用详解
2019/07/22 Python
使用css3制作登录表单的步骤
2014/04/07 HTML / CSS
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
SKECHERS斯凯奇中国官网:来自美国的运动休闲品牌
2018/11/14 全球购物
六个一活动实施方案
2014/03/21 职场文书
《永远的白衣战士》教学反思
2014/04/25 职场文书
如何有效防止sql注入的方法
2021/05/25 SQL Server
python爬取网页版QQ空间,生成各类图表
2021/06/02 Python
python识别围棋定位棋盘位置
2021/07/26 Python
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
vue实现列表垂直无缝滚动
2022/04/08 Vue.js