PHP延迟静态绑定使用方法实例解析


Posted in PHP onSeptember 05, 2020

PHP的继承模型中有一个存在已久的问题,那就是在父类中引用扩展类的最终状态比较困难。我们来看一下代码清单5-11中的例子。

代码清单5-11 意想不到的继承

<?php
 class ParentBase {
  static $property = 'Parent Value';
  public static function render() {
   return self::$property;
  }
 }
 class Descendant extends ParentBase {
  static $property = 'Descendant Value';
 }
 echo Descendant::render();
 Parent Value

在这个例子中,render()方法中使用了self关键字,这是指ParentBase类而不是指Descendant类。在ParentBase::render()方法中没法访问$property的最终值。为了解决这个问题,需要在子类中重写render()方法。

通过引入延迟静态绑定功能,可以使用static作用域关键字访问类的属性或者方法的最终值,如代码所示。

<?php
 class ParentBase {
  static $property = 'Parent Value';
  public static function render() {
   return static::$property;
  }
} 
 class Descendant extends ParentBase {
  static $property = 'Descendant Value';
 }
 echo Descendant::render();
 Descendant Value

通过使用静态作用域,可以强制PHP在最终的类中查找所有属性的值。除了这个延迟绑定行为,PHP还添加了get_called_class()函数,这允许检查继承的方法是从哪个派生类调用的。以下代码显示了使用get_called_class()函数获得当前的类调用场景的方法。

使用get_called_class()方法

<?php
 class ParentBase {
  public static function render() {
   return get_called_class();
  }
 }
 class Decendant extends ParentBase {}
 echo Descendant::render(); 
 Descendant

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
Jul 01 PHP
php设计模式 Strategy(策略模式)
Jun 26 PHP
mysql总结之explain
Feb 27 PHP
探讨:web上存漏洞及原理分析、防范方法
Jun 29 PHP
PHP使用Session遇到的一个Permission denied Notice解决办法
Jul 30 PHP
destoon实现VIP排名一直在前面排序的方法
Aug 21 PHP
PHP实现截取中文字符串不出现?号的解决方法
Dec 29 PHP
php实现数据库的增删改查
Feb 26 PHP
php 截取GBK文档某个位置开始的n个字符方法
Mar 08 PHP
总结的一些PHP开发中的tips(必看篇)
Mar 24 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 PHP
php写app用的框架整理
Sep 29 PHP
PHP autoload使用方法及步骤详解
Sep 05 #PHP
PHP数组访问常用方法解析
Sep 05 #PHP
XAMPP升级PHP版本实现步骤解析
Sep 04 #PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 #PHP
Laravel Reponse响应客户端示例详解
Sep 03 #PHP
PHP 实现base64编码文件上传出现问题详解
Sep 01 #PHP
PHP copy函数使用案例代码解析
Sep 01 #PHP
You might like
THINKPHP在添加数据的时候获取主键id的值方法
2017/04/03 PHP
Yii框架布局文件的动态切换操作示例
2019/11/11 PHP
PHP实现单例模式建立数据库连接的方法分析
2020/02/11 PHP
一端时间轮换的广告
2006/06/26 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
javascript面向对象之二 命名空间
2011/02/08 Javascript
JQuery 自定义CircleAnimation,Animate方法学习笔记
2011/07/10 Javascript
xml转json的js代码
2012/08/28 Javascript
JSP跨iframe如何传递参数实现代码
2013/09/21 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
我的NodeJs学习小结(一)
2014/07/06 NodeJs
快速学习AngularJs HTTP响应拦截器
2015/12/31 Javascript
jquery 全选、全不选、反选效果的实现代码【推荐】
2016/05/05 Javascript
简单的分页代码js实现
2016/05/17 Javascript
一道面试题引发的对javascript类型转换的思考
2017/03/06 Javascript
node+vue实现用户注册和头像上传的实例代码
2017/07/20 Javascript
vue代理和跨域问题的解决
2018/07/18 Javascript
Vue指令v-for遍历输出JavaScript数组及json对象的常见方式小结
2019/02/11 Javascript
[01:09]DOTAPLUS——DOTA2的新时代
2018/04/04 DOTA
[48:51]完美世界DOTA2联赛PWL S2 Magma vs InkIce 第一场 11.28
2020/12/02 DOTA
Python使用plotly绘制数据图表的方法
2017/07/18 Python
python模块之time模块(实例讲解)
2017/09/13 Python
python如何实现内容写在图片上
2018/03/23 Python
TensorFlow实现非线性支持向量机的实现方法
2018/04/28 Python
使用django的ORM框架按月统计近一年内的数据方法
2019/07/18 Python
常用的四种CSS透明属性介绍
2014/04/12 HTML / CSS
实例讲解CSS3中Transform的perspective属性的用法
2016/04/22 HTML / CSS
HTML5离线应用与客户端存储的实现
2018/05/03 HTML / CSS
中专毕业生自荐信
2013/11/16 职场文书
给幼儿园老师的表扬信
2014/01/19 职场文书
财经学院自荐信范文
2014/02/02 职场文书
贷款委托书范本
2014/04/08 职场文书
民政局办理协议离婚(范本)
2014/10/25 职场文书
生产车间主任岗位职责
2015/04/08 职场文书
如何自己动手写SQL执行引擎
2021/06/02 MySQL
Vue + iView实现Excel上传功能的完整代码
2021/06/22 Vue.js