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
一个简单的域名注册情况查询程序
Oct 09 PHP
开源php中文分词系统SCWS安装和使用实例
Apr 11 PHP
ThinkPHP3.1新特性之字段合法性检测详解
Jun 19 PHP
PHP return语句另类用法不止是在函数中
Sep 17 PHP
通过php修改xml文档内容的方法
Jan 23 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
php实现的三个常用加密解密功能函数示例
Nov 06 PHP
PHP封装的page分页类定义与用法完整示例
Dec 24 PHP
PHP PDOStatement::debugDumpParams讲解
Jan 30 PHP
laravel5表单唯一验证的实例代码
Sep 30 PHP
Thinkphp 在api开发中异常返回依然是html的解决方式
Oct 16 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静态成员变量和非静态成员变量详解
2017/02/14 PHP
ecshop添加菜单及权限分配问题
2017/11/21 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
通过event对象的fromElement属性解决热区设置主实体的一个bug
2008/12/22 Javascript
在html页面上拖放移动标签
2010/01/08 Javascript
基于jQuery的获得各种控件Value的方法
2010/11/19 Javascript
基于jQuery的烟花效果(运动相关)点击屏幕出烟花
2012/06/14 Javascript
捕获键盘事件(且兼容各浏览器)
2013/07/03 Javascript
js实现弹窗插件功能实例代码分享
2013/12/12 Javascript
javascript中mouseover、mouseout使用详解
2015/07/19 Javascript
原生JS实现拖拽图片效果
2020/08/27 Javascript
JavaScript SHA1加密算法实现详细代码
2016/10/06 Javascript
Angular之指令Directive用法详解
2017/03/01 Javascript
LayUi中接口传数据成功,表格不显示数据的解决方法
2018/08/19 Javascript
解决vue2.0路由跳转未匹配相应用路由避免出现空白页面的问题
2018/08/24 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
jQuery实现查看图片功能
2020/12/01 jQuery
Django中login_required装饰器的深入介绍
2017/11/24 Python
Python3 queue队列模块详细介绍
2018/01/05 Python
Python实现简易过滤删除数字的方法小结
2019/01/09 Python
python twilio模块实现发送手机短信功能
2019/08/02 Python
python PIL和CV对 图片的读取,显示,裁剪,保存实现方法
2019/08/07 Python
使用Python函数进行模块化的实现
2019/11/15 Python
解决jupyter notebook 前面书写后面内容消失的问题
2020/04/13 Python
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
2014年两会学习心得体会
2014/03/17 职场文书
党支部公开承诺书
2014/03/28 职场文书
增员口号大全
2014/06/18 职场文书
个人整改措施书面材料
2014/10/24 职场文书
优秀班组申报材料
2014/12/25 职场文书
谢师宴答谢词
2015/01/05 职场文书
文艺委员竞选稿
2015/11/19 职场文书
2019年让高校“心动”的自荐信
2019/03/25 职场文书
Vue图片裁剪组件实例代码
2021/07/02 Vue.js
Python 文字识别
2022/05/11 Python