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 变量的定义方法
Jan 26 PHP
PHP调用Twitter的RSS的实现代码
Mar 10 PHP
PHP提取字符串中的图片地址[正则表达式]
Nov 12 PHP
深入解析fsockopen与pfsockopen的区别
Jul 05 PHP
php中return的用法实例分析
Feb 28 PHP
基于PHP技术开发客服工单系统
Jan 06 PHP
php一个文件搞定微信jssdk配置
Dec 12 PHP
PHP获取数组中指定的一列实例
Dec 27 PHP
PHP多线程模拟实现秒杀抢单
Feb 07 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 PHP
PHP vsprintf()函数格式化字符串操作原理解析
Jul 14 PHP
php慢查询日志和错误日志使用详解
Feb 27 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学习笔记 数组遍历实现代码
2011/06/09 PHP
PHP多例模式介绍
2013/06/24 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
php动态变量定义及使用
2015/06/10 PHP
php猜单词游戏
2015/09/29 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
详解thinkphp5+swoole实现异步邮件群发(SMTP方式)
2017/10/13 PHP
javascript的函数、创建对象、封装、属性和方法、继承
2011/03/10 Javascript
js实现在页面上弹出蒙板技巧简单实用
2013/04/16 Javascript
jQuery选择器中含有空格的使用示例及注意事项
2013/08/25 Javascript
使用POST方式弹出窗口的两种方法示例介绍
2014/01/29 Javascript
简述JavaScript中正则表达式的使用方法
2015/06/15 Javascript
jQuery.form.js插件不能解决连接超时(timeout)的原因分析及解决方法
2016/10/14 Javascript
JS自定义混合Mixin函数示例
2016/11/26 Javascript
利用nvm管理多个版本的node.js与npm详解
2017/11/02 Javascript
node使用promise替代回调函数
2018/05/07 Javascript
JS实现图片切换效果
2018/11/17 Javascript
JavaScript解析JSON数据示例
2019/07/16 Javascript
微信js-sdk 录音功能的示例代码
2019/11/01 Javascript
JavaScript TAB栏切换效果的示例
2020/11/05 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
python通过openpyxl生成Excel文件的方法
2015/05/12 Python
老生常谈Python序列化和反序列化
2017/06/28 Python
Python之文字转图片方法
2018/05/10 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
Keras使用tensorboard显示训练过程的实例
2020/02/15 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
Backcountry旗下的户外商品闪购网站:steep&cheap
2016/09/22 全球购物
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
澳大利亚厨房和家用电器购物网站:Bing Lee
2021/01/11 全球购物
工程造价专业大学生自荐信
2013/10/01 职场文书
企业人事任命书
2014/06/05 职场文书
推广普通话的宣传语
2015/07/13 职场文书
CSS3中Animation实现简单的手指点击动画的示例
2021/07/15 HTML / CSS
css3属性选择器 “~”(波浪号) “,”(逗号) “+”(加号)和 “>”(大于号)
2022/04/19 HTML / CSS