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 相关文章推荐
实现“上一页”和“下一页按钮
Oct 09 PHP
php 接口类与抽象类的实际作用
Nov 26 PHP
PHP屏蔽蜘蛛访问代码及常用搜索引擎的HTTP_USER_AGENT
Mar 06 PHP
php简单浏览目录内容的实现代码
Jun 07 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
PHP使用array_fill定义多维数组的方法
Mar 18 PHP
PHP使用反射机制实现查找类和方法的所在位置
Apr 22 PHP
Ecshop 后台添加新功能栏目及管理权限设置教程
Nov 21 PHP
浅析PHP开发规范
Feb 05 PHP
PHP count_chars()函数讲解
Feb 14 PHP
启用OPCache提高PHP程序性能的方法
Mar 21 PHP
php获取是星期几的的一些常用姿势
Dec 15 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实现按天数、星期、月份查询的搜索框
2016/05/02 PHP
Smarty实现页面静态化(生成HTML)的方法
2016/05/23 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
Javascript学习笔记之 对象篇(一) : 对象的使用和属性
2014/06/24 Javascript
javascript 10进制和62进制的相互转换
2014/07/31 Javascript
js实现浮动在网页右侧的简洁QQ在线客服代码
2015/09/04 Javascript
基于jQuery实现复选框是否选中进行答题提示
2015/12/10 Javascript
关于动态执行代码(js的Eval)实例详解
2016/08/15 Javascript
AngularJS中$apply方法和$watch方法用法总结
2016/12/13 Javascript
浅析BootStrap中Modal(模态框)使用心得
2016/12/24 Javascript
Bootstrap输入框组件使用详解
2017/06/09 Javascript
微信小程序实现星级评分和展示
2018/07/05 Javascript
函数式编程入门实践(一)
2019/04/20 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
Vue 数据绑定的原理分析
2020/11/16 Javascript
[55:18]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
深入理解Python中装饰器的用法
2016/06/28 Python
Python中字符串的常见操作技巧总结
2016/07/28 Python
Python随机数random模块使用指南
2016/09/09 Python
Python Pandas对缺失值的处理方法
2019/09/27 Python
新版Pycharm中Matplotlib不会弹出独立的显示窗口的问题
2020/06/02 Python
Numpy中np.random.rand()和np.random.randn() 用法和区别详解
2020/10/23 Python
CSS实现定位元素居中的方法
2015/06/23 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
环保专业大学生职业规划设计
2014/01/10 职场文书
三问三解心得体会
2014/09/05 职场文书
党的群众路线教育实践活动对照检查材料(教师)
2014/09/24 职场文书
2014年作风建设心得体会
2014/10/22 职场文书
2015年工商所工作总结
2015/05/21 职场文书
庆祝教师节主持词
2015/07/06 职场文书
教师节简报
2015/07/20 职场文书