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开发中常用的8个小技巧
Aug 27 PHP
PHP+MySQL 手工注入语句大全 推荐
Oct 30 PHP
PHP中的按位与和按位或操作示例
Jan 27 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
Apr 01 PHP
PHP+jQuery 注册模块开发详解
Oct 14 PHP
php中print(),print_r(),echo()的区别详解
Dec 01 PHP
php调用mysql存储过程实例分析
Dec 29 PHP
你应该知道PHP浮点数知识
May 13 PHP
详解PHP数组赋值方法
Nov 07 PHP
thinkPHP实现基于ajax的评论回复功能
Jun 22 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
Laravel5.5 实现后台管理登录的方法(自定义用户表登录)
Sep 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中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
超小PHP小马小结(方便查找后门的朋友)
2012/05/05 PHP
php的array_multisort()使用方法介绍
2012/05/16 PHP
PHP四大安全策略
2014/03/12 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
2014/07/01 PHP
微信access_token的获取开发示例
2015/04/16 PHP
php操作access数据库的方法详解
2017/02/22 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
php字符串过滤strip_tags()函数用法实例分析
2019/06/24 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
从新浪弄下来的全屏广告代码 与使用说明
2007/03/15 Javascript
ExtJS4 Grid改变单元格背景颜色及Column render学习
2013/02/06 Javascript
javascript获取设置div的高度和宽度兼容任何浏览器
2013/09/22 Javascript
js动态获取子复选项并设计全选及提交的实现方法
2016/06/24 Javascript
jquery实现简单的瀑布流布局
2016/12/11 Javascript
浅谈super-vuex使用体验
2018/06/25 Javascript
JS通过位运算实现权限加解密
2018/08/14 Javascript
详解JSON.stringify()的5个秘密特性
2020/05/26 Javascript
JavaScript读取本地文件常用方法流程解析
2020/10/12 Javascript
[02:27]DOTA2英雄基础教程 莱恩
2014/01/17 DOTA
[41:11]完美世界DOTA2联赛PWL S2 Inki vs Magma 第一场 11.22
2020/11/24 DOTA
Python中的yield浅析
2014/06/16 Python
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Python双精度浮点数运算并分行显示操作示例
2017/07/21 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
解决pycharm 工具栏Tool中找不到Run manager.py Task的问题
2019/07/01 Python
如何在python中实现随机选择
2019/11/02 Python
Python递归函数特点及原理解析
2020/03/04 Python
Matplotlib中%matplotlib inline如何使用
2020/07/28 Python
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
白酒市场开发计划书
2014/01/09 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
机关作风整顿个人整改措施2014
2014/09/17 职场文书
银行客户经理培训心得体会
2016/01/09 职场文书
《观潮》教学反思
2016/02/17 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书