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 相关文章推荐
Get或Post提交值的非法数据处理
Oct 09 PHP
十天学会php之第三天
Oct 09 PHP
php之对抗Web扫描器的脚本技巧
Oct 01 PHP
MySQL 日期时间函数常用总结
Jun 12 PHP
PHP实现读取一个1G的文件大小
Aug 24 PHP
测试php函数的方法
Nov 13 PHP
PHP变量的定义、可变变量、变量引用、销毁方法
Dec 20 PHP
PHP实现远程下载文件到本地
May 17 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 PHP
PHP+Ajax实现上传文件进度条动态显示进度功能
Jun 04 PHP
PHP中数组转换为SimpleXML教程
Jan 27 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与已存在的Java应用程序集成
2006/10/09 PHP
PHPMYADMIN 简明安装教程 推荐
2010/03/07 PHP
php使用GeoIP库实例
2014/06/27 PHP
PHP对象、模式与实践之高级特性分析
2016/12/08 PHP
PHP数组对象与Json转换操作实例分析
2019/10/22 PHP
浅析PHP echo 和 print 语句
2020/06/30 PHP
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
JS扩展方法实例分析
2015/04/15 Javascript
JavaScript更改字符串的大小写
2015/05/07 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
微信小程序实现的动态设置导航栏标题功能示例
2019/01/31 Javascript
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
python实现的多线程端口扫描功能示例
2017/01/21 Python
详解Python之unittest单元测试代码
2018/01/24 Python
如何在Django中设置定时任务的方法示例
2019/01/18 Python
详解python持久化文件读写
2019/04/06 Python
pytorch torchvision.ImageFolder的用法介绍
2020/02/20 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
利用python 读写csv文件
2020/09/10 Python
HTML5拖拽API经典实例详解
2018/04/20 HTML / CSS
Canvas实现放大镜效果完整案例分析(附代码)
2020/11/26 HTML / CSS
全球速卖通俄罗斯站:AliExpress俄罗斯
2019/06/17 全球购物
Ever New美国:澳大利亚领先的女装时尚品牌
2019/11/28 全球购物
Jdbc数据访问技术面试题
2012/03/30 面试题
总裁岗位职责
2013/12/04 职场文书
司机检讨书
2014/02/13 职场文书
纪念9.18事变演讲稿
2014/09/14 职场文书
追悼词范文大全
2015/06/23 职场文书
大学生军训心得体会5篇
2019/08/15 职场文书
Python爬虫之爬取哔哩哔哩热门视频排行榜
2021/04/28 Python
详细了解java监听器和过滤器
2021/07/09 Java/Android