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 ADODB使用方法集锦
Mar 25 PHP
从手册去理解分析PHP session机制
Jul 17 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
PHP curl 抓取AJAX异步内容示例
Sep 09 PHP
mac系统下为 php 添加 pcntl 扩展
Aug 28 PHP
php执行多个存储过程的方法【基于thinkPHP】
Nov 08 PHP
php微信开发之自定义菜单实现
Nov 18 PHP
php微信公众平台交互与接口详解
Nov 28 PHP
php利用ffmpeg提取视频中音频与视频画面的方法详解
Jun 07 PHP
laravel自定义分页效果
Jul 23 PHP
PHP实现QQ登录的开原理和实现过程
Feb 04 PHP
PhpSpreadsheet中文文档 | Spreadsheet操作教程实例
Apr 01 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的数组与字符串的转换函数整理汇总
2013/07/18 PHP
PHP实现压缩图片尺寸并转为jpg格式的方法示例
2018/05/10 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
2020/04/14 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
javascript void(0)的妙用
2009/10/21 Javascript
Js setInterval与setTimeout(定时执行与循环执行)的代码(可以传入参数)
2010/06/11 Javascript
Ext JS添加子组件的误区探讨
2013/06/28 Javascript
jquery获得option的值和对option进行操作
2013/12/13 Javascript
通过Jquery的Ajax方法读取将table转换为Json
2014/05/31 Javascript
html的DOM中document对象forms集合用法实例
2015/01/21 Javascript
javaScript事件机制兼容【详细整理】
2016/07/23 Javascript
浅谈JS继承_借用构造函数 &amp; 组合式继承
2016/08/16 Javascript
EasyUI学习之Combobox级联下拉列表(2)
2016/12/29 Javascript
js 事件的传播机制(实例讲解)
2017/07/20 Javascript
Bootstrap table使用方法记录
2017/08/23 Javascript
vue+webpack模拟后台数据的示例代码
2018/07/26 Javascript
AngularJS发送异步Get/Post请求方法
2018/08/13 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
vue实现分页组件
2020/06/16 Javascript
Python结巴中文分词工具使用过程中遇到的问题及解决方法
2017/04/15 Python
老生常谈python的私有公有属性(必看篇)
2017/06/09 Python
人生苦短我用python python如何快速入门?
2018/03/12 Python
python实现单链表中删除倒数第K个节点的方法
2018/09/28 Python
python调用pyaudio使用麦克风录制wav声音文件的教程
2019/06/26 Python
详解Python绘图Turtle库
2019/10/12 Python
Tensorflow之梯度裁剪的实现示例
2020/03/08 Python
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
HTML5 video进入全屏和退出全屏的实现方法
2020/07/28 HTML / CSS
ALLSAINTS英国官网:伦敦新锐潮流品牌
2016/09/19 全球购物
以设计师精品品质提供快速时尚:PopJulia
2018/01/09 全球购物
桥梁与隧道工程专业本科生求职信
2013/10/08 职场文书
热能动力工程毕业生自荐信
2013/11/07 职场文书
2014年收银工作总结
2014/11/13 职场文书
索赔员岗位职责
2015/02/15 职场文书
火烧圆明园的观后感
2015/06/03 职场文书