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 ob_start()控制浏览器cache、生成html实现代码
Feb 16 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
Oct 22 PHP
Php无限级栏目分类读取的实现代码
Feb 19 PHP
PHP CURL获取返回值的方法
May 04 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
Sep 10 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
php自定义函数实现二维数组按指定key排序的方法
Sep 29 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
Yii2使用$this-&gt;context获取当前的Module、Controller(控制器)、Action等
Mar 29 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
Jun 13 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
Laravel向公共模板赋值方法总结
Jun 25 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设计模式 State (状态模式)
2011/06/26 PHP
php随机生成数字字母组合的方法
2015/03/18 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
PHP结合Redis+MySQL实现冷热数据交换应用案例详解
2019/07/09 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
用javascript做拖动布局的思路
2008/05/31 Javascript
js获取php变量的实现代码
2013/08/10 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
javascript事件冒泡详解和捕获、阻止方法
2014/04/12 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
JS实现的在线调色板实例(附demo源码下载)
2016/03/01 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
微信小程序 出现错误:{&quot;baseresponse&quot;:{&quot;errcode&quot;:-80002,&quot;errmsg&quot;:&quot;&quot;}}解决办法
2017/02/23 Javascript
jQuery表单验证之密码确认
2017/05/22 jQuery
vue 2.0封装model组件的方法
2017/08/03 Javascript
在vue项目中使用sass的配置方法
2018/03/20 Javascript
vuejs 动态添加input框的实例讲解
2018/08/24 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
Vue+Node实现商品列表的分页、排序、筛选,添加购物车功能详解
2019/12/07 Javascript
[01:38]完美世界高校联赛决赛花絮
2018/12/02 DOTA
Python实现字典的遍历与排序功能示例
2017/12/23 Python
详解Django+uwsgi+Nginx上线最佳实战
2019/03/14 Python
python实现比对美团接口返回数据和本地mongo数据是否一致示例
2019/08/09 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Python使用socket_TCP实现小文件下载功能
2020/10/09 Python
俄罗斯珠宝市场的领导者之一:Бронницкий ювелир
2019/10/02 全球购物
平面设计师工作职责范文
2013/12/03 职场文书
党支部书记先进事迹
2014/01/17 职场文书
桥梁工程专业求职信
2014/04/21 职场文书
公司门卫工作职责
2014/06/28 职场文书
政风行风评议整改方案
2014/09/15 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
几款流行的HTML5 UI框架比较(小结)
2021/04/08 HTML / CSS
为了顺利买到演唱会的票用Python制作了自动抢票的脚本
2021/10/16 Python
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫