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中3des加密代码(完全与.net中的兼容)
Aug 02 PHP
LotusPhp笔记之:基于ObjectUtil组件的使用分析
May 06 PHP
php的memcache类分享(memcache队列)
Mar 26 PHP
浅谈PDO的rowCount函数
Jun 18 PHP
php强制用户转向www域名的方法
Jun 19 PHP
Symfony2学习笔记之插件格式分析
Mar 17 PHP
PHP Yaf框架的简单安装使用教程(推荐)
Jun 08 PHP
注意!PHP 7中不要做的10件事
Sep 18 PHP
thinkPHP框架实现的简单计算器示例
Dec 07 PHP
PHP获取访问设备信息的方法示例
Feb 20 PHP
thinkphp3.2框架中where条件查询用法总结
Aug 13 PHP
详解thinkphp的Auth类认证
May 28 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批量生成缩略图的代码
2008/07/19 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
解决安装WampServer时提示缺少msvcr110.dll文件的问题
2017/07/09 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
PHP流Streams、包装器wrapper概念与用法实例详解
2017/11/17 PHP
filemanage功能中用到的lib.js
2007/04/08 Javascript
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
AngularJS中的模块详解
2015/01/29 Javascript
JS代码随机生成姓名、手机号、身份证号、银行卡号
2016/04/27 Javascript
js仿淘宝和百度文库的评分功能
2016/05/15 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
微信小程序 使用picker封装省市区三级联动实例代码
2016/10/28 Javascript
理解javascript async的用法
2017/08/22 Javascript
vue项目中添加单元测试的方法
2018/07/21 Javascript
在vue 中使用 less的教程详解
2018/09/26 Javascript
Node.js如何对SQLite的async/await封装详解
2019/02/14 Javascript
javascript canvas API内容整理
2020/02/16 Javascript
Vue仿Bibibili首页的问题
2021/01/21 Vue.js
linux环境下安装pyramid和新建项目的步骤
2013/11/27 Python
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
使用numpngw和matplotlib生成png动画的示例代码
2021/01/24 Python
浅析HTML5 meta viewport参数
2020/10/28 HTML / CSS
西尔斯百货官网:Sears
2016/09/06 全球购物
澳大利亚第一的设计师礼服租赁网站:GlamCorner
2017/08/13 全球购物
Annoushka英国官网:英国奢侈珠宝品牌
2018/10/20 全球购物
我的求职计划书
2014/01/10 职场文书
小学生国庆65周年演讲稿范文(2篇)
2014/09/21 职场文书
2014年教师思想工作总结
2014/12/03 职场文书
财政局个人年终总结
2015/03/03 职场文书
电力安全学习心得体会
2016/01/18 职场文书
PyMongo 查询数据的实现
2021/06/28 Python
Python内置的数据类型及使用方法
2022/04/13 Python
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL