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 相关文章推荐
3.从实例开始
Oct 09 PHP
多数据表共用一个页的新闻发布
Oct 09 PHP
我的论坛源代码(一)
Oct 09 PHP
一段防盗连的PHP代码
Dec 06 PHP
PHP session常见问题集锦及解决办法总结
Mar 18 PHP
PHP下用rmdir实现删除目录的三种方法小结
Apr 20 PHP
PHP5 字符串处理函数大全
Mar 23 PHP
深入php函数file_get_contents超时处理的方法详解
Jun 03 PHP
ThinkPHP实现静态缓存和动态缓存示例代码
May 02 PHP
Docker搭建自己的PHP开发环境
Feb 24 PHP
phpstudy2018升级MySQL5.5为5.7教程(图文)
Oct 24 PHP
PHP超级全局变量【$GLOBALS,$_SERVER,$_REQUEST等】用法实例分析
Dec 11 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+MYSQL开发工具及资源收藏
2007/01/02 PHP
php引用地址改变变量值的问题
2012/03/23 PHP
PHP那些琐碎的知识点(整理)
2017/05/20 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
如何重写Laravel异常处理类详解
2020/12/20 PHP
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
基于Jquery的实现回车键Enter切换焦点
2010/09/14 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
jquery实现类似淘宝星星评分功能实例
2014/09/12 Javascript
jQuery EasyUI datagrid实现本地分页的方法
2015/02/13 Javascript
JavaScript设计模式开发中组合模式的使用教程
2016/05/18 Javascript
Highcharts 多个Y轴动态刷新数据的实现代码
2016/05/28 Javascript
jQuery实现可展开折叠的导航效果示例
2016/09/12 Javascript
AngularJS 指令的交互详解及实例代码
2016/09/14 Javascript
jQuery仿IOS弹出框插件
2017/02/18 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
jQuery实现遍历XML节点和属性的方法示例
2018/04/29 jQuery
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
[47:21]Liquid vs TNC Supermajor 胜者组 BO3 第一场 6.4
2018/06/05 DOTA
深入解析Python中的上下文管理器
2016/06/28 Python
python基于itchat实现微信群消息同步机器人
2017/02/27 Python
python 3利用BeautifulSoup抓取div标签的方法示例
2017/05/28 Python
使用Python制作微信跳一跳辅助
2018/01/31 Python
Python实现扣除个人税后的工资计算器示例
2018/03/26 Python
python manage.py runserver流程解析
2019/11/08 Python
Python3读取和写入excel表格数据的示例代码
2020/06/09 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
2020/07/14 Python
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
班会关于环保演讲稿
2013/12/29 职场文书
小学信息技术教学反思
2014/02/10 职场文书
廉洁使者实施方案
2014/03/29 职场文书
争先创优演讲稿
2014/09/15 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
Java 通过手写分布式雪花SnowFlake生成ID方法详解
2022/04/07 Java/Android