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开发大型项目的一点经验
Oct 09 PHP
php 表单验证实现代码
Mar 10 PHP
php 文件上传后缀名与文件类型对照表(几乎涵盖所有文件)
May 16 PHP
php模板函数 正则实现代码
Oct 15 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
PHP数组排序之sort、asort与ksort用法实例
Sep 08 PHP
smarty中post用法实例
Nov 28 PHP
php include类文件超时问题处理
Feb 06 PHP
基于CakePHP实现的简单博客系统实例
Jun 28 PHP
PHP中的switch语句的用法实例详解
Oct 21 PHP
根据key删除数组中指定的元素实现方法
Mar 02 PHP
laravel自定义分页效果
Jul 23 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设计模式 php实现享元模式(flyweight)
2015/12/07 PHP
php生成带logo二维码方法小结
2016/04/08 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
2017/03/14 PHP
用JS操作FRAME中的IFRAME及其内容的实现代码
2008/07/26 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
showModalDialog在谷歌浏览器下会返回Null的解决方法
2013/11/27 Javascript
详解JavaScript中循环控制语句的用法
2015/06/03 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
js基本算法:冒泡排序,二分查找的简单实例
2016/10/08 Javascript
移动开发之自适应手机屏幕宽度
2016/11/23 Javascript
基于JQuery及AJAX实现名人名言随机生成器
2017/02/10 Javascript
Vue使用高德地图搭建实时公交应用功能(地图 + 附近站点+线路详情 + 输入提示+换乘详情)
2018/05/16 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
2020/11/17 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
Python中条件判断语句的简单使用方法
2015/08/21 Python
分享6个隐藏的python功能
2017/12/07 Python
快速查询Python文档方法分享
2017/12/27 Python
python MysqlDb模块安装及其使用详解
2018/02/23 Python
Python JSON格式数据的提取和保存的实现
2019/03/22 Python
Django如何继承AbstractUser扩展字段
2020/11/27 Python
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
创立科技Java面试题
2015/11/29 面试题
个人收入证明范本
2014/01/12 职场文书
工厂保安员岗位职责
2014/01/31 职场文书
《特殊的葬礼》教学反思
2014/04/27 职场文书
消防安全宣传标语
2014/06/07 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
车队安全员岗位职责
2015/02/15 职场文书
小升初自荐信范文
2015/03/05 职场文书
2015年幼儿园教育教学工作总结
2015/05/25 职场文书
2016年春节慰问信息大全
2015/11/30 职场文书
nginx里的rewrite跳转的实现
2021/03/31 Servers
python中使用redis用法详解
2022/12/24 Redis