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 字符串操作入门教程
Dec 06 PHP
中篇:安装及配置PHP
Dec 13 PHP
php mysql Errcode: 28 终极解决方法
Jul 01 PHP
ionCube 一款类似zend的PHP加密/解密工具
Jul 25 PHP
destoon文章模块调用企业会员资料的方法
Aug 22 PHP
php中实现xml与mysql数据相互转换的方法
Dec 25 PHP
php在apache环境下实现gzip配置方法
Apr 02 PHP
PHP常见漏洞攻击分析
Feb 21 PHP
php生成0~1随机小数的方法(必看)
Apr 05 PHP
Yii2设置默认控制器的两种方法
May 19 PHP
ThinkPHP5框架缓存查询操作分析
May 30 PHP
php多进程模拟并发事务产生的问题小结
Dec 07 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
phpmyadmin导入(import)文件限制的解决办法
2009/12/11 PHP
Yii使用技巧大汇总
2015/12/29 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
php一个文件搞定微信jssdk配置
2016/12/12 PHP
jquery 最简单的属性菜单
2009/10/08 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
Javascript中的delete操作符详细介绍
2014/06/06 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
js实现select下拉框菜单
2015/12/08 Javascript
CSS或者JS实现鼠标悬停显示另一元素
2016/01/22 Javascript
深入理解js数组的sort排序
2016/05/28 Javascript
jQuery简单创建节点的方法
2016/09/09 Javascript
Vue自定义指令拖拽功能示例
2017/02/17 Javascript
babel基本使用详解
2017/02/17 Javascript
jquery ui sortable拖拽后保存位置
2017/04/27 jQuery
ES6新增的math,Number方法
2017/08/06 Javascript
webpack 如何解析代码模块路径的实现
2019/09/04 Javascript
简单介绍Python的Django框架的dj-scaffold项目
2015/05/30 Python
python Django模板的使用方法
2016/01/14 Python
Python使用pickle模块存储数据报错解决示例代码
2018/01/26 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
python画微信表情符的实例代码
2019/10/09 Python
将python包发布到PyPI和制作whl文件方式
2019/12/25 Python
用纯css3和html制作泡沫对话框实现代码
2013/03/21 HTML / CSS
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
Trina Turk官网:美国时装和泳装品牌
2018/06/10 全球购物
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
求职简历的自我评价怎样写好
2013/10/07 职场文书
商场端午节活动方案
2014/01/29 职场文书
劲霸男装广告词
2014/03/21 职场文书
大学迎新标语
2014/06/26 职场文书
2014年国庆节演讲稿
2014/09/02 职场文书
人事局接收函
2015/01/30 职场文书
跳高加油稿
2015/07/21 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers