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 相关文章推荐
Windows下安装Memcached的步骤说明
Apr 25 PHP
Discuz Uchome ajaxpost小技巧
Jan 04 PHP
php学习之简单计算器实现代码
Jun 09 PHP
php学习之流程控制实现代码
Jun 09 PHP
解析Ubuntu下crontab命令的用法
Jun 24 PHP
PHP中spl_autoload_register函数的用法总结
Nov 07 PHP
Yii实现多数据库主从读写分离的方法
Dec 29 PHP
php使用iconv中文截断问题的解决方法
Feb 11 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
最新制作ThinkPHP3.2.3完全开发手册
Nov 23 PHP
浅谈PHP中的
Apr 23 PHP
PHP中静态变量的使用方法实例分析
Dec 01 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
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
2012/03/27 PHP
php控制linux服务器常用功能 关机 重启 开新站点等
2012/09/05 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
php伪静态之APACHE篇
2014/06/02 PHP
学习PHP的数组总结【经验】
2016/05/05 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
BOOM vs RR BO5 第三场 2.14
2021/03/10 DOTA
鼠标拖动实现DIV排序示例代码
2013/10/14 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
jQuery对象和DOM对象之间相互转换的方法介绍
2015/02/28 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
JavaScript获取客户端IP的方法(新方法)
2016/03/11 Javascript
浅析Jquery操作select
2016/12/13 Javascript
js实现放大镜特效
2017/05/18 Javascript
JavaScript判断浏览器和hack滚动条的写法
2017/07/23 Javascript
vue实现留言板todolist功能
2017/08/16 Javascript
nodeJs实现基于连接池连接mysql的方法示例
2018/02/10 NodeJs
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
JS去除字符串最后的逗号实例分析【四种方法】
2019/06/20 Javascript
使用vue-cli4.0快速搭建一个项目的方法步骤
2019/12/04 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
[33:19]完美世界DOTA2联赛PWL S2 PXG vs InkIce 第一场 11.26
2020/11/30 DOTA
python中itertools模块zip_longest函数详解
2018/06/12 Python
DRF跨域后端解决之django-cors-headers的使用
2019/01/27 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
解决HTML5手机端页面缩放的问题
2017/10/27 HTML / CSS
PHP如何调用MYSQL存储过程
2014/05/30 面试题
介绍一下Ruby的多线程处理
2013/02/01 面试题
护理职业生涯规划书
2014/01/24 职场文书
租赁意向书范本
2014/04/01 职场文书
2014年全国法制宣传日宣传活动方案
2014/11/02 职场文书
庆七一主持词
2015/06/29 职场文书
《确定位置》教学反思
2016/02/18 职场文书
学校教代会开幕词
2016/03/04 职场文书
Python实战之实现康威生命游戏
2021/04/26 Python