PHP后期静态绑定实例浅析


Posted in PHP onDecember 21, 2018

本文实例讲述了PHP后期静态绑定。分享给大家供大家参考,具体如下:

从php5.3开始,php增加了一个叫后期绑定的功能,用于在继承范围内引用静态调用的类

该功能从语言内部角度考虑北命名为“后期静态绑定”;“后期绑定”意思说:static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的,也可以成为“静态绑定”;因为他可以用于(但不限于静态方法的调用)。

self::的限制

使用self::或者_class_对当前类的静态引用,取决于定义当前方法所在的类

例子:

class A {
  public static function who() {
    echo __CLASS__;
  }
  public static function test() {
    self::who();
  }
}
class B extends A {
  public static function who() {
    echo __CLASS__;
  }
}
B::test(); //A

打印结果:

A

后期静态绑定的用法

后期静态绑定试图通过引入一个关键字表示运行时最初调用的类来绕过限制。简单的说,这个关键字能够让你在上述中调用test()时引用的类是B而不是A。最终决定不引用新的关键字,而是使用已经预留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

后期静态绑定的处理方式解决了以往完全没有解决的静态调用,另外一方面,如果静态调用使用parent::或者self::将转发调用信息

<?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
class a {
 static public function test() {
  print get_called_class();
 }
}
class b extends a {
}
a::test();
b::test();
?>

打印结果:

a
b

特别声明:

get_called_class();获得类的名称静态方法中调用

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
网页游戏开发入门教程二(游戏模式+系统)
Nov 02 PHP
SESSION信息保存在哪个文件目录下以及能够用来保存什么类型的数据
Jun 17 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
php操作xml入门之xml标签的属性分析
Jan 23 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
php实现给一张图片加上水印效果
Jan 02 PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 PHP
zend框架实现支持sql server的操作方法
Dec 08 PHP
PHP 文件上传后端处理实用技巧方法
Jan 06 PHP
thinkphp5实现无限级分类
Feb 18 PHP
ThinkPHP类似AOP思想的参数验证的实现方法
Dec 18 PHP
PHP后期静态绑定之self::限制实例分析
Dec 21 #PHP
PHP类与对象后期静态绑定操作实例详解
Dec 20 #PHP
PHP设计模式之模板方法模式实例浅析
Dec 20 #PHP
PHP设计模式之模板模式定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 #PHP
PHP面向对象程序设计之多态性的应用示例
Dec 19 #PHP
PHP自定义错误处理的方法分析
Dec 19 #PHP
You might like
PHP类的使用 实例代码讲解
2009/12/28 PHP
生成随机字符串和验证码的类的PHP实例
2013/12/24 PHP
深入浅析yii2-gii自定义模板的方法
2016/04/26 PHP
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
AJAX异步从优酷专辑中采集所有视频及信息(JavaScript代码)
2010/11/20 Javascript
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
js传参数受特殊字符影响错误的解决方法
2013/10/21 Javascript
css配合jquery美化 select
2013/11/29 Javascript
js获取下拉列表框中的value和text的值示例代码
2014/01/11 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
Bootstrap教程JS插件弹出框学习笔记分享
2016/05/17 Javascript
jQuery unbind 删除绑定事件详解
2016/05/24 Javascript
vue-cli的webpack模板项目配置文件分析
2017/04/01 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
原生js轮播特效
2017/05/18 Javascript
对vux点击事件的优化详解
2018/08/28 Javascript
vue自定义指令用法经典实例小结
2019/03/16 Javascript
微信小程序如何访问公众号文章
2019/07/08 Javascript
适用于 Vue 的播放器组件Vue-Video-Player操作
2020/11/16 Javascript
[04:48]DOTA2上海特锦赛小组赛第三日 TOP10精彩集锦
2016/02/28 DOTA
[02:05:03]完美世界DOTA2联赛循环赛 LBZS VS Matador BO2 10.28
2020/10/28 DOTA
使用Pyrex来扩展和加速Python程序的教程
2015/04/13 Python
Python基于opencv实现的简单画板功能示例
2019/03/04 Python
基于python实现地址和经纬度转换
2020/05/19 Python
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
Casetify官网:自制专属手机壳、iPad护壳和Apple Watch手表带
2018/05/09 全球购物
华三通信H3C面试题
2015/05/15 面试题
安全生产检讨书
2014/01/21 职场文书
2014最新房贷收入证明范本
2014/09/12 职场文书
先进典型事迹材料
2014/12/29 职场文书
2015年五一劳动节慰问信
2015/03/23 职场文书
单身证明范本
2015/06/15 职场文书
特种设备安全管理制度
2015/08/06 职场文书