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 结果集的分页实现代码
Mar 10 PHP
PHP var_dump遍历对象属性的函数与应用代码
Jun 04 PHP
PHP 作用域解析运算符(::)
Jul 27 PHP
在WAMP环境下搭建ZendDebugger php调试工具的方法
Jul 18 PHP
Sorting Array Values in PHP(数组排序)
Sep 15 PHP
Php Ctemplate引擎开发相关内容
Mar 03 PHP
解析如何通过PHP函数获取当前运行的环境 来进行判断执行逻辑(小技巧)
Jun 25 PHP
php跨站攻击实例分析
Oct 28 PHP
php通过array_merge()函数合并两个数组的方法
Mar 18 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
Aug 14 PHP
mac pecl 安装php7.1扩展教程
Oct 17 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 getallheaders无法获取自定义头(headers)的问题
2016/03/23 PHP
JavaScript基本概念初级讲解论坛贴的学习记录
2009/02/22 Javascript
浏览器兼容console对象的简要解决方案分享
2013/10/24 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
jQuery内部原理和实现方式浅析
2015/02/03 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
2015/04/03 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
node.js插件nodeclipse安装图文教程
2020/10/19 Javascript
JS基于面向对象实现的拖拽功能示例
2016/12/20 Javascript
利用jQuery实现一个简单的表格上下翻页效果
2017/03/14 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
vue.js实例todoList项目
2017/07/07 Javascript
webpack 插件html-webpack-plugin的具体使用
2018/04/09 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
基于 jQuery 实现键盘事件监听控件
2019/04/04 jQuery
vue-cli3 配置开发与测试环境详解
2019/05/17 Javascript
微信小程序实现pdf、word等格式文件上传的方法
2019/09/10 Javascript
javascript简单实现深浅拷贝过程详解
2019/10/08 Javascript
VUE项目实现主题切换的多种方法
2020/11/26 Vue.js
[01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
python实现文件名批量替换和内容替换
2014/03/20 Python
Python爬取网页中的图片(搜狗图片)详解
2017/03/23 Python
python 调用有道api接口的方法
2019/01/03 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
Python自动重新加载模块详解(autoreload module)
2020/04/01 Python
使用npy转image图像并保存的实例
2020/07/01 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
美国五金商店:Ace Hardware
2018/03/27 全球购物
Guess荷兰官网:美国服饰品牌
2020/01/22 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
计算机应用与科学个人的自我评价
2013/11/15 职场文书
家居设计专业个人自荐信范文
2013/11/26 职场文书
广告业务员岗位职责
2015/02/13 职场文书
个人自荐书范文
2015/03/09 职场文书
活动费用申请报告
2015/05/15 职场文书
Python 如何解决稀疏矩阵运算
2021/05/26 Python