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 使用post,get的一种简洁方式
Apr 25 PHP
codeigniter数据库操作函数汇总
Jun 12 PHP
php输出xml必须header的解决方法
Oct 17 PHP
php中simplexml_load_file函数用法实例
Nov 12 PHP
php中session与cookie的比较
Jan 27 PHP
帝国cms常用标签汇总
Jul 06 PHP
php获得客户端浏览器名称及版本的方法(基于ECShop函数)
Dec 23 PHP
CodeIgniter钩子用法实例详解
Jan 20 PHP
注释PHP和html混合代码的小技巧(分享)
Nov 03 PHP
PHP区块查询实现方法分析
May 12 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 PHP
laravel 解决路由除了根目录其他都404的问题
Oct 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
《Re:从零开始的异世界生活 冰结之绊》
2020/04/09 日漫
PHP实现登录搜狐广告获取广告联盟数据的方法【附demo源码】
2016/10/14 PHP
thinkphp3.2实现在线留言提交验证码功能
2017/07/19 PHP
PHP实现生成推广海报的方法详解
2018/03/14 PHP
php防止表单重复提交实例讲解
2019/02/11 PHP
jquery中常用的SET和GET
2009/01/13 Javascript
javascript 获取页面的高度及滚动条的位置的代码
2010/05/06 Javascript
基于jquery的可多选的下拉列表框
2012/07/20 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
JS、jquery实现几分钟前、几小时前、几天前等时间差显示效果的代码实例分享
2014/04/11 Javascript
JavaScript函数获取事件源的小例子
2014/05/14 Javascript
用jquery的方法制作一个简单的导航栏
2014/06/23 Javascript
js实现网页随机切换背景图片的方法
2014/11/01 Javascript
学习AngularJs:Directive指令用法(完整版)
2016/04/26 Javascript
基于JS代码实现图片在页面中旋转效果
2016/06/16 Javascript
微信小程序动态添加分享数据
2017/06/14 Javascript
解决$store.getters调用不执行的问题
2019/11/08 Javascript
JavaScript复制变量三种方法实例详解
2020/01/09 Javascript
javascript canvas时钟模拟器
2020/07/13 Javascript
Vue Render函数原理及代码实例解析
2020/07/30 Javascript
Javascript类型判断相关例题及解析
2020/08/26 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
2019/06/17 Python
python实现的爬取电影下载链接功能示例
2019/08/26 Python
Django Admin中增加导出Excel功能过程解析
2019/09/04 Python
浅谈Python访问MySQL的正确姿势
2020/01/07 Python
Python3爬虫里关于代理的设置总结
2020/07/30 Python
PyTorch中Tensor的数据类型和运算的使用
2020/09/03 Python
解决python的空格和tab混淆而报错的问题
2021/02/26 Python
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
股东合作协议书范本
2014/04/14 职场文书
群众路线自我剖析材料
2014/10/08 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
员工离职感谢信
2015/01/22 职场文书
春晚观后感
2015/06/11 职场文书
MYSQL 无法识别中文的永久解决方法
2021/06/03 MySQL