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 相关文章推荐
PHP4中session登录页面的应用
Jul 25 PHP
Uchome1.2 1.5 代码学习 common.php
Apr 24 PHP
简单PHP上传图片、删除图片实现代码
May 12 PHP
PHP开发的一些注意点总结
Oct 12 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
Mar 17 PHP
php网页版聊天软件实现代码
Aug 12 PHP
php preg_match的匹配不同国家语言实例
Dec 29 PHP
PHP开发中csrf攻击的简单演示和防范
May 07 PHP
Laravel框架集成UEditor编辑器的方法图文与实例详解
Apr 17 PHP
laravel 解决paginate查询多个字段报错的问题
Oct 22 PHP
php array 转json及java 转换 json数据格式操作示例
Nov 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程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
PHP安装memcached扩展笔记
2015/05/28 PHP
Yii框架实现图片上传的方法详解
2017/05/20 PHP
vue-cli中的webpack配置详解
2017/09/25 Javascript
浅谈如何使用 webpack 优化资源
2017/10/20 Javascript
create-react-app 修改为多入口编译的方法
2018/08/01 Javascript
vue将后台数据时间戳转换成日期格式
2019/07/31 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
Python实现的Google IP 可用性检测脚本
2015/04/23 Python
python遍历小写英文字母的方法
2019/01/02 Python
Python批量修改图片分辨率的实例代码
2019/07/04 Python
Python 多线程其他属性以及继承Thread类详解
2019/08/28 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
kafka监控获取指定topic的消息总量示例
2019/12/23 Python
python匿名函数lambda原理及实例解析
2020/02/07 Python
Python如何实现爬取B站视频
2020/05/20 Python
Python如何测试stdout输出
2020/08/10 Python
微信html5页面调用第三方位置导航的示例
2018/03/14 HTML / CSS
韩国家庭购物网上商店:Nsmall
2017/05/07 全球购物
土耳其时尚购物网站:Morhipo
2017/09/04 全球购物
英国异国风情旅游网站:Travel Talk Tours(团体旅游、探险旅游、帆船假期)
2018/07/26 全球购物
美国和加拿大计算机和电子产品购物网站:TigerDirect.com
2019/09/13 全球购物
NYX Professional Makeup俄罗斯官网:世界知名的化妆品品牌
2019/12/26 全球购物
德国消费电子产品购物网站:Guter Kauf
2020/09/15 全球购物
路德维希•贝克(LUDWIG BECK)中文官网:德国大型美妆百货
2020/09/19 全球购物
优秀员工年终发言演讲稿
2014/01/01 职场文书
优秀学生评语大全
2014/04/25 职场文书
小学安全工作汇报材料
2014/08/19 职场文书
安全月宣传标语
2014/10/07 职场文书
2014年就业工作总结
2014/11/26 职场文书
运动会闭幕词
2015/01/28 职场文书
财务部岗位职责范本
2015/04/14 职场文书
小学三年级班主任工作经验交流材料
2015/11/02 职场文书
JVM上高性能数据格式库包Apache Arrow入门和架构详解(Gkatziouras)
2021/05/26 Servers
PHP实现两种排课方式
2021/06/26 PHP