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 相关文章推荐
重新封装zend_soap实现http连接安全认证的php代码
Jan 12 PHP
超级实用的7个PHP代码片段分享
Jan 05 PHP
mysql,mysqli,PDO的各自不同介绍
Sep 19 PHP
php数组删除元素示例
Mar 21 PHP
PHP实现AES256加密算法实例
Sep 22 PHP
Drupal简体中文语言包安装教程
Sep 27 PHP
php输出金字塔的2种实现方法
Dec 16 PHP
PHP中使用curl入门教程
Jul 02 PHP
php array_merge_recursive 数组合并
Oct 26 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
Laravel5.1 框架控制器基础用法实例分析
Jan 04 PHP
PHP基于array_unique实现二维数组去重
Jul 14 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 MVC框架路由学习笔记
2016/03/02 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
laravel 5.1下php artisan migrate的使用注意事项总结
2017/06/07 PHP
ext combox 下拉框不出现自动提示,自动选中的解决方法
2010/02/24 Javascript
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
自定义一个jquery插件[鼠标悬浮时候 出现说明label]
2011/06/27 Javascript
基于Jquery的文字自动截取(提供源代码)
2011/08/09 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
jquery实现的一个简单进度条效果实例
2014/05/12 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
node.js中的require使用详解
2014/12/15 Javascript
AngularJS基础知识笔记之过滤器
2015/05/10 Javascript
JS实现浏览器状态栏文字从右向左弹出效果代码
2015/10/27 Javascript
jQuery实现简单隔行变色的方法
2016/02/20 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
Backbone.js框架中Model与Collection的使用实例
2016/05/07 Javascript
纯javaScript、jQuery实现个性化图片轮播【推荐】
2017/01/08 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
vue新建项目并配置标准路由过程解析
2019/12/09 Javascript
Vue实现剪贴板复制功能
2019/12/31 Javascript
React实现todolist功能
2020/12/28 Javascript
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
解决pycharm 远程调试 上传 helpers 卡住的问题
2019/06/27 Python
使用APScheduler3.0.1 实现定时任务的方法
2019/07/22 Python
基于Python数据分析之pandas统计分析
2020/03/03 Python
Python+Kepler.gl实现时间轮播地图过程解析
2020/07/20 Python
Python求区间正整数内所有素数之和的方法实例
2020/10/13 Python
深入浅析css3 中display box使用方法
2015/11/25 HTML / CSS
IdealFit官方网站:女性蛋白质、补充剂和运动服装
2019/03/24 全球购物
总经理司机职责
2014/02/02 职场文书
《小小竹排画中游》教学反思
2014/02/26 职场文书
财务务虚会发言材料
2014/10/20 职场文书
推广普通话主题班会
2015/08/17 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers