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 相关文章推荐
对盗链说再见...
Oct 09 PHP
用户的详细注册和判断
Oct 09 PHP
对Session和Cookie的区分与解释
Mar 16 PHP
Zend Guard一些常见问题解答
Sep 11 PHP
PHP函数学习之PHP函数点评
Jul 05 PHP
php封装好的人民币数值转中文大写类
Dec 20 PHP
PHP下载远程图片并保存到本地方法总结
Jan 22 PHP
微信支付开发交易通知实例
Jul 12 PHP
Zend Framework分发器用法示例
Dec 11 PHP
thinkPHP微信分享接口JSSDK用法实例
Jul 07 PHP
PHP使用curl_multi实现并发请求的方法示例
Apr 29 PHP
workerman结合laravel开发在线聊天应用的示例代码
Oct 30 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高级编程-函数-郑阿奇
2011/07/04 PHP
php中explode与split的区别介绍
2012/10/03 PHP
一个简单的php MVC留言本实例代码(必看篇)
2016/09/22 PHP
学习ExtJS(二) Button常用方法
2009/10/07 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
2014/04/12 Javascript
javascript实现一个数值加法函数
2015/06/26 Javascript
jquery判断复选框是否选中进行答题提示特效
2015/12/10 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
详解基于webpack搭建react运行环境
2017/06/01 Javascript
初探JavaScript 面向对象(推荐)
2017/09/03 Javascript
vue实现引入本地json的方法分析
2018/07/12 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
详解微信小程序支付流程与梳理
2019/07/16 Javascript
vue3.0 加载json的方法(非ajax)
2020/10/26 Javascript
python使用PyV8执行javascript代码示例分享
2013/12/04 Python
python抓取网页内容示例分享
2014/02/24 Python
python实现比较文件内容异同
2018/06/22 Python
Python模块的加载讲解
2019/01/15 Python
使用python实现简单五子棋游戏
2019/06/18 Python
Python自定义一个异常类的方法
2019/06/27 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
2020/05/22 Python
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
init进程的作用
2015/08/20 面试题
介绍一下EJB的体系结构
2012/08/01 面试题
J2EE相关知识面试题
2013/08/26 面试题
七年级地理教学反思
2014/01/26 职场文书
雷人标语集锦
2014/06/19 职场文书
励志演讲稿大全
2014/08/21 职场文书
学校党员个人问题整改措施思想汇报
2014/10/08 职场文书
校长师德表现自我评价
2015/03/04 职场文书
销售员自我评价
2015/03/11 职场文书
银行文明优质服务培训心得体会
2016/01/09 职场文书
2016党风廉政建设心得体会范文
2016/01/25 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
为什么node.js不适合大型项目
2021/04/28 Javascript
彻底理解golang中什么是nil
2021/04/29 Golang