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 相关文章推荐
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
Aug 12 PHP
php数组函数序列之prev() - 移动数组内部指针到上一个元素的位置,并返回该元素值
Oct 31 PHP
Linux下CoreSeek及PHP扩展模块的安装
Sep 23 PHP
Zend的MVC机制使用分析(二)
May 02 PHP
解析PHP中数组元素升序、降序以及重新排序的函数
Jun 20 PHP
php中操作memcached缓存进行增删改查数据的实现代码
Aug 15 PHP
PHP与MYSQL中UTF8 中文排序示例代码
Oct 23 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
PHP比较运算符的详细介绍
Sep 29 PHP
php上传图片生成缩略图(GD库)
Jan 06 PHP
php使用curl实现ftp文件下载功能
May 16 PHP
php如何比较两个浮点数是否相等详解
Feb 12 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解析json数据实例
2014/08/19 PHP
yii2局部关闭(开启)csrf的验证的实例代码
2017/07/10 PHP
PHP yield关键字功能与用法分析
2019/01/03 PHP
PHP实现字符串大小写转函数的功能实例
2019/02/06 PHP
Javascript 学习笔记 错误处理
2009/07/30 Javascript
jQuery 对Select的操作备忘记录
2011/07/04 Javascript
一款Jquery 分页插件的改造方法(服务器端分页)
2011/07/11 Javascript
JavaScript实现鼠标滑过图片变换效果的方法
2015/04/16 Javascript
JQuery实现左右滚动菜单特效
2015/09/28 Javascript
JCrop+ajaxUpload 图像切割上传的实例代码
2016/07/20 Javascript
JS 实现计算器详解及实例代码(一)
2017/01/08 Javascript
基于vue2框架的机器人自动回复mini-project实例代码
2017/06/13 Javascript
js拖动滑块和点击水波纹效果实例代码
2018/10/16 Javascript
vue-cli3+ts+webpack实现多入口多出口功能
2019/05/30 Javascript
Javascript节流函数throttle和防抖函数debounce
2020/12/03 Javascript
Python多线程和队列操作实例
2015/06/21 Python
python3抓取中文网页的方法
2015/07/28 Python
Python字典操作详细介绍及字典内建方法分享
2018/01/04 Python
Python简直是万能的,这5大主要用途你一定要知道!(推荐)
2019/04/03 Python
协程Python 中实现多任务耗资源最小的方式
2020/10/19 Python
python的dict判断key是否存在的方法
2020/12/09 Python
ziaja齐叶雅官方海外旗舰店:来自波兰的天然护肤品牌
2017/01/02 全球购物
澳大利亚领先的女帽及配饰公司:Morgan&Taylor
2019/12/01 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
《孔子拜师》教学反思
2014/02/24 职场文书
普通话演讲稿
2014/09/03 职场文书
2014个人年度工作总结
2014/12/15 职场文书
先进教师事迹材料
2014/12/16 职场文书
和谐家庭事迹材料
2014/12/20 职场文书
七一晚会主持词
2015/06/29 职场文书
副校长2015年教育教学工作总结
2015/07/27 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python
MySQL 发生同步延迟时Seconds_Behind_Master还为0的原因
2021/06/21 MySQL
POST提交数据常见的四种方式
2022/01/18 HTML / CSS