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 相关文章推荐
如何限制访问者的ip(PHPBB的代码)
Oct 09 PHP
PHP 数据结构 算法描述 冒泡排序 bubble sort
Jul 10 PHP
关于PHP内存溢出问题的解决方法
Jun 25 PHP
Yii扩展组件编写方法实例分析
Jun 29 PHP
Thinkphp无限级分类代码
Nov 11 PHP
深入浅析php json 格式控制
Dec 24 PHP
php基于PDO连接MSSQL示例DEMO
Jul 13 PHP
PHP实现电商订单自动确认收货redis队列
May 17 PHP
PHP实现链表的定义与反转功能示例
Jun 09 PHP
thinkphp5+layui实现的分页样式示例
Oct 08 PHP
yii框架结合charjs实现统计30天数据的方法
Apr 04 PHP
PHP 数组操作详解【遍历、指针、函数等】
May 13 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中禁止单个IP与ip段访问的代码小结
2012/07/04 PHP
从零开始学YII2框架(二)通过 Composer 安装扩展插件
2014/08/20 PHP
PHP也能干大事之PHP中的编码解码详解
2015/04/20 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
PHP环境搭建的详细步骤
2016/06/30 PHP
Yii2单元测试用法示例
2016/11/12 PHP
php使用curl_init()和curl_multi_init()多线程的速度比较详解
2018/08/15 PHP
php实现的rc4加密解密类定义与用法示例
2018/08/16 PHP
PHP+Mysql分布式事务与解决方案深入理解
2021/02/27 PHP
css图片自适应大小
2007/11/28 Javascript
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
JavaScript中OnLoad几种使用方法
2012/12/15 Javascript
JavaScript自定义数组排序方法
2015/02/12 Javascript
JavaScript实现函数返回多个值的方法
2015/06/09 Javascript
JavaScript实现下拉列表框数据增加、删除、上下排序的方法
2015/08/11 Javascript
SpringMVC restful 注解之@RequestBody进行json与object转换
2015/12/10 Javascript
借助FileReader实现将文件编码为Base64后通过AJAX上传
2015/12/24 Javascript
深入浅析Bootstrap列表组组件
2016/05/03 Javascript
JavaScript地理位置信息API
2016/06/11 Javascript
使用伪命名空间封装保护独自创建的对象方法
2016/08/04 Javascript
js编写三级联动简单案例
2016/12/21 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
微信小程序中如何计算距离某个节日还有多少天
2019/07/15 Javascript
vue获取form表单的值示例
2019/10/29 Javascript
jQuery单页面文字搜索插件jquery.fullsearch.js的使用方法
2020/02/04 jQuery
微信小程序的引导页实现代码
2020/06/24 Javascript
Python基础教程之正则表达式基本语法以及re模块
2016/03/25 Python
python 计算两个日期相差多少个月实例代码
2017/05/24 Python
Python使用Selenium爬取淘宝异步加载的数据方法
2018/12/17 Python
详解如何减少python内存的消耗
2019/08/09 Python
Python数据库小程序源代码
2019/09/15 Python
关于windows下Tensorflow和pytorch安装教程
2020/02/04 Python
Django模型中字段属性choice使用说明
2020/03/30 Python
SportsDirect.com新加坡:英国第一体育零售商
2019/03/30 全球购物
工地宣传标语
2014/06/18 职场文书
浅谈TypeScript 索引签名的理解
2021/10/16 Javascript