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利用iframe实现无刷新文件上传功能的代码
Sep 29 PHP
PHP中如何判断AJAX提交的数据
Feb 05 PHP
PHP sprintf() 函数的应用(定义和用法)
Jun 29 PHP
百度地图API应用之获取用户的具体位置
Jun 10 PHP
ThinkPHP文件上传实例教程
Aug 22 PHP
检测codeigniter脚本消耗内存情况的方法
Mar 21 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
Aug 25 PHP
php代码架构的八点注意事项
Jan 25 PHP
yii2实现根据时间搜索的方法
May 25 PHP
PHP session会话操作技巧小结
Sep 27 PHP
PHP让网站移动访问更加友好方法
Feb 14 PHP
PHP中多字节字符串操作实例详解
Aug 23 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/07/08 PHP
30个php操作redis常用方法代码例子
2014/07/05 PHP
PHP实现简单汉字验证码
2015/07/28 PHP
laravel 5.4 + vue + vux + element的环境搭配过程介绍
2018/04/26 PHP
统计PHP目录中的文件数方法
2019/03/05 PHP
初识javascript 文档碎片
2010/07/13 Javascript
Javascript面象对象成员、共享成员变量实验
2010/11/19 Javascript
Jquery写一个鼠标拖动效果实现原理与代码
2012/12/24 Javascript
For循环中分号隔开的3部分的执行顺序探讨
2014/05/27 Javascript
Node.js实现简单聊天服务器
2014/06/20 Javascript
javascript使用window.open提示“已经计划系统关机”的原因
2014/08/15 Javascript
javascript常用函数(2)
2015/11/05 Javascript
基于JavaScript实现数码时钟效果
2020/03/30 Javascript
vue-quill-editor实现图片上传功能
2017/08/08 Javascript
使用pkg打包Node.js应用的方法步骤
2018/10/19 Javascript
layui下拉框获取下拉值(select)的例子
2019/09/10 Javascript
Element InputNumber 计数器的实现示例
2020/08/03 Javascript
jQuery实现二级导航菜单的示例
2020/09/30 jQuery
[01:05:24]Ti4 冒泡赛第二天 iG vs NEWBEE 3
2014/07/15 DOTA
Python实现的石头剪子布代码分享
2014/08/22 Python
图解Python变量与赋值
2018/04/03 Python
pyqt5 tablewidget 利用线程动态刷新数据的方法
2019/06/17 Python
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
python实现将中文日期转换为数字日期
2020/07/14 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
python字典通过值反查键的实现(简洁写法)
2020/09/30 Python
matplotlib绘制正余弦曲线图的实现
2021/02/22 Python
HTML5中indexedDB 数据库的使用实例
2017/05/11 HTML / CSS
德国最大的设计师鞋网上商店:Budapester
2017/12/07 全球购物
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
开展批评与自我批评心得体会
2014/10/17 职场文书
简单的个人租房协议书范本
2014/11/26 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
英语辞职信范文
2015/02/28 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Pygame游戏开发之太空射击实战敌人精灵篇
2022/08/05 Python