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动态生成静态HTML网页的代码
Mar 04 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
使用迭代器 遍历文件信息的详解
Jun 08 PHP
PHP Curl多线程原理实例详解
Nov 06 PHP
生成随机字符串和验证码的类的PHP实例
Dec 24 PHP
30个php操作redis常用方法代码例子
Jul 05 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
PHP整合PayPal支付
Jun 11 PHP
Linux php 中文乱码的快速解决方法
May 13 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
浅谈PHP接入(第三方登录)QQ登录 OAuth2.0 过程中遇到的坑
Oct 13 PHP
PHP单文件上传原理及上传函数的封装操作示例
Sep 02 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
PHP数组操作汇总 php数组的使用技巧
2011/07/17 PHP
CodeIgniter框架中_remap()使用方法2例
2014/03/10 PHP
PHP实现获取客户端IP并获取IP信息
2015/03/17 PHP
yii2利用自带UploadedFile实现上传图片的示例
2017/02/16 PHP
php实现微信模板消息推送
2018/03/30 PHP
wordpress之js库集合研究介绍
2007/08/17 Javascript
帮助避免错误的Javascript陷阱清单
2009/05/31 Javascript
js Date自定义函数 延迟脚本执行
2010/03/10 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
Javascript 字符串模板的简单实现
2016/02/13 Javascript
不定义JQuery插件 不要说会JQuery
2016/03/07 Javascript
彻底理解js面向对象之继承
2018/02/04 Javascript
vue实现点击当前标签高亮效果【推荐】
2018/06/22 Javascript
小程序实现列表多个批量倒计时
2021/01/29 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
js实现数据导出为EXCEL(支持大量数据导出)
2020/03/31 Javascript
vue项目中openlayers绘制行政区划
2020/12/24 Vue.js
json.stringify()与json.parse()的区别以及用处
2021/01/25 Javascript
[01:14]3.19DOTA2发布会 三代刀塔人第二代
2014/03/25 DOTA
Python实现从百度API获取天气的方法
2015/03/11 Python
python实现自动登录人人网并采集信息的方法
2015/06/28 Python
解决python3 urllib 链接中有中文的问题
2018/07/16 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
python模拟实现斗地主发牌
2020/01/07 Python
Python GUI编程学习笔记之tkinter事件绑定操作详解
2020/03/30 Python
CSS类名支持中文命名的示例
2014/04/04 HTML / CSS
施华洛世奇澳大利亚官网:SWAROVSKI澳大利亚
2017/01/06 全球购物
阿玛瑞酒店中文官方网站:Amari.com
2018/02/13 全球购物
如何开发安全的AJAX应用
2014/03/26 面试题
高中毕业典礼演讲稿
2014/09/09 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
篮球比赛通讯稿
2015/07/18 职场文书
中学总务处工作总结
2015/08/12 职场文书
导游带团欢迎词
2015/09/30 职场文书