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 搜索框提示(自动完成)实例代码
Feb 05 PHP
PHP不用递归实现无限分级的例子分享
Apr 18 PHP
PHP遍历目录并返回统计目录大小
Jun 09 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
Jun 13 PHP
PHP面试题之文件目录操作
Oct 15 PHP
php三种实现多线程类似的方法
Oct 30 PHP
php实现微信发红包
Dec 05 PHP
PHP Header失效的原因分析及解决方法
Nov 16 PHP
PHP实现判断数组是一维、二维或几维的方法
Feb 06 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
PHP以json或xml格式返回请求数据的方法
May 31 PHP
Ubuntu 16.04中Laravel5.4升级到5.6的步骤
Dec 07 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日期时间运算汇总
2015/11/04 PHP
详解PHP使用日期时间处理器Carbon人性化显示时间
2017/08/10 PHP
javascript document.compatMode兼容性
2010/02/23 Javascript
JavaScript中的noscript元素属性位置及作用介绍
2013/04/11 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
jQuery实现渐变弹出层和弹出菜单的方法
2015/02/20 Javascript
JavaScript 实现完美兼容多浏览器的复制功能代码
2015/04/28 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
AngularJS 服务详细讲解及示例代码
2016/08/17 Javascript
javascript使用递归算法求两个数字组合功能示例
2017/01/03 Javascript
基于vue.js轮播组件vue-awesome-swiper实现轮播图
2017/03/17 Javascript
jQuery插件HighCharts绘制简单2D柱状图效果示例【附demo源码】
2017/03/21 jQuery
php 修改密码实现代码
2017/05/24 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
Angular实现的进度条功能示例
2018/02/18 Javascript
VUE2.0+Element-UI+Echarts封装的组件实例
2018/03/02 Javascript
layui table动态表头 改变表格头部 重新加载表格的方法
2019/09/21 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
vue全屏事件开发详解
2020/06/17 Javascript
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python 内置函数complex详解
2016/10/23 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
2018/08/01 Python
Python中logging.NullHandler 的使用教程
2018/11/29 Python
Python魔法方法功能与用法简介
2019/04/04 Python
Python CSV文件模块的使用案例分析
2019/12/21 Python
Python类和实例的属性机制原理详解
2020/03/21 Python
jupyter notebook参数化运行python方式
2020/04/10 Python
关于pycharm 切换 python3.9 报错 ‘HTMLParser‘ object has no attribute ‘unescape‘ 的问题
2020/11/24 Python
加拿大城市本地限时优惠:Buytopia.ca
2018/09/19 全球购物
网络体系结构及协议的定义
2014/03/13 面试题
勤俭节约倡议书
2014/04/14 职场文书
高三语文复习计划
2015/01/19 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
SQL Server中的游标介绍
2022/05/20 SQL Server
win10截图快捷键win+shift+s没有反应无法截图怎么解决?
2022/08/14 数码科技