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与MySQL开发中页面出现乱码的一种解决方法
Jul 29 PHP
PHP 金额数字转换成英文
May 06 PHP
11个PHP 分页脚本推荐
Aug 15 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
php数组函数序列之rsort() - 对数组的元素值进行降序排序
Nov 02 PHP
php发送get、post请求的6种方法简明总结
Jul 08 PHP
PHP生成制作验证码的简单实例
Jun 12 PHP
php好代码风格的阶段性总结
Jun 25 PHP
PHP 爬取网页的主要方法
Jul 13 PHP
php微信公众号开发之简答题
Oct 20 PHP
PHP join()函数用法与实例讲解
Mar 11 PHP
PHP数组基本用法与知识点总结
Jun 02 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
substr()函数中文版
2006/10/09 PHP
php判断字符以及字符串的包含方法属性
2008/08/30 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
关于Yii中模型场景的一些简单介绍
2019/09/22 PHP
javascript 事件查询综合 推荐收藏
2010/03/10 Javascript
jquery插件制作简单示例说明
2012/02/03 Javascript
Javascript基于AJAX回调函数传递参数实例分析
2015/12/15 Javascript
JS制作图形验证码实现代码
2020/10/19 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
JavaScript在控件上添加倒计时功能的实现代码
2017/07/04 Javascript
Bootstrap图片轮播效果详解
2017/10/17 Javascript
jQuery实现的手动拖动控制进度条效果示例【测试可用】
2018/04/18 jQuery
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
微信头像地址失效踩坑记附带解决方案
2019/09/23 Javascript
JS+CSS实现随机点名(实例代码)
2019/11/04 Javascript
JQuery复选框全选效果如何实现
2020/05/08 jQuery
使用JavaScript实现网页秒表功能(含开始、暂停、继续、重置功能)
2020/06/05 Javascript
python 异常处理总结
2016/10/18 Python
python psutil库安装教程
2018/03/19 Python
元组列表字典(莫烦python基础)
2019/04/03 Python
关于numpy中eye和identity的区别详解
2019/11/29 Python
基于Python实现扑克牌面试题
2019/12/11 Python
Mio Skincare中文官网:肌肤和身体护理
2016/10/26 全球购物
简约控的天堂:The Undone
2016/12/21 全球购物
香港迪士尼乐园酒店预订:Hong Kong Disneyland Hotels
2017/05/02 全球购物
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
EJB的几种类型
2012/08/15 面试题
大学生就业推荐信范文
2013/11/29 职场文书
综合内勤岗位职责
2014/04/14 职场文书
客房领班岗位职责
2015/02/11 职场文书
入党积极分子党小组意见
2015/06/02 职场文书
离职证明格式样本
2015/06/12 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
2015年教学副校长工作总结
2015/07/22 职场文书
《狮子和鹿》教学反思
2016/02/16 职场文书
2016年教师师德师风承诺书
2016/03/25 职场文书