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 相关文章推荐
cmd下运行php脚本
Nov 25 PHP
pdo中使用参数化查询sql
Aug 11 PHP
PHP中3种生成XML文件方法的速度效率比较
Oct 06 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
详解PHP防止盗链防止迅雷下载的方法
Apr 26 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
ThinkPHP3.1.x修改成功与失败跳转页面的方法
Sep 29 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
Feb 08 PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 PHP
基于Laravel-admin 后台的自定义页面用法详解
Sep 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
php实例分享之二维数组排序
2014/05/15 PHP
C# WinForm中实现快捷键自定义设置实例
2015/01/23 PHP
ubuntu下配置nginx+php+mysql详解
2015/09/10 PHP
Zend Framework分发器用法示例
2016/12/11 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
javascript:void(0)使用探讨
2013/08/27 Javascript
Javascript Web Slider 焦点图示例源码
2013/10/10 Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
2013/11/11 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
js 点击页面其他地方关闭弹出层(示例代码)
2013/12/24 Javascript
JS控制图片等比例缩放的示例代码
2013/12/24 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
javascript实现在下拉列表中显示多级树形菜单的方法
2015/08/12 Javascript
jquery中实现时间戳与日期相互转换
2016/04/12 Javascript
bootstrap输入框组使用方法
2017/02/07 Javascript
jQuery表格(Table)基本操作实例分析
2017/03/10 Javascript
利用jquery去掉时光轴头尾部线条的方法实例
2017/06/16 jQuery
vue实现城市列表选择功能
2018/07/16 Javascript
解决vue中使用proxy配置不同端口和ip接口问题
2019/08/14 Javascript
Vue Router中应用中间件的方法
2020/08/06 Javascript
Python数据分析之真实IP请求Pandas详解
2016/11/18 Python
python3判断url链接是否为404的方法
2018/08/10 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python实现WebSocket服务端过程解析
2019/10/18 Python
python如何控制进程或者线程的个数
2020/10/16 Python
cookies应对python反爬虫知识点详解
2020/11/25 Python
Django自带的用户验证系统实现
2020/12/18 Python
几道Web/Ajax的面试题
2016/11/05 面试题
铣床操作工岗位职责
2014/06/13 职场文书
北京奥运会口号
2014/06/21 职场文书
2014国庆节标语口号
2014/09/19 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
pytorch训练神经网络爆内存的解决方案
2021/05/22 Python
nginx负载功能+nfs服务器功能解析
2022/02/28 Servers
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸
SQL语句中EXISTS的详细用法大全
2022/06/25 MySQL