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 相关文章推荐
adodb与adodb_lite之比较
Dec 31 PHP
php gzip压缩输出的实现方法
Apr 27 PHP
php使用curl访问https示例分享
Jan 17 PHP
php 邮件发送问题解决
Mar 22 PHP
PHP扩展程序实现守护进程
Apr 16 PHP
php使用指定字符列表生成随机字符串的方法
Apr 18 PHP
PHP实现HTML页面静态化的方法
Nov 04 PHP
PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析
Apr 20 PHP
PHP输出Excel PHPExcel的方法
Jul 26 PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 PHP
thinkphp5框架扩展redis类方法示例
May 06 PHP
Laravel timestamps 设置为unix时间戳的方法
Oct 11 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
PHP 数组和字符串互相转换实现方法
2013/03/26 PHP
解析PHP中如何将数组变量写入文件
2013/06/06 PHP
codeigniter上传图片不能正确识别图片类型问题解决方法
2014/07/25 PHP
PHP图形操作之Jpgraph学习笔记
2015/12/25 PHP
Laravel手动返回错误码示例
2019/10/22 PHP
accesskey 提交
2006/06/26 Javascript
静态页面的值传递(三部曲)
2006/09/25 Javascript
网站被黑的假象--ARP欺骗之页面中加入一段js
2007/05/16 Javascript
[原创]站长必须要知道的javascript广告代码
2007/05/30 Javascript
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
ECMAScript6函数默认参数
2015/06/12 Javascript
jQuery插件扩展操作入门示例
2017/01/16 Javascript
JS实现手写parseInt的方法示例
2017/09/24 Javascript
vue实现模态框的通用写法推荐
2018/02/26 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
[03:02]辉夜杯主赛事第二日 每日之星
2015/12/27 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
对pandas中两种数据类型Series和DataFrame的区别详解
2018/11/12 Python
itchat-python搭建微信机器人(附示例)
2019/06/11 Python
pytorch 实现在预训练模型的 input上增减通道
2020/01/06 Python
selenium切换标签页解决get超时问题的完整代码
2020/08/30 Python
复古服装:RetroStage
2019/05/10 全球购物
编写函数,将一个3*3矩阵转置
2013/10/09 面试题
趣味游戏活动方案
2014/02/07 职场文书
市级青年文明号申报材料
2014/05/26 职场文书
2014年小学体育工作总结
2014/12/11 职场文书
后进生评语大全
2015/01/04 职场文书
贪污检举信范文
2015/03/02 职场文书
2015年学校总务处工作总结
2015/05/19 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
MySQL数据管理操作示例讲解
2022/12/24 MySQL