PHP面向对象程序设计模拟一般面向对象语言中的方法重载(overload)示例


Posted in PHP onJune 13, 2019

本文实例讲述了PHP模拟一般面向对象语言中的方法重载(overload)。分享给大家供大家参考,具体如下:

在一般的面向对象设计语言(如C++,Java)中的方法重载就是定义相同的方法名,通过“参数的个数”不同或“参数的类型”不同,来访问我们的相同方法名的不同方法。但是PHP 中,方法是不能重载的,因为PHP 是弱类型的语言,所以在方法的参数中本身就可以接收不同类型的数据,又因为PHP 的方法可以接收不定个数的参数,所以通过传递不同个数的参数调用不相同方法名的不同方法也是不成立的。所以在PHP 里面没有传统上的重载(overload)方法,但由于php其灵活性,可以模拟一般面向对象语言中的重载方法。

在PHP中模拟一般面向对象语言中的方法重载(overload)

首先来看一个例子:

<?php
/*
重写/覆盖 override 指:子类重写了父类的同名方法
重载: overload 指:存在多个同名方法,但参数类型/个数不同. 传不同的参数,调用不同的方法。
但是在PHP中,不允许存在多个同名方法。 因此,不能够完成java,c++中的这种重载。
但是,PHP的灵活,能达到类似的效果
*/
//在PHP中模拟重载的方法
class Calc {
  public function area() {  //求面积
    // 判断一个调用area时,得到的参数个数
    $args = func_get_args();
    if(count($args) == 1) {  //只有一个参数
      return 3.14 * $args[0] * $args[0];  //求圆的面积
    } else if(count($args) == 2) {  //有2个参数
      return $args[0] * $args[1];  //求矩形的面积
    } else {
      return '未知图形';
    }
  }
}
$calc = new Calc();
// 计算圆的面积
echo $calc->area(10),'<br />';
// 计算矩形的面积
echo $calc->area(5,8);
?>

运行结果:

314
40

利用PHP的重载(overloading)技术,实现一般面向对象语言中的方法重载(overload)

下面的例子是利用利用PHP的重载(overloading)技术,使用魔术方法,来实现传统上的方法重载(overload)。

关于PHP中的重载技术,请参考:PHP面向对象_重载(overloading)

例子:

<?php
/*
目标:设计一个类,这个类的实例,可以实现如下需求:
调用方法f1:
传入1个参数,就返回其本身,
传入2个参数,就求其平方和,
传入3个参数,就求其立方和,
其他参数形式,会报错!
*/
class A{
  //这是一个魔术方法,在A的对象调用不存在的方法时
  //会被自动调用来应对这种情况
  function __call($Func_name, $argument){
    //使用f1不存在的情况
    if($Func_name === 'f1'){
      $len = count($argument); //获得实参的个数
      if($len<1 || $len>3){
        trigger_error("参数数量有误!", E_USER_ERROR);
      }else if($len == 1){
        return $argument[0];
      }else if($len == 2){
        return $argument[0]*$argument[0] + $argument[1]*$argument[1];
      }else if($len == 3){
        $v1 = $argument[0];
        $v2 = $argument[1];
        $v3 = $argument[2];
        return $v1*$v1*$v1 + pow($v2, 3) + pow($v3, 3);
      }
    }else if($Func_name === 'f2'){ //另一个不存在的方法
    }else if($Func_name === 'f3'){ //......
    }
  }
}
$a = new A();
$v1 = $a->f1(1);
$v2 = $a->f1(2,3);
$v3 = $a->f1(4,5,6);
echo "v1= $v1, v2 = $v2, v3 = $v3";
?>

运行结果为:

v1= 1, v2 = 13, v3 = 405

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP中读写文件实现代码
Oct 20 PHP
md5 16位二进制与32位字符串相互转换示例
Dec 30 PHP
thinkphp验证码显示不出来的解决方法
Mar 29 PHP
PHP调用MySQL存储过程并返回值的方法
Dec 26 PHP
php+mysql实现的二级联动菜单效果详解
May 10 PHP
PHP识别二维码的方法(php-zbarcode安装与使用)
Jul 07 PHP
一个简单的php MVC留言本实例代码(必看篇)
Sep 22 PHP
浅谈PHP中静态方法和非静态方法的相互调用
Oct 04 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 PHP
PHP中上传文件打印错误错误类型分析
Apr 14 PHP
PHP sdk文档处理常用代码示例解析
Dec 09 PHP
php优化查询foreach代码实例讲解
Mar 24 PHP
PHP面向对象程序设计重载(overloading)操作详解
Jun 13 #PHP
PHP面向对象程序设计之构造方法和析构方法详解
Jun 13 #PHP
PHP Cli 模式设置进程名称的方法
Jun 12 #PHP
PHP面向对象程序设计之对象克隆clone和魔术方法__clone()用法分析
Jun 12 #PHP
PHP面向对象程序设计之对象的遍历操作示例
Jun 12 #PHP
PHP面向对象程序设计内置标准类,普通数据类型转为对象类型示例
Jun 12 #PHP
PHP下用Swoole实现Actor并发模型的方法
Jun 12 #PHP
You might like
《超神学院》霸气归来, 天使彦上演维多利亚的秘密
2020/03/02 国漫
php简单实现快速排序的方法
2015/04/04 PHP
laravel 去掉index.php伪静态的操作方法
2019/10/12 PHP
js css样式操作代码(批量操作)
2009/10/09 Javascript
Extjs入门之动态加载树代码
2010/04/09 Javascript
Firefox/Chrome/Safari的中可直接使用$/$$函数进行调试
2012/02/13 Javascript
IE6背景图片不缓存问题解决方案及图片使用策略多个方法小结
2012/05/14 Javascript
JavaScript中的this引用(推荐)
2016/08/05 Javascript
HTML5 canvas 9绘制图片实例详解
2016/09/06 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
轻松理解vue的双向数据绑定问题
2017/10/30 Javascript
微信小程序支付PHP代码
2018/08/23 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
vue中使用 pako.js 解密 gzip加密字符串的方法
2019/06/10 Javascript
js+canvas实现画板功能
2020/09/13 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
js实现星星海特效的示例
2020/09/28 Javascript
用Javascript实现发送短信验证码间隔功能
2021/02/08 Javascript
[04:50]DOTA2亚洲邀请赛小组赛第四日 TOP10精彩集锦
2015/02/02 DOTA
Python栈类实例分析
2015/06/15 Python
matplotlib 输出保存指定尺寸的图片方法
2018/05/24 Python
pycharm安装和首次使用教程
2018/08/27 Python
python3实现字符串操作的实例代码
2019/04/16 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
pygame实现飞机大战
2020/03/11 Python
PyCharm+Pipenv虚拟环境开发和依赖管理的教程详解
2020/04/16 Python
Pandas替换及部分替换(replace)实现流程详解
2020/10/12 Python
pycharm 关闭search everywhere的解决操作
2021/01/15 Python
基于Python-Pycharm实现的猴子摘桃小游戏(源代码)
2021/02/20 Python
Sunglasses Shop荷兰站:英国最大的太阳镜独立在线零售商和供应商
2017/01/08 全球购物
Hotels.com爱尔兰:全球酒店预订
2017/02/24 全球购物
VLAN和VPN有什么区别?分别实现在OSI的第几层?
2014/12/23 面试题
联谊会主持词
2014/03/26 职场文书
小组口号大全
2014/06/09 职场文书