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 相关文章推荐
使用adodb lite解决问题
Dec 31 PHP
用来解析.htpasswd文件的PHP类
Sep 05 PHP
解析PHP实现多进程并行执行脚本
Jun 18 PHP
ThinkPHP空模块和空操作详解
Jun 30 PHP
PHP实现把文本中的URL转换为链接的auolink()函数分享
Jul 29 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
php注册审核重点解析(数据访问)
May 23 PHP
PHP使用preg_split和explode分割textarea存放内容的方法分析
Jul 03 PHP
一个实用的php验证码类
Jul 06 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 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 杂谈《重构-改善既有代码的设计》之一 重新组织你的函数
2012/04/09 PHP
thinkPHP学习笔记之安装配置篇
2015/03/05 PHP
PHP基于GD库的图像处理方法小结
2016/09/27 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
PHP实现针对日期,月数,天数,周数,小时,分,秒等的加减运算示例【基于strtotime】
2017/04/19 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
2017/07/10 PHP
多个Laravel项目如何共用migrations详解
2018/09/25 PHP
GRID拖拽行的实例代码
2013/07/18 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
javascript中offset、client、scroll的属性总结
2015/08/13 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
javascript HTML5文件上传FileReader API
2020/03/27 Javascript
基于bootstrap插件实现autocomplete自动完成表单
2016/05/07 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
jQuery实现的页面详情展开收起功能示例
2018/06/11 jQuery
vue动态注册组件实例代码详解
2019/05/30 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
[08:47]DOTA2每周TOP10 精彩击杀集锦vol.6
2014/06/25 DOTA
简单介绍Python的轻便web框架Bottle
2015/04/08 Python
Python语言的面相对象编程方式初步学习
2016/03/12 Python
微信跳一跳辅助python代码实现
2018/01/05 Python
Python3实现的字典、列表和json对象互转功能示例
2018/05/22 Python
在Python中关于使用os模块遍历目录的实现方法
2019/01/03 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
keras的ImageDataGenerator和flow()的用法说明
2020/07/03 Python
HTML5触摸事件演化tap事件介绍
2016/03/25 HTML / CSS
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
公司外出活动方案
2014/08/14 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
党支部综合考察意见
2015/06/01 职场文书
捐款仪式主持词
2015/07/04 职场文书
房产销售员2015年终工作总结
2015/10/22 职场文书
Python中的 No Module named ***问题及解决
2022/07/23 Python