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合并数组array_merge函数运算符加号与的区别
Oct 31 PHP
PHP 编程安全性小结
Jan 08 PHP
php 编写安全的代码时容易犯的错误小结
May 20 PHP
php的日期处理函数及uchome的function_coomon中日期处理函数的研究
Jan 12 PHP
在php和MySql中计算时间差的方法
Apr 22 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
PHP 类相关函数的使用详解
May 10 PHP
php定界符
Jun 19 PHP
php显示页码分页类的封装
Jun 08 PHP
PHP实现的简单在线计算器功能示例
Aug 02 PHP
laravel ORM关联关系中的 with和whereHas用法
Oct 16 PHP
php中try catch捕获异常实例详解
Aug 06 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
关于Intype一些小问题的解决办法
2008/03/28 PHP
PHP关联数组的10个操作技巧
2013/01/21 PHP
解析PHP中的file_get_contents获取远程页面乱码的问题
2013/06/25 PHP
php生成N个不重复的随机数实例
2013/11/12 PHP
解读PHP的Yii框架中请求与响应的处理流程
2016/03/17 PHP
PHP如何防止用户重复提交表单
2020/12/09 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
两个SUBMIT按钮,如何区分处理
2006/08/22 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
Function.prototype.call.apply结合用法分析示例
2013/07/03 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
JavaScript forEach()遍历函数使用及介绍
2015/07/08 Javascript
JS实现的类似微信聊天效果示例
2019/01/29 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
js this 绑定机制深入详解
2020/04/30 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
[01:20]DOTA2 齐天大圣至宝动态展示
2016/12/13 DOTA
python中的yield使用方法
2014/02/11 Python
在Python程序中实现分布式进程的教程
2015/04/28 Python
django最快程序开发流程详解
2019/07/19 Python
在pycharm中显示python画的图方法
2019/08/31 Python
Raleigh兰令自行车美国官网:英国凤头牌自行车
2018/01/08 全球购物
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
铭宣海淘转运:美国、日本、英国转运等全球转运公司
2019/09/10 全球购物
食堂员工工作职责
2013/12/18 职场文书
培训主管的职业生涯规划
2014/03/06 职场文书
2015年元旦演讲稿
2014/09/12 职场文书
个人承诺书格式范文
2015/04/29 职场文书
2015暑期社会实践个人总结
2015/07/13 职场文书
python实现三阶魔方还原的示例代码
2021/04/28 Python
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
Python中with上下文管理协议的作用及用法
2022/03/18 Python