PHP实现重载的常用方法实例详解


Posted in PHP onOctober 18, 2017

本文实例讲述了PHP实现重载的常用方法。分享给大家供大家参考,具体如下:

php是弱类型语言,并没有像JAVA这种强类型语言一样有重载。

重载一般来说就是拥有相同的函数名或方法名,但是参数列表却不同(包括参数个数和参数类型)

从这个定义来说,php是没有重载的,因为php不允许存在相同的函数名。

但是没有并不意味着不能实现。

php有四种机制可以实现重载:(下面用java进行对比)

1. 弱类型,无需定义变量类型

先举一个JAVA重载的例子:

class demo
{
  public static void main (String[] args)
  {
    sum(1,1);//2
    sum(1,1.5);//2.5
    sum(1.5,1.5);//3.0
  }
  public static void sum(int var1,int var2){
      System.out.println(var1+var2);
  }
  public static void sum(int var1,double var2){
      System.out.println(var1+var2);
  }
  public static void sum(double var1,double var2){
      System.out.println(var1+var2);
  }
}

上面的代码如果用php语言实现:

<?php
function sum($var1,$var2){
  echo $var1+$var2;
}
sum(1,1);//2
sum(1,1.5);//2.5
sum(1.5,1.5);//3
?>

2. 可选参数,允许变量设置默认值

JAVA重载例子:

class demo
{
  public static void main (String[] args)
  {
    sum(1,2);//3
    sum(1,2,3);//6
  }
  public static void sum(int var1,int var2){
      System.out.println(var1+var2);
  }
  public static void sum(int var1,int var2,int var3){
      System.out.println(var1+var2+var3);
  }
}

用php可选参数特性实现:

<?php
function sum($var1,$var2,$var3=NULL){//$var3设置默认值
  echo $var1+$var2+$var3;
}
sum(1,2);//2
sum(1,2,3);//2.5
?>

可以看到同样的功能,但是php这种弱类型语言实现起来更简单

3. 可变参数

主要用到以下两个函数:

func_num_args() 返回函数的参数个数
func_get_args() 返回一个包含函数参数列表的数组

具体实现方式:

<?php
class demo{
  public function method(){
    $numargs = func_num_args();//获得参数数量
    $args = func_get_args();//获得参数数组
    switch ($numargs) {//通过变量个数来确定调用哪个方法
      case 2:
        $this->method2($args[0],$args[1]);
        break;
      case 3:
        $this->method3($args[0],$args[1],$args[2]);
        break;
    }
  }
  private function method2($var1,$var2){
    #code...
  }
  private function method3($var1,$var2,$var3){
    #code...
  }
}
//调用
$obj = new demo();
$obj->method('var1','var2');
$obj->method('var1','var2','var3');
//看起来似乎通过一个接口调用
//但其实内部已经调用了各自定义的方法
?>

4. 使用魔术方法 __call()

public mixed __call ( string $name , array $arguments )

在对象中调用一个不可访问的方法时,__call()会被自动调用

$name参数是要调用的方法名称 $argument参数是被调用方法的参数数组

具体实现方式类似上面的第三要点:

<?php
class demo{
  public function __call($name,$arguments){
    if($name == "method"){
      switch (count($arguments)) {//获得参数数组个数
        case 2:
          $this->method2($args[0],$args[1]);
          break;
        case 3:
          $this->method3($args[0],$args[1],$args[2]);
          break;
      }
    }
  }
  private function method2($var1,$var2){
    #code...
  }
  private function method3($var1,$var2,$var3){
    #code...
  }
}
//调用
$obj = new demo();
$obj->method("var1","var2");
$obj->method("var1","var2","var3");
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
PHP中实现汉字转区位码应用源码实例解析
Jun 14 PHP
简单的php文件上传(实例)
Oct 27 PHP
PHP实现使用优酷土豆视频地址获取swf播放器分享地址
Jun 05 PHP
微信开发之网页授权获取用户信息(二)
Jan 08 PHP
Yii rules常用规则示例
Mar 15 PHP
PHP 5.6.11中CURL模块问题的解决方法
Aug 08 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
PHP获取中国时间(上海时区时间)及美国时间的方法
Feb 23 PHP
PHP中ltrim()函数的用法与实例讲解
Mar 28 PHP
用PHP做了一个领取优惠券活动的示例代码
Jul 05 PHP
Mac M1安装mnmp (Mac+Nginx+MySQL+PHP) 开发环境
Mar 29 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 #PHP
PHP二维关联数组的遍历方式(实例讲解)
Oct 18 #PHP
php中各种定义变量的方法小结
Oct 18 #PHP
php 算法之实现相对路径的实例
Oct 17 #PHP
php 二维数组快速排序算法的实现代码
Oct 17 #PHP
php 数据结构之链表队列
Oct 17 #PHP
PHP实现的贪婪算法实例
Oct 17 #PHP
You might like
Oracle Faq(Oracle的版本)
2006/10/09 PHP
php面向对象全攻略 (十一)__toString()用法 克隆对象 __call处理调用错误
2009/09/30 PHP
php实现singleton()单例模式实例
2014/11/06 PHP
UTF-8正则表达式如何匹配汉字
2015/08/03 PHP
thinkPHP下ueditor的使用方法详解
2015/12/26 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
Document 对象的常用方法
2009/07/31 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
javascript实现秒表计时器的制作方法
2017/02/16 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
NodeJS 实现多语言的示例代码
2018/09/11 NodeJs
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
微信小程序自定义底部导航带跳转功能
2018/11/27 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
JavaScript实现单图片上传并预览功能
2019/09/30 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
vue将文件/图片批量打包下载zip的教程
2020/10/21 Javascript
[02:30]DOTA2英雄基础教程 暗影恶魔
2013/12/17 DOTA
Python数据类型详解(四)字典:dict
2016/05/12 Python
Python画图学习入门教程
2016/07/01 Python
Python标准库sched模块使用指南
2017/07/06 Python
Python input函数使用实例解析
2019/11/22 Python
音频处理 windows10下python三方库librosa安装教程
2020/06/20 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
2020/08/27 Python
HTML5拖放API实现自动生成相框功能
2020/04/07 HTML / CSS
JVM是一个编译程序还是解释程序
2012/09/11 面试题
科级干部考察材料
2014/02/15 职场文书
保险经纪人求职信
2014/03/11 职场文书
节能减耗标语
2014/06/21 职场文书
商场租赁意向书
2014/07/30 职场文书
教师自我剖析材料(四风问题)
2014/09/30 职场文书
2015年个人自我剖析材料
2014/12/29 职场文书
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang
golang使用map实现去除重复数组
2022/04/14 Golang
mysql使用FIND_IN_SET和group_concat两个方法查询上下级机构
2022/04/20 MySQL