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 相关文章推荐
mysql5详细安装教程
Jan 15 PHP
简单介绍下 PHP5 中引入的 MYSQLI的用途
Mar 19 PHP
在同一窗体中使用PHP来处理多个提交任务
May 08 PHP
discuz7 phpMysql操作类
Jun 21 PHP
php中模拟POST传递数据的两种方法分享
Sep 16 PHP
基于php split()函数的用法详解
Jun 05 PHP
PHP中的闭包(匿名函数)浅析
Feb 07 PHP
php中关于socket的系列函数总结
May 18 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
php检查函数必传参数是否存在的实例详解
Aug 28 PHP
php和redis实现秒杀活动的流程
Jul 17 PHP
PHP生成zip压缩包的常用方法示例
Aug 22 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
建立文件交换功能的脚本(二)
2006/10/09 PHP
php数组应用之比较两个时间的相减排序
2008/08/18 PHP
PHP执行zip与rar解压缩方法实现代码
2010/12/05 PHP
PHP取整函数:ceil,floor,round,intval的区别详细解析
2013/08/31 PHP
php清空(删除)指定目录下的文件,不删除目录文件夹的实现代码
2014/09/04 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
PHP抽象类与接口的区别实例详解
2019/05/09 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
JS获取父节点方法
2009/08/20 Javascript
jquery 插件学习(一)
2012/08/06 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
js实现网页倒计时、网站已运行时间功能的代码3例
2014/04/14 Javascript
js和jquery分别验证单选框、复选框、下拉框
2015/12/17 Javascript
jQuery.parseHTML() 函数详解
2017/01/09 Javascript
vue插件vue-resource的使用笔记(小结)
2017/08/04 Javascript
基于Node.js模板引擎教程-jade速学与实战1
2017/09/17 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
关于Vue Router中路由守卫的应用及在全局导航守卫中检查元字段的方法
2018/12/09 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
Python自动化构建工具scons使用入门笔记
2015/03/10 Python
Python记录详细调用堆栈日志的方法
2015/05/05 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
Tensorflow卷积神经网络实例进阶
2018/05/24 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
基于Python执行dos命令并获取输出的结果
2019/12/30 Python
matlab中imadjust函数的作用及应用举例
2020/02/27 Python
用python实现名片管理系统
2020/06/18 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
2020/09/09 Python
HTML5 Canvas中使用用路径描画圆弧
2015/01/01 HTML / CSS
全球最大的中文旅行网站:去哪儿网
2017/11/16 全球购物
nohup的用法
2014/08/10 面试题
投资入股合作协议书
2014/10/28 职场文书
会计岗位职责
2015/02/03 职场文书
话题作文之生命的旋律
2019/12/17 职场文书
python tqdm用法及实例详解
2021/06/16 Python
MySQL8.0升级的踩坑历险记
2021/11/01 MySQL