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 相关文章推荐
smarty实例教程
Nov 19 PHP
PHP中for循环语句的几种变型
Nov 26 PHP
不用mod_rewrite直接用php实现伪静态化页面代码
Oct 04 PHP
ExtJS与PHP、MySQL实现存储的方法
Apr 02 PHP
php如何调用webservice应用介绍
Nov 24 PHP
php5.5中类级别的常量使用介绍
Oct 02 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
浅谈Eclipse PDT调试PHP程序
Jun 09 PHP
在Nginx上部署ThinkPHP项目教程
Feb 02 PHP
php无序树实现方法
Jul 28 PHP
PHP删除数组中特定元素的两种方法
Feb 28 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 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
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
js 表单验证方法(实用)
2009/04/28 Javascript
JavaScript高级程序设计 读书笔记之十 本地对象Date日期
2012/02/27 Javascript
JavaScript将相对地址转换为绝对地址示例代码
2013/07/19 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
Javascript浅谈之this
2013/12/17 Javascript
js模仿hover的具体实现代码
2013/12/30 Javascript
sogou地图API用法实例教程
2014/09/11 Javascript
JavaScript中数据结构与算法(三):链表
2015/06/19 Javascript
Javascript连接Access数据库完整实例
2015/08/03 Javascript
基于jquery实现表格无刷新分页
2016/01/07 Javascript
js去字符串前后空格的实现方法
2016/02/26 Javascript
BootStrap表单验证 FormValidation 调整反馈图标位置的实例代码
2017/05/17 Javascript
JavaScript原生实现观察者模式的示例
2017/12/15 Javascript
解决layui checkbox 提交多个值的问题
2019/09/02 Javascript
javaScript实现一个队列的方法
2020/07/14 Javascript
[02:33]DOTA2英雄基础教程 司夜刺客
2013/12/04 DOTA
python基础教程之lambda表达式使用方法
2014/02/12 Python
python实现支持目录FTP上传下载文件的方法
2015/06/03 Python
Python获取指定字符前面的所有字符方法
2018/05/02 Python
Python统计python文件中代码,注释及空白对应的行数示例【测试可用】
2018/07/25 Python
python3使用pandas获取股票数据的方法
2018/12/22 Python
pycharm 将python文件打包为exe格式的方法
2019/01/16 Python
Django中使用Whoosh进行全文检索的方法
2019/03/31 Python
Flask框架学习笔记之消息提示与异常处理操作详解
2019/08/15 Python
Pytorch保存模型用于测试和用于继续训练的区别详解
2020/01/10 Python
python3 logging日志封装实例
2020/04/08 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
python opencv肤色检测的实现示例
2020/12/21 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
.net面试题
2015/12/22 面试题
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
工程概预算专业毕业生求职信
2013/10/04 职场文书
历史学专业推荐信
2013/11/06 职场文书
政风行风整改方案
2014/10/25 职场文书
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫