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 相关文章推荐
在apache下限制每个虚拟主机的并发数!!!!
Oct 09 PHP
PHP开发入门教程之面向对象
Dec 05 PHP
PHP中PDO基础教程 入门级
Sep 04 PHP
php获取文章上一页与下一页的方法
Dec 01 PHP
php获取数组元素中头一个数组元素值的实现方法
Dec 20 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
smarty模板判断数组为空的方法
Jun 10 PHP
php发送html格式文本邮件的方法
Jun 10 PHP
PHP按指定键值对二维数组进行排序的方法
Dec 22 PHP
Symfony核心类概述
Mar 17 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
PHP基础之输出缓冲区基本概念、原理分析
Jun 19 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
使用 php4 加速 web 传输
2006/10/09 PHP
老生常谈php 正则中的i,m,s,x,e分别表示什么
2017/03/02 PHP
js原生appendChild的bug解决心得分享
2013/07/01 Javascript
jQuery实现可高亮显示的二级CSS菜单效果
2015/09/01 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
JS实现弹出居中的模式窗口示例
2016/06/20 Javascript
极力推荐10个短小实用的JavaScript代码段
2016/08/03 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
学习vue.js计算属性
2016/12/03 Javascript
JS表单数据验证的正则表达式(常用)
2017/02/18 Javascript
jquery网页加载进度条的实现
2017/06/01 jQuery
常见的浏览器Hack技巧整理
2017/06/29 Javascript
JS使用贪心算法解决找零问题示例
2017/11/27 Javascript
Nodejs中使用puppeteer控制浏览器中视频播放功能
2019/08/26 NodeJs
vue解决使用$http获取数据时报错的问题
2019/10/30 Javascript
解决qrcode.js生成二维码时必须定义一个空div的问题
2020/07/09 Javascript
JS绘图Flot如何实现可选显示曲线图功能
2020/10/16 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
python发送邮件的实例代码(支持html、图片、附件)
2013/03/04 Python
对于Python异常处理慎用“except:pass”建议
2015/04/02 Python
浅谈Python爬取网页的编码处理
2016/11/04 Python
python读取与写入csv格式文件的示例代码
2017/12/16 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
pytorch实现Tensor变量之间的转换
2020/02/17 Python
PyQt5+python3+pycharm开发环境配置教程
2020/03/24 Python
快速实现一个简单的canvas迷宫游戏的示例
2018/07/04 HTML / CSS
Mountain Hardwear官网:攀岩服装和户外装备
2019/09/26 全球购物
写自荐信要注意什么
2013/12/26 职场文书
幼儿园教师岗位职责
2014/03/17 职场文书
大四优秀党员个人民主评议
2014/09/19 职场文书
机关作风建设工作总结
2014/10/23 职场文书
党校学习个人总结
2015/02/15 职场文书
《亲亲我的妈妈》观后感(3篇)
2019/09/26 职场文书
Vue实现导入Excel功能步骤详解
2021/07/03 Vue.js
Python集合set()使用的方法详解
2022/03/18 Python
在Docker容器中部署SQL Server
2022/04/11 Servers