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 相关文章推荐
sourcesafe管理phpproj文件的补充说明(downmoon)
Apr 11 PHP
PHP正确配置mysql(apache环境)
Aug 28 PHP
php数组函数序列之array_search()- 按元素值返回键名
Nov 04 PHP
php cookie中点号(句号)自动转为下划线问题
Oct 21 PHP
仿dedecms下拉分页样式修改的thinkphp分页类实例
Oct 30 PHP
php中mail函数发送邮件失败的解决方法
Dec 24 PHP
Zend Framework缓存Cache用法简单实例
Mar 19 PHP
PHP转换文本框内容为HTML格式的方法
Jul 20 PHP
Win10 下安装配置IIS + MySQL + nginx + php7.1.7
Aug 04 PHP
php-msf源码详解
Dec 25 PHP
thinkPHP5框架中widget的功能与用法详解
Jun 11 PHP
is_file和file_exists效率比较
Mar 14 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桌面中心(二) 数据库写入
2007/03/11 PHP
php加密算法之实现可逆加密算法和解密分享
2014/01/21 PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
2015/03/05 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
JQuery设置和去除disabled属性的5种方法总结
2013/05/16 Javascript
ExtJS自定义主题(theme)样式详解
2013/11/18 Javascript
Javascript实现返回上一页面并刷新的小例子
2013/12/11 Javascript
jQuery+css实现百度百科的页面导航效果
2014/12/16 Javascript
jQuery实现div横向拖拽排序的简单实例
2016/07/13 Javascript
全面解析Angular中$Apply()及$Digest()的区别
2016/08/04 Javascript
JavaScript数组操作函数汇总
2016/08/05 Javascript
Js得到radiobuttonlist选中值的两种方法(推荐)
2016/08/25 Javascript
微信小程序 闭包写法详细介绍
2016/12/14 Javascript
深入理解Vue2.x的虚拟DOM diff原理
2017/09/27 Javascript
vue项目中vue-i18n和element-ui国际化开发实现过程
2018/04/25 Javascript
vue2 设置router-view默认路径的实例
2018/09/20 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
python获取外网ip地址的方法总结
2015/07/02 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
python词云库wordCloud使用方法详解(解决中文乱码)
2020/02/17 Python
pandas数据选取:df[] df.loc[] df.iloc[] df.ix[] df.at[] df.iat[]
2020/04/24 Python
英国第一的滑雪服装和装备零售商:Snow+Rock
2020/02/01 全球购物
名词解释WEB SERVICE,SOAP,UDDI,WSDL,JAXP,JAXM;JSWDL开发包的介绍。
2012/10/27 面试题
幼儿园儿童节活动主持词+串词大全
2014/03/21 职场文书
中介业务员岗位职责
2014/04/09 职场文书
2014年党员承诺书范文
2014/05/20 职场文书
2016年优秀共产党员先进事迹材料
2016/02/29 职场文书
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers