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 相关文章推荐
xajax写的留言本
Nov 25 PHP
浅析php与数据库代码开发规范
Aug 08 PHP
php中动态修改ini配置
Oct 14 PHP
php实现获取文章内容第一张图片的方法
Nov 04 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
Nov 05 PHP
[原创]php求圆周率的简单实现方法
May 30 PHP
PHP表单数据写入MySQL数据库的代码
May 31 PHP
thinkPHP模板中for循环与switch语句用法示例
Nov 30 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
PHP中md5()函数的用法讲解
Mar 30 PHP
php pdo连接数据库操作示例
Nov 18 PHP
php与阿里云短信接口接入操作案例分析
May 27 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面向对象之多态
2014/08/20 PHP
PHP实现加密的几种方式介绍
2015/02/22 PHP
Laravel使用模型实现like模糊查询的例子
2019/10/24 PHP
PHP程序员简单的开展服务治理架构操作详解(一)
2020/05/14 PHP
5 cool javascript apps
2007/03/24 Javascript
IE与firefox下Dhtml的一些区别小结
2009/12/02 Javascript
Javascript 面试题随笔
2011/03/31 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
JavaScript简单下拉菜单特效
2016/09/13 Javascript
利用React Router4实现的服务端直出渲染(SSR)
2019/01/07 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
Javascript查看大图功能代码实现
2020/05/07 Javascript
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
使用Python求解最大公约数的实现方法
2015/08/20 Python
python开发之thread线程基础实例入门
2015/11/11 Python
Python实现的自定义多线程多进程类示例
2018/03/23 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
pyautogui自动化控制鼠标和键盘操作的步骤
2020/04/01 Python
PyCharm配置anaconda环境的步骤详解
2020/07/31 Python
Python实现京东抢秒杀功能
2021/01/25 Python
Oakley官网:运动太阳镜、雪镜和服装
2016/09/30 全球购物
如何配置、使用和清除Smarty缓存
2015/12/23 面试题
标准导师推荐信(医学类)
2013/10/28 职场文书
元旦晚会上单位领导演讲稿
2014/01/05 职场文书
小学校园活动策划
2014/01/30 职场文书
学校评语大全
2014/05/06 职场文书
老人节标语大全
2014/10/08 职场文书
财务会计岗位职责
2015/02/03 职场文书
新闻报道稿范文
2015/07/23 职场文书
送给客户微信问候语!
2019/07/04 职场文书
新学期新寄语,献给新生们!
2019/11/15 职场文书
mybatis3中@SelectProvider传递参数方式
2021/08/04 Java/Android
python基础之类方法和静态方法
2021/10/24 Python
【海涛解说】pis亲自推荐,其实你从来不会玩NW
2022/04/01 DOTA
Jmerte 分布式压测及分布式压测配置
2022/04/30 Java/Android