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 相关文章推荐
php 中include()与require()的对比
Oct 09 PHP
isset和empty的区别
Jan 15 PHP
php 保留小数点
Apr 21 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
destoon实现资讯信息前面调用它所属分类的方法
Jul 15 PHP
使用array_map简单搞定PHP删除文件、删除目录
Oct 29 PHP
php函数实现判断是否移动端访问
Mar 03 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 PHP
浅谈PHP Cookie处理函数
Jun 10 PHP
php 指定范围内多个随机数代码实例
Jul 18 PHP
php获取数据库中数据的实现方法
Jun 01 PHP
YII框架学习笔记之命名空间、操作响应与视图操作示例
Apr 30 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迭代器的内部执行过程详解
2013/11/12 PHP
php命名空间学习详解
2014/02/27 PHP
php模拟post提交数据的方法
2015/02/12 PHP
PHP session 会话处理函数
2016/06/06 PHP
PHP的消息通信机制测试实例
2016/11/10 PHP
分享十五个最佳jQuery 幻灯插件和教程
2010/03/27 Javascript
javascript循环变量注册dom事件 之强大的闭包
2010/09/08 Javascript
让textarea自动调整大小的js代码
2011/04/12 Javascript
angularjs客户端实现压缩图片文件并上传实例
2015/07/06 Javascript
Vue.js中数组变动的检测详解
2016/10/12 Javascript
bootstrap modal弹出框的垂直居中
2016/12/14 Javascript
JavaScript函数参数的传递方式详解
2017/03/06 Javascript
js/jq仿window文件夹框选操作插件
2017/03/08 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
tween.js缓动补间动画算法示例
2018/02/13 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
2018/03/01 Javascript
对mac下nodejs 更新到最新版本的最新方法(推荐)
2018/05/17 NodeJs
详解如何用typescript开发koa2的二三事
2018/11/13 Javascript
微信小程序使用二次贝塞尔曲线画波浪
2018/12/25 Javascript
详解JS判断页面是在手机端还是在PC端打开的方法
2019/04/26 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
17道题让你彻底理解JS中的类型转换
2019/08/08 Javascript
使用Python实现博客上进行自动翻页
2017/08/23 Python
完美解决Pycharm无法导入包的问题 Unresolved reference
2018/05/18 Python
不管你的Python报什么错,用这个模块就能正常运行
2018/09/14 Python
Python函数和模块的使用总结
2019/05/20 Python
python集合常见运算案例解析
2019/10/17 Python
Python生成器常见问题及解决方案
2020/03/21 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
PHP笔试题
2012/02/22 面试题
材料化学专业求职信
2014/07/15 职场文书
2014年世界艾滋病日宣传活动总结
2014/11/18 职场文书
建国大业观后感600字
2015/06/01 职场文书
如何在Python中创建二叉树
2021/03/30 Python
分析ZooKeeper分布式锁的实现
2021/06/30 Java/Android