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 相关文章推荐
基于文本的访客签到簿
Oct 09 PHP
php后台多用户权限组思路与实现程序代码分享
Feb 13 PHP
PHP在线生成二维码(google api)的实现代码详解
Jun 04 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
简单谈谈PHP中的include、include_once、require以及require_once语句
Apr 23 PHP
Yii2 输出xml格式数据的方法
May 03 PHP
PHP基于DOMDocument解析和生成xml的方法分析
Jul 17 PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 PHP
PHP自定义递归函数实现数组转JSON功能【支持GBK编码】
Jul 17 PHP
PHP钩子实现方法解析
May 21 PHP
基于Laravel-admin 后台的自定义页面用法详解
Sep 30 PHP
PHP xpath提取网页数据内容代码解析
Jul 16 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
关于php fread()使用技巧
2010/01/22 PHP
PHP5与MySQL数据库操作常用代码 收集
2010/03/21 PHP
处理单名多值表单的详解
2013/06/08 PHP
php创建sprite
2014/02/11 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
tp5.1 框架数据库-数据集操作实例分析
2020/05/26 PHP
jQuery实现类似淘宝购物车全选状态示例
2013/06/26 Javascript
超赞的jQuery图片滑块动画特效代码汇总
2016/01/25 Javascript
深入浅析JavaScript中with语句的理解
2016/05/12 Javascript
浅谈js script标签中的预解析
2016/12/30 Javascript
详解Angularjs在控制器(controller.js)中使用过滤器($filter)格式化日期/时间实例
2017/02/17 Javascript
原生javascript移动端滑动banner效果
2017/03/10 Javascript
javascript 中select框触发事件过程的分析
2017/08/01 Javascript
js实现动态改变radio状态的方法
2018/02/28 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
关于ckeditor在bootstrap中modal中弹框无法输入的解决方法
2019/09/11 Javascript
使用url_helper简化Python中Django框架的url配置教程
2015/05/30 Python
python 垃圾收集机制的实例详解
2017/08/20 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
使用Python快速搭建HTTP服务和文件共享服务的实例讲解
2018/06/04 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
2018/10/11 Python
用python实现刷点击率的示例代码
2019/02/21 Python
python 申请内存空间,用于创建多维数组的实例
2019/12/02 Python
在python3中实现更新界面
2020/02/21 Python
利用python中的matplotlib打印混淆矩阵实例
2020/06/16 Python
django rest framework使用django-filter用法
2020/07/15 Python
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
企业年会主持词
2014/03/27 职场文书
信用卡工资证明范本
2014/10/17 职场文书
场地使用证明模板
2014/10/25 职场文书
2015年房地产个人工作总结
2015/05/26 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
idea以任意顺序debug多线程程序的具体用法
2021/08/30 Java/Android
MySQL查询日期时间
2022/05/15 MySQL