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 相关文章推荐
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
php DOS攻击实现代码(附如何防范)
May 29 PHP
IIS+fastcgi下PHP运行超时问题的解决办法详解
Jun 20 PHP
Yii Framework框架获取分类下面的所有子类方法
Jun 20 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
PHP实现阳历到农历转换的类实例
Mar 07 PHP
php筛选不存在的图片资源
Apr 28 PHP
PHP使用缓存即时输出内容(output buffering)的方法
Aug 03 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
完美解决phpdoc导出文档中@package的warning及Error的错误
May 17 PHP
PHP后台微信支付和支付宝支付开发
Apr 28 PHP
php实现支持中文的文件下载功能示例
Aug 30 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
我的论坛源代码(三)
2006/10/09 PHP
php echo()和print()、require()和include()函数区别说明
2010/03/27 PHP
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
教大家制作简单的php日历
2015/11/17 PHP
提交表单后 PHP获取提交内容的实现方法
2016/05/25 PHP
javascript 数组的方法集合
2008/06/05 Javascript
javascript写的简单的计算器,内容很多,方法实用,推荐
2011/12/29 Javascript
ExtJs设置GridPanel表格文本垂直居中示例
2013/07/15 Javascript
JS高级调试技巧:捕获和分析 JavaScript Error详解
2014/03/16 Javascript
浅析node.js中close事件
2014/11/26 Javascript
js实现非常简单的焦点图切换特效实例
2015/05/07 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
javascript 广告移动特效的实现代码
2016/06/25 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
Vue-Router模式和钩子的用法
2018/02/28 Javascript
通过vue提供的keep-alive减少对服务器的请求次数
2018/04/01 Javascript
React组件重构之嵌套+继承及高阶组件详解
2018/07/19 Javascript
nodejs中request库使用HTTPS代理的方法
2019/04/30 NodeJs
JavaScript实现筛选数组
2021/03/02 Javascript
详解微信小程序(Taro)手动埋点和自动埋点的实现
2021/03/02 Javascript
python实现的解析crontab配置文件代码
2014/06/30 Python
Python中模块与包有相同名字的处理方法
2017/05/05 Python
详解分布式任务队列Celery使用说明
2018/11/29 Python
python访问hdfs的操作
2020/06/06 Python
selenium判断元素是否存在的两种方法小结
2020/12/07 Python
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
我们的节日元宵节活动总结
2015/02/06 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
初中数学课堂教学反思
2016/02/17 职场文书
golang 接口嵌套实现复用的操作
2021/04/29 Golang
MySQL索引失效的典型案例
2021/06/05 MySQL
MySQL中几种插入和批量语句实例详解
2021/09/14 MySQL