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函数代码
Apr 22 PHP
PHP读取xml方法介绍
Jan 12 PHP
深入PHP与浏览器缓存的分析
Jun 03 PHP
非常实用的php弹出错误警告函数扩展性强
Jan 17 PHP
PHP面向对象程序设计之接口用法
Aug 20 PHP
php读取目录及子目录下所有文件名的方法
Oct 20 PHP
php json转换成数组形式代码分享
Nov 10 PHP
PHP结合jQuery.autocomplete插件实现输入自动完成提示的功能
Apr 27 PHP
smarty中常用方法实例总结
Aug 07 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
PHP获取input输入框中的值去数据库比较显示出来
Nov 16 PHP
老生常谈PHP面向对象之标识映射
Jun 21 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生成自己的LOG文件
2006/10/09 PHP
PHP的加密方式及原理
2012/06/14 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
laravel框架使用极光推送消息操作示例
2020/02/15 PHP
jquery 上下滚动广告
2009/06/17 Javascript
JavaScript中的Truthy和Falsy介绍
2015/01/01 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
bootstrap下拉列表与输入框组结合的样式调整
2016/10/08 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
Ionic 2 实现列表滑动删除按钮的方法
2017/01/22 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
基于Bootstrap table组件实现多层表头的实例代码
2017/09/07 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
使用vue脚手架(vue-cli)搭建一个项目详解
2019/05/09 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python通过90行代码搭建一个音乐搜索工具
2015/07/29 Python
简单谈谈Python中的反转字符串问题
2016/10/24 Python
python中yaml配置文件模块的使用详解
2018/04/27 Python
Python RabbitMQ消息队列实现rpc
2018/05/30 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
感知器基础原理及python实现过程详解
2019/09/30 Python
Python实现平行坐标图的绘制(plotly)方式
2019/11/22 Python
python中读入二维csv格式的表格方法详解(以元组/列表形式表示)
2020/04/24 Python
Python 解决相对路径问题:&quot;No such file or directory&quot;
2020/06/05 Python
CSS3制作Dropdown下拉菜单的方法
2015/07/18 HTML / CSS
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
企业申诉管理制度
2014/01/30 职场文书
幼儿园消防演练方案
2014/02/13 职场文书
亲子拓展活动方案
2014/02/20 职场文书
开学典礼决心书
2014/03/11 职场文书
课外活动实习计划
2015/01/19 职场文书
团代会闭幕词
2015/01/28 职场文书
学校运动会加油词
2015/07/18 职场文书
2016年师德学习心得体会
2016/01/12 职场文书