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 相关文章推荐
全局记录程序片段的运行时间 正确找到程序逻辑耗时多的断点
Jan 06 PHP
PHP贪婪算法解决0-1背包问题实例分析
Mar 23 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
thinkPHP中分页用法实例分析
Dec 26 PHP
Laravel路由设定和子路由设定实例分析
Mar 30 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
Oct 08 PHP
php 遍历目录,生成目录下每个文件的md5值并写入到结果文件中
Dec 12 PHP
Laravel中log无法写入问题的解决
Jun 17 PHP
PHP实现表单提交数据的验证处理功能【防SQL注入和XSS攻击等】
Jul 21 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
Apr 04 PHP
使用Zookeeper分布式部署PHP应用程序
Mar 15 PHP
Laravel 读取 config 下的数据方法
Oct 13 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 危险函数解释 分析
2009/04/22 PHP
php中apc缓存使用示例
2013/12/25 PHP
php在apache环境下实现gzip配置方法
2015/04/02 PHP
iframe 父窗口和子窗口相互的调用方法集锦
2010/12/15 Javascript
jquery.artwl.thickbox.js  一个非常简单好用的jQuery弹出层插件
2012/03/01 Javascript
js限制文本框输入长度两种限制方式(长度、字节数)
2012/12/19 Javascript
Javascript改变CSS样式(局部和全局)
2013/12/18 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
JavaScript实现的斑马线表格效果【隔行变色】
2017/09/18 Javascript
React Native 图片查看组件的方法
2018/03/01 Javascript
JavaScript实现五子棋小游戏
2020/10/26 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
[00:12]DAC2018 Miracle-站上中单舞台,他能否再写奇迹?
2018/04/06 DOTA
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
python实现贪吃蛇小游戏
2020/03/21 Python
Python中join()函数多种操作代码实例
2020/01/13 Python
简单了解python调用其他脚本方法实例
2020/03/26 Python
Anaconda3中的Jupyter notebook添加目录插件的实现
2020/05/18 Python
详解scrapy内置中间件的顺序
2020/09/28 Python
jupyter notebook更换皮肤主题的实现
2021/01/07 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
2021/02/25 Python
详解HTML5 LocalStorage 本地存储
2016/12/23 HTML / CSS
比较基础的php面试题及答案-填空题
2014/04/26 面试题
C#里面可以避免一个类被其他类继承么?如何?
2013/09/26 面试题
专业实习自我鉴定
2013/10/29 职场文书
农村党支部书记四风问题个人对照检查材料
2014/09/21 职场文书
答辩状格式范本
2015/05/22 职场文书
围城读书笔记
2015/06/26 职场文书
爱护公物主题班会
2015/08/17 职场文书
2016新年晚会开场白
2015/12/03 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
python使用glob检索文件的操作
2021/05/20 Python
新手初学Java List 接口
2021/07/07 Java/Android
Redis中有序集合的内部实现方式的详细介绍
2022/03/16 Redis
详解NumPy中的线性关系与数据修剪压缩
2022/05/25 Python