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 相关文章推荐
用 PHP5 轻松解析 XML
Dec 04 PHP
php 操作数组(合并,拆分,追加,查找,删除等)
Jul 20 PHP
php给图片加文字水印
Jul 31 PHP
php生成带logo二维码方法小结
Apr 08 PHP
php好代码风格的阶段性总结
Jun 25 PHP
PHP对象链式操作实现原理分析
Oct 09 PHP
php 基础函数
Feb 10 PHP
PHP实现的文件上传类与用法详解
Jul 05 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
PHP网页安全认证的实例详解
Sep 28 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 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
Oracle 常见问题解答
2006/10/09 PHP
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
超级好用的一个php上传图片类(随机名,缩略图,加水印)
2010/06/30 PHP
PHP设计模式之模板方法模式实例浅析
2018/12/20 PHP
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
Jquery中获取iframe的代码
2011/01/11 Javascript
通过jQuery源码学习javascript(二)
2012/12/27 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
轻松实现js图片预览功能
2016/01/18 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
AngularJs表单校验功能实例代码
2017/02/09 Javascript
jQuery基于ajax实现页面加载后检查用户登录状态的方法
2017/02/10 Javascript
canvas实现刮刮卡效果
2017/03/14 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
layui 数据表格 根据值(1=业务,2=机构)显示中文名称示例
2019/10/26 Javascript
JS实现随机抽取三人
2019/11/06 Javascript
如何使用 JavaScript 操作浏览器历史记录 API
2020/11/24 Javascript
[07:20]2014DOTA2西雅图国际邀请赛 选手讲解积分赛第二天
2014/07/11 DOTA
python中学习K-Means和图片压缩
2017/11/20 Python
django模板结构优化的方法
2019/02/28 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
2019/06/26 Python
Django中提供的6种缓存方式详解
2019/08/05 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python属性和内建属性实例解析
2020/01/14 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
香港礼品网站:GiftU eshop
2017/09/01 全球购物
美国家居用品和厨具购物网站:DealsDot
2019/10/07 全球购物
机关道德讲堂实施方案
2014/03/15 职场文书
乔布斯斯坦福大学演讲稿
2014/05/23 职场文书
工会趣味活动方案
2014/08/18 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
如何书写公司员工保密协议?
2019/06/27 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
基于Python实现对比Exce的工具
2022/04/07 Python
spring IOC容器的Bean管理XML自动装配过程
2022/05/30 Java/Android