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 相关文章推荐
PHP使用者状态管理功能的应用
Oct 09 PHP
Mysql中limit的用法方法详解与注意事项
Apr 19 PHP
PHP自动识别字符集并完成转码详解
Aug 02 PHP
PHP连接MySQL的2种方法小结以及防止乱码
Mar 11 PHP
php代码审计比较有意思的例子
May 07 PHP
PHP文件锁定写入实例解析
Jul 14 PHP
PHP中的类型提示(type hinting)功能介绍
Jul 01 PHP
PHP使用GD库输出汉字的方法【测试可用】
Nov 10 PHP
PHP单例模式简单用法示例
Jun 23 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
Dec 21 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
laravel model 两表联查示例
Oct 24 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
关于url地址传参数时字符串有回车造成页面脚本赋值失败的解决方法
2013/06/28 PHP
thinkPHP订单数字提醒功能的实现方法
2016/12/01 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
jQuery EasyUI API 中文文档 - Tree树使用介绍
2011/11/19 Javascript
用正则表达式替换图片地址img标签
2013/11/22 Javascript
jQuery 动态云标签插件
2014/11/11 Javascript
JavaScript基础语法、dom操作树及document对象
2014/12/02 Javascript
微信浏览器内置JavaScript对象WeixinJSBridge使用实例
2015/05/25 Javascript
JS判断当前页面是否在微信浏览器打开的方法
2015/12/08 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
AngularJs ng-repeat 嵌套如何获取外层$index
2016/09/21 Javascript
Easyui使用Dialog行内按钮布局的实例
2017/07/27 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
微信小程序组件之srcoll-view的详解
2017/10/19 Javascript
js+css实现红包雨效果
2018/07/12 Javascript
解决layer弹出层自适应页面大小的问题
2019/09/16 Javascript
详解vue或uni-app的跨域问题解决方案
2020/02/21 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
使用Python测试Ping主机IP和某端口是否开放的实例
2019/12/17 Python
Python+appium框架原生代码实现App自动化测试详解
2020/03/06 Python
Python基于template实现字符串替换
2020/11/27 Python
完美解决Pycharm中matplotlib画图中文乱码问题
2021/01/11 Python
Python操作Excel的学习笔记
2021/02/18 Python
CSS3弹性盒模型flex box快速入门心得(必看篇)
2016/05/24 HTML / CSS
美国第二大团购网站:LivingSocial
2016/07/24 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
澳大利亚买卖正宗二手奢侈品交易平台:Luxe.It.Fwd
2019/10/16 全球购物
空字符串(“”)和null的区别
2012/11/13 面试题
函授药学自我鉴定
2014/02/07 职场文书
小学教学随笔感言
2014/02/26 职场文书
普通党员对照检查材料
2014/08/28 职场文书
大学生年度个人总结
2015/02/15 职场文书
2016年社区文体活动总结
2016/04/06 职场文书
Java Lambda表达式常用的函数式接口
2022/04/07 Java/Android