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调用数据库的存贮过程
Oct 09 PHP
用PHP读取IMAP邮件
Oct 09 PHP
IIS6的PHP最佳配置方法
Mar 19 PHP
php 网页游戏开发入门教程一(webgame+design)
Oct 26 PHP
FirePHP 推荐一款PHP调试工具
Apr 23 PHP
PHP操作文件类的函数代码(文件和文件夹创建,复制,移动和删除)
Nov 10 PHP
PHP中鲜为人知的10个函数
Feb 28 PHP
解决Codeigniter不能上传rar和zip压缩包问题
Mar 07 PHP
PHP高手需要要掌握的知识点
Aug 21 PHP
php5.4传引用时报错问题分析
Jan 22 PHP
可兼容php5与php7的cURL文件上传功能实例分析
May 11 PHP
PHP读取文件或采集时解决中文乱码
Mar 09 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
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
PHP5 面向对象(学习记录)
2009/12/02 PHP
PHP冒泡排序算法代码详细解读
2011/07/17 PHP
php实现事件监听与触发的方法
2014/11/21 PHP
php判断str字符串是否是xml格式数据的方法示例
2017/07/26 PHP
基于jquery库的tab新形式使用
2012/11/16 Javascript
jQuery中使用Ajax获取JSON格式数据示例代码
2013/11/26 Javascript
jQuery获取URL请求参数的方法
2015/07/18 Javascript
js实现按钮颜色渐变动画效果
2015/08/20 Javascript
有趣的bootstrap走动进度条
2016/12/01 Javascript
浅析JavaScript中var that=this
2017/02/17 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
一步步教你利用Canvas对图片进行处理
2017/09/19 Javascript
vue中手机号,邮箱正则验证以及60s发送验证码的实例
2018/03/16 Javascript
AngularJs的UI组件ui-Bootstrap之Tooltip和Popover
2018/07/13 Javascript
Vue实现点击当前元素以外的地方隐藏当前元素(实现思路)
2019/12/04 Javascript
design vue 表格开启列排序的操作
2020/10/28 Javascript
Python自动登录126邮箱的方法
2015/07/10 Python
python中Matplotlib实现绘制3D图的示例代码
2017/09/04 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
python自定义函数实现一个数的三次方计算方法
2019/01/20 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
2020/01/02 Python
浅谈pandas.cut与pandas.qcut的使用方法及区别
2020/03/03 Python
python爬虫开发之Request模块从安装到详细使用方法与实例全解
2020/03/09 Python
python如何调用java类
2020/07/05 Python
Book Depository美国:全球领先的专业网上书店之一
2019/08/14 全球购物
俄罗斯香水和化妆品网上商店:NOTINO.ru
2019/12/17 全球购物
Python如何定义一个函数
2015/09/01 面试题
小学教育毕业生自荐信
2013/11/18 职场文书
旅游管理专业个人求职信范文
2013/12/24 职场文书
财务信息服务专业自荐书范文
2014/02/08 职场文书
道德模范先进事迹
2014/02/14 职场文书
教你使用Pandas直接核算Excel中快递费用
2021/05/12 Python
Mysql中有关Datetime和Timestamp的使用总结
2021/12/06 MySQL
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server
Redis基本数据类型Zset有序集合常用操作
2022/06/01 Redis