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 相关文章推荐
PHP4在WinXP下IIS和Apache2服务器上的安装实例
Oct 09 PHP
PHP入门
Oct 09 PHP
php模板之Phpbean的目录结构
Jan 10 PHP
php生成缩略图的类代码
Oct 02 PHP
网站用php实现paypal整合方法
Nov 28 PHP
PHP安全配置详细说明
Sep 26 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
Jan 09 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
PHP高效获取远程图片尺寸和大小的实现方法
Oct 20 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
php微信公众号开发之关键词回复
Oct 20 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同时连接多个mysql数据库示例代码
2014/03/17 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
2014/05/15 PHP
php获取url参数方法总结
2014/11/13 PHP
php目录遍历函数opendir用法实例
2014/11/20 PHP
php去除html标记的原生函数详解
2015/01/27 PHP
php无法连接mysql数据库的正确解决方法
2016/07/01 PHP
php 指定范围内多个随机数代码实例
2016/07/18 PHP
PHP实现无限分类的实现方法
2016/11/14 PHP
Laravel框架自定义验证过程实例分析
2019/02/01 PHP
JavaScript中两个感叹号的作用说明
2011/12/28 Javascript
javascript倒计时功能实现代码
2012/06/07 Javascript
node.js不得不说的12点内容
2014/07/14 Javascript
textarea不能通过maxlength属性来限制字数的解决方法
2014/09/01 Javascript
手机号码,密码正则验证
2014/09/04 Javascript
form.submit()不能提交表单的原因分析
2014/10/23 Javascript
深入理解JavaScript编程中的原型概念
2015/06/25 Javascript
AngularJS实现一次监听多个值发生的变化
2016/08/31 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
微信小程序简单实现form表单获取输入数据功能示例
2017/11/30 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
VueJS 组件参数名命名与组件属性转化问题
2018/12/03 Javascript
setTimeout与setInterval的区别浅析
2019/03/23 Javascript
基于vue-cli3和element实现登陆页面
2019/11/13 Javascript
浅谈编码,解码,乱码的问题
2016/12/30 Python
python使用tornado实现简单爬虫
2018/07/28 Python
python 判断矩阵中每行非零个数的方法
2019/01/26 Python
python 内置函数汇总详解
2019/09/16 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
中学老师的自我评价
2013/11/07 职场文书
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
新春寄语大全
2014/04/09 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
勤俭节约主题班会
2015/08/13 职场文书
python获取对象信息的实例详解
2021/07/07 Python
Matplotlib绘制条形图的方法你知道吗
2022/03/21 Python
vue如何使用模拟的json数据查看效果
2022/03/31 Vue.js