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 相关文章推荐
使用TinyButStrong模板引擎来做WEB开发
Mar 16 PHP
PHP n个不重复的随机数生成代码
Jun 23 PHP
PHP递归算法的详细示例分析
Feb 19 PHP
php中OR与|| AND与&amp;&amp;的区别总结
Oct 26 PHP
ThinkPHP3.1新特性之命名范围的使用
Jun 19 PHP
PHP自毁程序(慎用)
Jul 09 PHP
使用PHP如何实现高效安全的ftp服务器(二)
Dec 30 PHP
PHP的邮件群发系统phplist配置方法详细总结
Mar 30 PHP
PHP简单装饰器模式实现与用法示例
Jun 22 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 PHP
PHP APP微信提现接口代码
Sep 30 PHP
PHP观察者模式定义与用法实例分析
Mar 22 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
中国站长站 For Dede4.0 采集规则
2007/05/27 PHP
ThinkPHP路由详解
2015/07/27 PHP
Thinkphp事务操作实例(推荐)
2017/04/01 PHP
LNMP部署laravel以及xhprof安装使用教程
2017/09/14 PHP
【消息提示组件】,兼容IE6/7&amp;&amp;FF2
2007/09/04 Javascript
图片自动缩小 点击放大
2008/07/07 Javascript
实现超用户体验 table排序javascript实现代码
2009/06/22 Javascript
Javascript倒计时代码
2010/08/12 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
深入学习jQuery Validate表单验证(二)
2016/01/18 Javascript
jQuery多文件异步上传带进度条实例代码
2016/08/16 Javascript
详谈$.data()的用法和作用
2017/02/13 Javascript
js遍历json对象所有key及根据动态key获取值的方法(必看)
2017/03/09 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
Linux Centos7.2下安装nodejs&amp;npm配置全局路径的教程
2018/05/15 NodeJs
微信小程序swiper实现滑动放大缩小效果
2018/11/15 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
js+canvas实现两张图片合并成一张图片的方法
2019/11/01 Javascript
python使用自定义user-agent抓取网页的方法
2015/04/15 Python
Python 使用SMTP发送邮件的代码小结
2016/09/21 Python
Python实现批量检测HTTP服务的状态
2016/10/27 Python
python 获取字符串MD5值方法
2018/05/29 Python
Python实现两个list求交集,并集,差集的方法示例
2018/08/02 Python
用Python中的turtle模块画图两只小羊方法
2019/04/09 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
Python 200行代码实现一个滑动验证码过程详解
2019/07/11 Python
window环境pip切换国内源(pip安装异常缓慢的问题)
2019/12/31 Python
利用pyecharts读取csv并进行数据统计可视化的实现
2020/04/17 Python
python构造IP报文实例
2020/05/05 Python
Python爬虫JSON及JSONPath运行原理详解
2020/06/04 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
简单html5代码获取地理位置
2014/03/31 HTML / CSS
html5 移动端视频video的android兼容(去除播放控件、全屏)
2020/03/26 HTML / CSS
跑鞋、网球鞋、网球拍、服装及装备:Holabird Sports
2016/09/19 全球购物
超市开业庆典策划方案
2014/05/14 职场文书
工作年限证明模板
2014/11/01 职场文书