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 相关文章推荐
强烈推荐:php.ini中文版(2)
Oct 09 PHP
数据库查询记录php 多行多列显示
Aug 15 PHP
服务器web工具 php环境下
Dec 29 PHP
PHP学习笔记之二
Jan 17 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
php中smarty实现多模版网站的方法
Jun 11 PHP
使用PHP实现微信摇一摇周边红包
Jan 04 PHP
php中的常用魔术方法汇总
Feb 14 PHP
PHP实现文件上传下载实例
Oct 18 PHP
php实现异步将远程链接上内容(图片或内容)写到本地的方法
Nov 30 PHP
详解PHP Swoole与TCP三次握手
May 27 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
php4的session功能评述(二)
2006/10/09 PHP
PHP 透明水印生成代码
2012/08/27 PHP
PHP实现的曲线统计图表示例
2016/11/10 PHP
php 删除指定文件夹的实例讲解
2017/07/25 PHP
PHP使用递归按层级查找数据的方法
2019/11/10 PHP
用JavaScript编写COM组件的步骤
2009/03/17 Javascript
JQuery实现倒计时按钮的实现代码
2012/03/23 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
构造函数+原型模式构造js自定义对象(最通用)
2014/05/12 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
web打印小结
2017/01/11 Javascript
vue模板语法-插值详解
2017/03/06 Javascript
详解Vue2.0之去掉组件click事件的native修饰
2017/04/20 Javascript
阿里大于短信验证码node koa2的实现代码(最新)
2017/09/07 Javascript
解决layer弹层遮罩挡住窗体的问题
2018/08/17 Javascript
angular 未登录状态拦截路由跳转的方法
2018/10/09 Javascript
小程序实现录音上传功能
2019/11/22 Javascript
ant-design-vue 实现表格内部字段验证功能
2019/12/16 Javascript
浅谈TypeScript的类型保护机制
2020/02/23 Javascript
[57:28]2018DOTA2亚洲邀请赛 4.6 淘汰赛 TNC vs Liquid 第一场
2018/04/10 DOTA
[54:15]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第二场2月1日
2021/03/11 DOTA
深入解析Python中的集合类型操作符
2015/08/19 Python
Python中常见的数据类型小结
2015/08/29 Python
Python 递归函数详解及实例
2016/12/27 Python
Python 3.6 读取并操作文件内容的实例
2018/04/23 Python
Python3变量与基本数据类型用法实例分析
2020/02/14 Python
Python3爬虫中Splash的知识总结
2020/07/10 Python
英国领先的奢侈品零售商之一:CRUISE
2016/12/02 全球购物
建筑专业自荐信范文
2014/01/05 职场文书
教学改革实施方案
2014/03/31 职场文书
小学班干部竞选演讲稿
2014/04/24 职场文书
2014年九一八事变演讲稿
2014/09/14 职场文书
公安民警正风肃纪剖析材料
2014/10/10 职场文书
教师读书笔记
2015/06/29 职场文书
教你一步步实现一个简易promise
2021/11/02 Javascript