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 相关文章推荐
优化NFR之一 --MSSQL Hello Buffer Overflow
Oct 09 PHP
实现php加速的eAccelerator dll支持文件打包下载
Sep 30 PHP
实用函数9
Nov 08 PHP
批量修改RAR文件注释的php代码
Nov 20 PHP
php字符编码转换之gb2312转为utf8
Oct 28 PHP
php根据操作系统转换文件名大小写的方法
Feb 24 PHP
php环境无法上传文件的解决方法
Apr 30 PHP
PHP中使用substr()截取字符串出现中文乱码问题该怎么办
Oct 21 PHP
php中的登陆login实例代码
Jun 20 PHP
微信公众号开发客服接口实例代码
Oct 21 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
PHP检查网站是否宕机的方法示例
Jul 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
杏林同学录(六)
2006/10/09 PHP
PHP读取xml方法介绍
2013/01/12 PHP
php 文件下载 出现下载文件内容乱码损坏的解决方法(推荐)
2016/11/16 PHP
php中请求url的五种方法总结
2017/07/13 PHP
php 函数中静态变量使用的问题实例分析
2020/03/05 PHP
js之WEB开发调试利器:Firebug 下载
2007/01/13 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
js获取html参数及向swf传递参数应用介绍
2013/02/18 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
浅析nodejs实现Websocket的数据接收与发送
2015/11/19 NodeJs
jQuery+HTML5+CSS3制作支持响应式布局时间轴插件
2016/08/10 Javascript
AngularJS应用开发思维之依赖注入3
2016/08/19 Javascript
Three.js加载外部模型的教程详解
2017/11/10 Javascript
Angular实现的简单查询天气预报功能示例
2017/12/27 Javascript
获取layer.open弹出层的返回值方法
2018/08/20 Javascript
基于Angularjs-router动态改变Title值的问题
2018/08/30 Javascript
原生js实现each方法实例代码详解
2019/05/27 Javascript
js实现批量删除功能
2020/08/27 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
2020/09/09 Javascript
鸿蒙系统中的 JS 开发框架
2020/09/18 Javascript
JavaScript实现跟随鼠标移动的盒子
2021/01/28 Javascript
[01:19:23]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第二场
2018/04/06 DOTA
简单的Apache+FastCGI+Django配置指南
2015/07/22 Python
Python贪心算法实例小结
2018/04/22 Python
Python实现基于PIL和tesseract的验证码识别功能示例
2018/07/11 Python
Python实现的爬取小说爬虫功能示例
2019/03/30 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
校庆活动方案
2014/03/31 职场文书
师范生自荐信模板
2014/05/28 职场文书
我的中国梦演讲稿小学篇
2014/08/19 职场文书
大班上学期个人总结
2015/02/13 职场文书
详解Python描述符的工作原理
2021/06/11 Python
Golang使用Panic与Recover进行错误捕获
2022/03/22 Golang
深入理解mysql事务隔离级别和存储引擎
2022/04/12 MySQL
Redis基本数据类型String常用操作命令
2022/06/01 Redis