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中的正规表达式(二)
Oct 09 PHP
弄了个检测传输的参数是否为数字的Function
Dec 06 PHP
逐步提升php框架的性能
Jan 10 PHP
php IP及IP段进行访问限制的代码
Dec 17 PHP
PHP GD 图像处理组件的常用函数总结
Apr 28 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 PHP
php使用curl模拟登录后采集页面的例子
Nov 04 PHP
PHP中$this和$that指针使用实例
Jan 06 PHP
Laravel执行migrate命令提示:No such file or directory的解决方法
Mar 16 PHP
微信 开发生成带参数的二维码的实例
Nov 23 PHP
PHP中通过getopt解析GNU C风格命令行选项
Nov 18 PHP
php使用Swoole实现毫秒级定时任务的方法
Sep 04 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的面向对象编程
2006/10/09 PHP
php读取mysql的简单实例
2014/01/15 PHP
Drupal7连接多个数据库及常见问题解决
2014/03/02 PHP
PHP防止post重复提交数据的简单例子
2014/06/07 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
php安装swoole扩展的方法
2015/03/19 PHP
PHP中如何判断exec函数执行成功?
2016/08/04 PHP
javascript自然分类法算法实现代码
2013/10/11 Javascript
Javascript连接多个数组不用concat来解决
2014/03/24 Javascript
推荐5 个常用的JavaScript调试技巧
2015/01/08 Javascript
jQuery实现的fixedMenu下拉菜单效果代码
2015/08/24 Javascript
4种JavaScript实现简单tab选项卡切换的方法
2016/01/06 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
jQuery简单实现中间浮窗效果
2016/09/04 Javascript
NodeJS使用formidable实现文件上传
2016/10/27 NodeJs
详解windows下vue-cli及webpack 构建网站(二)导入bootstrap样式
2017/06/17 Javascript
详解使用路由延迟加载 Angular 模块
2017/10/12 Javascript
vue-cli 自定义指令directive 添加验证滑块示例
2017/10/19 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
微信小程序带动画弹窗组件使用方法详解
2018/11/27 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
python的pdb调试命令的命令整理及实例
2017/07/12 Python
python数据结构之链表的实例讲解
2017/07/25 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
Django处理多用户类型的方法介绍
2019/05/18 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
python 多进程队列数据处理详解
2019/12/23 Python
详解CSS3中Media Queries的相关使用
2015/07/17 HTML / CSS
HTML5实现的震撼3D焦点图动画的示例代码
2019/09/26 HTML / CSS
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
给医务人员表扬信
2014/01/12 职场文书
客服专员岗位职责
2014/02/28 职场文书
2014幼儿教师个人工作总结
2014/12/03 职场文书
教师教育教学随笔
2015/08/15 职场文书
SQL写法--行行比较
2021/08/23 SQL Server