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 extract 将数组拆分成多个变量的函数
Jun 30 PHP
php变量范围介绍
Oct 15 PHP
PHP Switch 语句之学习笔记
Sep 21 PHP
ThinkPHP CURD方法之limit方法详解
Jun 18 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
PHP删除指定目录中的所有目录及文件的方法
Feb 26 PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 PHP
Smarty保留变量用法分析
May 23 PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 PHP
php通过执行CutyCapt命令实现网页截图的方法
Sep 30 PHP
PHP串行化与反串行化实例分析
Dec 27 PHP
实例讲解PHP表单验证功能
Feb 15 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
11个PHP 分页脚本推荐
2011/08/15 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
2014/03/08 PHP
PHP fopen()和 file_get_contents()应用与差异介绍
2014/03/19 PHP
php中遍历二维数组并以表格的形式输出的方法
2017/01/03 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
JS 建立对象的方法
2007/04/21 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
技术男用来对妹子表白的百度首页
2014/07/23 Javascript
JavaScript link方法入门实例(给字符串加上超链接)
2014/10/17 Javascript
JQuery选择器绑定事件及修改内容的方法
2015/01/23 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
AngularJS实践之使用NgModelController进行数据绑定
2016/10/08 Javascript
bootstrap按钮插件(Button)使用方法解析
2017/01/13 Javascript
AngularJS实现的获取焦点及失去焦点时的表单验证功能示例
2017/10/25 Javascript
vue项目中axios使用详解
2018/02/07 Javascript
javascript实现评分功能
2020/06/24 Javascript
jQuery 添加元素和删除元素的方法
2020/07/15 jQuery
[54:09]RNG vs Liquid 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
python如何实现excel数据添加到mongodb
2015/07/30 Python
python生成式的send()方法(详解)
2017/05/08 Python
Python对象类型及其运算方法(详解)
2017/07/05 Python
python遍历文件夹找出文件夹后缀为py的文件方法
2018/10/21 Python
Python大数据之从网页上爬取数据的方法详解
2019/11/16 Python
python 实现目录复制的三种小结
2019/12/04 Python
Python打印不合法的文件名
2020/07/31 Python
python asyncio 协程库的使用
2021/01/21 Python
3D动画《斗罗大陆》上线当日播放过亿
2021/03/16 国漫
CSS3属性使网站设计增强同时不消弱可用性
2009/08/29 HTML / CSS
推荐10个CSS3 制作的创意下拉菜单效果
2014/02/11 HTML / CSS
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
护理学应聘自荐书范文
2014/02/05 职场文书
母校寄语大全
2014/04/10 职场文书
我的画教学反思
2014/04/28 职场文书
廉洁自律承诺书2015
2015/01/22 职场文书
幼儿园综治宣传月活动总结
2015/05/07 职场文书
导游词之无锡东林书院
2019/12/11 职场文书