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 相关文章推荐
攻克CakePHP系列二 表单数据显示
Oct 22 PHP
php session安全问题分析
Jun 24 PHP
php编程实现获取excel文档内容的代码实例
Jun 28 PHP
深入解析php之apc
May 15 PHP
如何利用PHP执行.SQL文件
Jul 05 PHP
ThinkPHP使用心得分享-分页类Page的用法
May 15 PHP
如何批量清理系统临时文件(语言:C#、 C/C++、 php 、python 、java )
Feb 01 PHP
Yii2组件之多图上传插件FileInput的详细使用教程
Jun 20 PHP
php进程间通讯实例分析
Jul 11 PHP
PHP如何搭建百度Ueditor富文本编辑器
Sep 21 PHP
PHP获取远程http或ftp文件的md5值的方法
Apr 15 PHP
Thinkphp5.0 框架视图view的比较标签用法分析
Oct 12 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自动加载机制的深入分析
2013/06/08 PHP
php自定义中文字符串截取函数substr_for_gb2312及substr_for_utf8示例
2016/05/28 PHP
php mysql操作mysql_connect连接数据库实例详解
2016/12/26 PHP
全面解析PHP面向对象的三大特征
2017/06/10 PHP
如何在centos8自定义目录安装php7.3
2019/11/28 PHP
PhpSpreadsheet设置单元格常用操作汇总
2020/11/13 PHP
JavaScript中实现块作用域的方法
2010/04/01 Javascript
Date对象格式化函数代码
2010/07/17 Javascript
js Date概念详细介绍
2013/11/22 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
Egret引擎开发指南之创建项目
2014/09/03 Javascript
js中数组排序sort方法的原理分析
2014/11/20 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
微信小程序 列表的上拉加载和下拉刷新的实现
2017/04/01 Javascript
vue mounted组件的使用
2018/06/18 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
javascript canvas实现简易时钟例子
2020/09/05 Javascript
Python实现针对中文排序的方法
2017/05/09 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
Python 面试中 8 个必考问题
2018/11/16 Python
python分数表示方式和写法
2019/06/26 Python
python GUI库图形界面开发之PyQt5结合Qt Designer创建信号与槽的详细方法与实例
2020/03/08 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
详解CSS3新增的背景属性
2019/12/25 HTML / CSS
HTML5 video标签(播放器)学习笔记(二):播放控制
2015/04/24 HTML / CSS
美国家居装饰购物网站:Amanda Lindroth
2020/03/25 全球购物
九年级物理教学反思
2014/01/29 职场文书
师德模范事迹材料
2014/06/03 职场文书
离婚协议书该怎么写
2014/10/04 职场文书
师德师风事迹材料
2014/12/20 职场文书
晚会闭幕词
2015/01/28 职场文书
歼十出击观后感
2015/06/11 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python
Python基于百度AI实现抓取表情包
2021/06/27 Python