位置: 编程技术 - 正文

php5.3后静态绑定用法详解(php静态方法可以被继承吗)

编辑:rootadmin

推荐整理分享php5.3后静态绑定用法详解(php静态方法可以被继承吗),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:php如何实现静态化,php静态属性和静态方法,php静态方法可以被继承吗,php 后期静态绑定,php 后期静态绑定,php静态属性和静态方法,php 静态,php 后期静态绑定,内容如对您有帮助,希望把文章链接给更多的朋友!

本文实例讲述了php5.3后静态绑定用法。分享给大家供大家参考,具体如下:

手册原文:

自 PHP 5.3.0 起,PHP 增加了一个叫做后期静态绑定的功能,用于在继承范围内引用静态调用的类。

准确说,后期静态绑定工作原理是存储了在上一个"非转发调用"(non-forwarding call)的类名。当进行静态方法调用时,该类名即为明确指定的那个(通常在 :: 运算符左侧部分);当进行非静态方法调用时,即为该对象所属的类。所谓的"转发调用"(forwarding call)指的是通过以下几种方式进行的静态调用:self::,parent::,static:: 以及 forward_static_call()。可用 get_called_class() 函数来得到被调用的方法所在的类名,static:: 则指出了其范围。

该功能从语言内部角度考虑被命名为"后期静态绑定"。"后期绑定"的意思是说,static:: 不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为"静态绑定",因为它可以用于(但不限于)静态方法的调用。

self:: 的限制

使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类:

Example #1 self:: 用法

以上例程会输出:

A

后期静态绑定的用法 后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。

Example #2 static:: 简单用法

以上例程会输出:

B

Note: 在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。

Example #3 非静态环境下使用 static::

以上例程会输出:

success!success!success!Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9

Note: 后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。

Example #4 转发和非转发调用

以上例程会输出:

ACC

下面示例分析了基于PHP后期静态绑定功能解决在继承范围内引用静态调用的类。

先看如下代码:

很明显,结果不是我们预期的,这是因为self::取决于定义时所在的类,而不是运行中的类。为了解决这个问题,你可能会在继承类中重写status()方法,更好的解决方案是PHP 5.3后添加了后期静态绑定的功能。

代码如下:

php5.3后静态绑定用法详解(php静态方法可以被继承吗)

可见,static::不在指向当前所在的类,实际上,它是在运行中计算的,强制获取最终类的所有属性。

因此,建议,以后不要再使用self::,使用static::

补充:

网友帖1

php的后期静态绑定,怎么解释?下面的这幅图输出是A,C,C

由图的继承关系可知:C彻底包含了B和A。

在看答案结果以前,他细观察发现,三个类里都有同一个名称who()方法。系统会用最后一个优先级最高,进一步的说,你几乎没法通过C去调用A、B内的who(),只能重改方法,比如添加个getBWho(){echo B::who();}然后通过C::getBWho();来调用B内的who();

下面来看运行结果:

test只在B中出现,所以结果必然是test()中运行的三个结果:

第一个:静态直接指名到姓的调用A内静态函数,这没有悬念,必然是A第二个:parent::是调用上一级的父类,在此题中为A,A中又直接调用static:who();上面说过了,这个who()优先级最高的在C里面,无论在你ABC中哪里调用,只要是static::who()必然是最后定义的那个,覆盖效应,如果想调用A里的必需指明A::who()或是通过去除static从作用域限制来实现。所以这个who()就是C中定义的who第三个:self::who与第二个类似的问题,看样该走B的,注意覆盖效应,要想调用B内的who必须得B::who(),因为更高级的C已经重写了这个方法,如果C中没有who,肯定就是B,依次类推。所以必然还是调用C中的who;

所以答案为:ACC

代码如下:

输出为:A B B

网友帖2

(还是针对上面图中的代码)

手册不是说得很清楚么

”后期绑定“的意思是说,static::不再被解析为定义当前方法所在的类,而是在实际运行时计算的。也可以称之为”静态绑定“,因为它可以用于(但不限于)静态方法的调用。

#1说的有个小问题

【self::foo(); // 这个self实际上是C类。明白吗? C::test() C继承了B的test()方法】

不准确,self还是B类,但是本身没有覆写foo方法,所以就调用父类A的foo方法。

如果self实际是C类,那你试下self::foo();改成self::who();,应当打印C,但是打印B,这也正是self和static的区别。

输出为:A C B

网友帖3

所以这就回答了楼上的疑问:若是把self::foo(); 改成self::who(),因为self指代B,而B有who方法,所以结果是变成了B

静态调用使用 parent:: 或者 self:: 将转发原始调用信息。

更多关于PHP相关内容感兴趣的读者可查看本站专题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家PHP程序设计有所帮助。

PHP实现的方程求解示例分析 本文实例讲述了PHP实现的方程求解。分享给大家供大家参考,具体如下:一、需求1.给出一个平均值X,反过来求出来,得到这个平均值X的三个数X1,X2,

php使用高斯算法实现图片的模糊处理功能示例 本文实例讲述了php使用高斯算法实现图片的模糊处理功能。分享给大家供大家参考,具体如下:phpclassimage_blur{functiongaussian_blur($srcImg,$savepath=null,$savename=

php基于闭包实现函数的自调用(递归)实例分析 本文实例讲述了php基于闭包实现函数的自调用(递归)的方法。分享给大家供大家参考,具体如下:php的闭包可能不常用,但是在某些场合之下还是可以考

标签: php静态方法可以被继承吗

本文链接地址:https://www.jiuchutong.com/biancheng/301194.html 转载请保留说明!

上一篇:php基于curl实现的股票信息查询类实例(php curl_multi_init)

下一篇:PHP实现的方程求解示例分析(php 方法)

  • 境外向国内汇款几天到账
  • 消费税的三种计税方法及各自的计算公式
  • 支付给个人的佣金费用需要发票吗
  • 卷烟批发环节消费税纳税义务发生时间
  • 个人股权转让给公司
  • 小型企业利润表
  • 水泥沙子开票属于什么类别
  • 核定征收生产经营所得税率
  • 汇算清缴业务招待费调整分录
  • 预付账款转入其他非流动资产
  • 通行费进项抵扣条件
  • 计提营业账簿印花税怎么做账
  • 企业注销时有未抵扣的留抵
  • 租房发票的税由谁承担
  • 易票365怎么认证发票
  • 所得税的费用限额怎么算
  • 境外所得税收抵免政策
  • 资产减值损失属于什么科目借方增加还是减少
  • 其他劳务包括什么内容?
  • 航道疏浚服务属于什么服务
  • 月末在产品直接人工成本怎么算
  • 委托加工费的增值税计入成本吗
  • 汽车维修公司如何经营粉丝群才能让潜在客户注意到我们
  • 应收账款核销会议纪要
  • 财务费用算营业利润吗
  • 购销合同印花税税率
  • 土地租赁协议和合同有什么区别
  • 国外消费发票可以抵扣吗
  • 补交前几年的进项发票
  • 对于长期没发票的预付款怎么处理?
  • 收到投资款怎么处理帐
  • win11专业版企业版家庭版哪个玩游戏好
  • 或有事项基本确定
  • 临时设施是租入还是租入
  • 不动产投资包括哪些
  • 代理进口货物账务怎么处理
  • 产负债表的负债项目,显示了企业所负担债务的
  • 查补以前年度增值税怎么申报
  • php和数据库
  • 借支单还款后借支单要还么
  • 为什么会产生应收账款
  • kali linux如何使用
  • php截取文件后缀名方法
  • 代理业务资产的含义
  • 基于骨骼关键点的动作识别
  • 什么叫非侵入性装置
  • 智能商亭超级大骗局
  • 保教费收入要交企业所得税吗
  • 小规模纳税人代收水电费税率
  • 总公司发票可以入账分公司吗怎么做账
  • php框架symfony
  • SQL SERVER 将XML变量转为JSON文本
  • 坏账核销的会计处理
  • 印花税步骤
  • 员工工资应要计入什么
  • 购买的软件属于什么资产
  • 什么是电子银行服务
  • 建筑劳务企业应发民工工资年终未发是否进行纳税调整
  • 采购未到票如何入账
  • 销售退回的账务处理会计分录
  • 租赁房产税计税依据及计算方式是什么
  • 生产成本直接人工怎么算
  • 辅导期一般纳税人标准
  • 没有发票的福利费支出可以税前扣除吗
  • 现金流水账怎么做表格
  • MySql Error 1698(28000)问题的解决方法
  • mysql查询慢sql命令
  • 在Windows Server 2008服务器的三种角色
  • ubuntu20.04.1安装
  • winxp系统介绍
  • mac视频预览图不显示
  • win8.1技巧
  • linux定时备份文件
  • shell 批量删除
  • unity游戏加密
  • 网页js识别设备的唯一性
  • javascript基于什么的语言
  • scroll-view组件用于实现
  • 广州契税补贴2022政策
  • 宝安区西乡税务所长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设