PHP5中虚函数的实现方法分享


Posted in PHP onApril 20, 2011

请看下面的代码:

<?php 
class A { 
public function x() { 
echo "A::x() was called.\n"; 
} 
public function y() { 
self::x(); 
echo "A::y() was called.\n"; 
} 
public function z() { 
$this->x(); 
echo "A::z() was called.\n"; 
} 
} 
class B extends A { 
public function x() { 
echo "B::x() was called.\n"; 
} 
} 
$b = new B(); 
$b->y(); 
echo "--\n"; 
$b->z(); 
?>

该例中,A::y()调用了A::x(),而B::x()覆盖了A::x(),那么当调用B::y()时,B::y()应该调用A::x()还是 B::x()呢?在C++中,如果A::x()未被定义为虚函数,那么B::y()(也就是A::y())将调用A::x(),而如果A::x()使用 virtual关键字定义成虚函数,那么B::y()将调用B::x()。然而,在PHP5中,虚函数的功能是由 self 和 $this 关键字实现的。如果父类中A::y()中使用 self::x() 的方式调用了 A::x(),那么在子类中不论A::x()是否被覆盖,A::y()调用的都是A::x();而如果父类中A::y()使用 $this->x() 的方式调用了 A::x(),那么如果在子类中A::x()被B::x()覆盖,A::y()将会调用B::x()。

上例的运行结果如下:
A::x() was called. A::y() was called. --
B::x() was called. A::z() was called.
virtual-function.php

<?php 
class ParentClass { 
static public function say( $str ) { 
static::do_print( $str ); 
} 
static public function do_print( $str ) { 
echo "<p>Parent says $str</p>"; 
} 
} 
class ChildClass extends ParentClass { 
static public function do_print( $str ) { 
echo "<p>Child says $str</p>"; 
} 
} 
class AnotherChildClass extends ParentClass { 
static public function do_print( $str ) { 
echo "<p>AnotherChild says $str</p>"; 
} 
} 
echo phpversion(); 
$a=new ChildClass(); 
$a->say( 'Hello' ); 
$b=new AnotherChildClass(); 
$b->say( 'Hello' );
PHP 相关文章推荐
php 计算两个时间戳相隔的时间的函数(小时)
Dec 18 PHP
php getimagesize 上传图片的长度和宽度检测代码
May 15 PHP
PHP zlib扩展实现页面GZIP压缩输出
Jun 17 PHP
Windows下部署Apache+PHP+MySQL运行环境实战
Aug 31 PHP
利用中国天气预报接口实现简单天气预报
Jan 20 PHP
用php守护另一个php进程的例子
Feb 13 PHP
php实现json编码的方法
Jul 30 PHP
详解PHP中的null合并运算符
Dec 30 PHP
基于命令行执行带参数的php脚本并取得参数的方法
Jan 25 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
Nov 23 PHP
对于Laravel 5.5核心架构的深入理解
Feb 22 PHP
php7 参数、整形及字符串处理机制修改实例分析
May 25 PHP
Windows下利用Gvim写PHP产生中文乱码问题解决方法
Apr 20 #PHP
php中将地址生成迅雷快车旋风链接的代码[测试通过]
Apr 20 #PHP
PHP curl模拟浏览器采集阿里巴巴的实现代码
Apr 20 #PHP
PHP中的session永不过期的解决思路及实现方法分享
Apr 20 #PHP
关于session在PHP5的配置文件中的详细设置参数说明
Apr 20 #PHP
PHP session有效期session.gc_maxlifetime
Apr 20 #PHP
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
Apr 18 #PHP
You might like
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
浅谈php://filter的妙用
2019/03/05 PHP
javascript StringBuilder类实现
2008/12/22 Javascript
Js基础学习资料
2010/11/23 Javascript
js实现温度计时间样式代码分享
2015/08/21 Javascript
jQuery模拟完美实现经典FLASH导航动画效果【附demo源码下载】
2016/11/09 Javascript
浅谈js之字面量、对象字面量的访问、关键字in的用法
2016/11/20 Javascript
jQuery实现简单弹窗遮罩效果
2017/02/27 Javascript
关于vue-resource报错450的解决方案
2017/07/24 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
node上的redis调用优化示例详解
2018/10/30 Javascript
微信小程序里引入SVG矢量图标的方法
2019/09/20 Javascript
Object.keys() 和 Object.getOwnPropertyNames() 的区别详解
2020/05/21 Javascript
[38:42]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第二场 11.05
2020/11/05 DOTA
python连接mongodb操作数据示例(mongodb数据库配置类)
2013/12/31 Python
python实现从字符串中找出字符1的位置以及个数的方法
2014/08/25 Python
使用Python的Twisted框架编写简单的网络客户端
2015/04/16 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
Python实现曲线点抽稀算法的示例
2017/10/12 Python
Python抓取聚划算商品分析页面获取商品信息并以XML格式保存到本地
2018/02/23 Python
django用户登录和注销的实现方法
2018/07/16 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
python操作文件的参数整理
2019/06/11 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
工程部主管岗位职责
2013/11/17 职场文书
安全责任书范文
2014/03/12 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
毕业论文致谢部分怎么写
2015/05/14 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
货款欠条范本
2015/07/03 职场文书
庆元旦主持词
2015/07/06 职场文书
2016应届大学生自荐信模板
2016/01/28 职场文书
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB