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 相关文章推荐
同时提取多条新闻中的文本一例
Oct 09 PHP
第十二节--类的自动加载
Nov 16 PHP
php排序算法(冒泡排序,快速排序)
Oct 09 PHP
PHP运行环境配置与开发环境的配置(图文教程)
Jun 04 PHP
php中函数前加&amp;符号的作用分解
Jul 08 PHP
php实现的发送带附件邮件类实例
Sep 22 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
Nov 19 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
使用PHP生成图片的缩略图的方法
Aug 18 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP实现图片的等比缩放和Logo水印功能示例
May 04 PHP
PHP7扩展开发教程之Hello World实现方法示例
Aug 03 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
如何在PHP中使用Oracle数据库(2)
2006/10/09 PHP
php fckeditor 调用的函数
2009/06/21 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
php 发送带附件邮件示例
2014/01/23 PHP
PHP中两个float(浮点数)比较实例分析
2015/09/27 PHP
php 参数过滤、数据过滤详解
2015/10/26 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
2020/03/02 PHP
做网页的一些技巧(续)
2007/02/01 Javascript
jQuery旋转插件—rotate支持(ie/Firefox/SafariOpera/Chrome)
2013/01/16 Javascript
js 将json字符串转换为json对象的方法解析
2013/11/13 Javascript
js实现select跳转功能代码
2014/10/22 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
基于jquery编写的放大镜插件
2016/03/23 Javascript
JS实现“隐藏与显示”功能(多种方法)
2016/11/24 Javascript
JS高级运动实例分析
2016/12/20 Javascript
认识less和webstrom的less配置方法
2017/08/02 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
Bootstrap Table 搜索框和查询功能
2017/11/30 Javascript
微信小程序wx.previewImage预览图片实例详解
2017/12/07 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
微信小程序实现上传图片裁剪图片过程解析
2019/08/22 Javascript
js实现开关灯效果
2020/03/30 Javascript
vue 开发之路由配置方法详解
2019/12/02 Javascript
JQuery常用选择器功能与用法实例分析
2019/12/23 jQuery
详解Node.js使用token进行认证的简单示例
2020/05/25 Javascript
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
Python使用Shelve保存对象方法总结
2019/01/28 Python
python多线程并发实例及其优化
2019/06/27 Python
解决paramiko执行命令超时的问题
2020/04/16 Python
求职信写作要突出重点
2014/01/01 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
正风肃纪剖析材料
2014/09/30 职场文书
ORACLE查看当前账号的相关信息
2021/06/18 Oracle
springboot为异步任务规划自定义线程池的实现
2022/06/14 Java/Android