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 相关文章推荐
xml+php动态载入与分页
Oct 09 PHP
一个用mysql_odbc和php写的serach数据库程序
Oct 09 PHP
网友原创的PHP模板类代码
Sep 07 PHP
PHP中break及continue两个流程控制指令区别分析
Apr 18 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
Jun 30 PHP
php创建多级目录的方法
Mar 24 PHP
PHP的Yii框架入门使用教程
Feb 15 PHP
深入解析PHP的Yii框架中的缓存功能
Mar 29 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
laravel按天、按小时,查询数据的实例
Oct 09 PHP
PHP date_default_timezone_set()设置时区操作实例分析
May 16 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中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
学习php设计模式 php实现命令模式(command)
2015/12/08 PHP
详解PHP的Yii框架中扩展的安装与使用
2016/04/01 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
PHP中递归的实现实例详解
2017/11/14 PHP
PHP fclose函数用法总结
2019/02/15 PHP
php中错误处理操作实例分析
2019/08/23 PHP
通过js脚本复制网页上的一个表格的不错实现方法
2006/12/29 Javascript
JavaScript实现网页图片等比例缩放实现代码及调用方式
2013/02/25 Javascript
原生JS操作网页给p元素添加onclick事件及表格隔行变色
2013/12/01 Javascript
IE 下Enter提交表单存在重复提交问题的解决方法
2014/05/04 Javascript
js中使用replace方法完成某个字符的转换
2014/08/20 Javascript
jQuery的框架介绍
2016/05/11 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
ES6新数据结构Map功能与用法示例
2017/03/31 Javascript
Angular2使用Guard和Resolve进行验证和权限控制
2017/04/24 Javascript
在vue中添加Echarts图表的基本使用教程
2017/11/22 Javascript
weebox弹出窗口不居中显示的解决方法
2017/11/27 Javascript
Angularjs实现数组随机排序的方法
2018/10/02 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
[01:19:34]2014 DOTA2国际邀请赛中国区预选赛 New Element VS Dream time
2014/05/22 DOTA
简单的Python抓taobao图片爬虫
2014/10/26 Python
python实现的简单抽奖系统实例
2015/05/22 Python
Python计算一个文件里字数的方法
2015/06/15 Python
Windows和Linux下Python输出彩色文字的方法教程
2017/05/02 Python
用python实现对比两张图片的不同
2018/02/05 Python
如何删除一个表里面的重复行
2013/07/13 面试题
理工学院学生自我鉴定
2014/02/23 职场文书
公证委托书模板
2014/04/03 职场文书
优质服务口号
2014/06/11 职场文书
学习优秀党务工作者先进事迹材料思想报告
2014/09/17 职场文书
合作协议书模板
2014/10/10 职场文书
运动会广播稿100字
2015/08/19 职场文书
详解Redis在SpringBoot工程中的综合应用
2021/10/16 Redis