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 相关文章推荐
10个可以简化php开发过程的MySQL工具
Apr 11 PHP
php allow_url_include的应用和解释
Apr 22 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
Linux环境下搭建php开发环境的操作步骤
Jun 17 PHP
怎样使用php与jquery设置和读取cookies
Aug 08 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
ThinkPHP CURD方法之order方法详解
Jun 18 PHP
php字符串替换函数substr_replace()用法实例
Mar 17 PHP
PHP使用数组依次替换字符串中匹配项
Jan 08 PHP
解决在Laravel 中处理OPTIONS请求的问题
Oct 11 PHP
Laravel获取当前请求的控制器和方法以及中间件的例子
Oct 11 PHP
php实现的简单多进程服务器类完整示例
Feb 01 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 数组实例说明
2008/08/18 PHP
PHP与C#分别格式化文件大小的代码
2011/05/14 PHP
PHP排序算法的复习和总结
2012/02/15 PHP
php微信公众号开发之现金红包
2018/04/16 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
一个简单的Ext.XTemplate的实例代码
2012/03/18 Javascript
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
js+css实现导航效果实例
2015/02/10 Javascript
Javascript中prototype的使用详解
2016/06/18 Javascript
JavaScript中this用法学习笔记
2019/03/17 Javascript
Node.JS在命令行中检查Chrome浏览器是否安装并打开指定网址
2019/05/21 Javascript
JavaScript怎样在删除前添加确认弹出框?
2019/05/27 Javascript
微信小程序模板消息推送的两种实现方式
2019/08/27 Javascript
JS设置自定义快捷键并实现图片上下左右移动
2019/10/17 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
[46:00]Ti4 冒泡赛第二轮LGD vs C9 2
2014/07/14 DOTA
python操作redis的方法
2015/07/07 Python
python批量提取word内信息
2015/08/09 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
python爬虫 基于requests模块发起ajax的get请求实现解析
2019/08/20 Python
Python中Unittest框架的具体使用
2019/08/27 Python
python程序 创建多线程过程详解
2019/09/23 Python
Python中sorted()排序与字母大小写的问题
2020/01/14 Python
浅谈OpenCV中的新函数connectedComponentsWithStats用法
2020/07/05 Python
python爬取2021猫眼票房字体加密实例
2021/02/19 Python
美国知名奢侈美容品牌零售商:Cos Bar
2017/04/21 全球购物
英国户外装备和冒险服装零售商:alloutdoor
2018/01/30 全球购物
什么是Web Service?
2012/07/25 面试题
计算机毕业生自荐信范文
2014/03/23 职场文书
《会走路的树》教后反思
2014/04/19 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
2015年度物流工作总结
2015/04/30 职场文书
2016高考感言
2015/08/01 职场文书
2016七夕情人节寄语
2015/12/04 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python