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动态创建Web站点的方法
Aug 14 PHP
探讨php中遍历二维数组的几种方法详解
Jun 08 PHP
PHP中source #N问题的解决方法
Jan 27 PHP
Win7下手动安装apache2.2、php5.4笔记
Apr 03 PHP
PHP cURL初始化和执行方法入门级代码
May 28 PHP
php PDO实现的事务回滚示例
Mar 23 PHP
php str_replace替换指定次数的方法详解
May 05 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP实现笛卡尔积算法的实例讲解
Dec 22 PHP
php 使用ActiveMQ发送消息,与处理消息操作示例
Feb 23 PHP
使用git迁移Laravel项目至新开发环境的步骤详解
Apr 06 PHP
tp5.1 框架join方法用法实例分析
May 26 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/04/08 PHP
解析PHP可变函数的经典用法
2013/06/20 PHP
PHP多例模式介绍
2013/06/24 PHP
Yii分页用法实例详解
2014/12/04 PHP
PHP之密码加密的几种方式
2015/07/29 PHP
js实现iframe动态调整高度的代码
2008/01/06 Javascript
JavaScript修改css样式style
2008/04/15 Javascript
借用Google的Javascript API Loader来加速你的网站
2009/01/28 Javascript
JavaScript获取某年某月的最后一天附截图
2014/06/23 Javascript
DOM 事件流详解
2015/01/20 Javascript
JavaScript通过字符串调用函数的实现方法
2015/03/18 Javascript
javascript数组去重的方法汇总
2015/04/14 Javascript
实现无刷新联动例子汇总
2015/05/20 Javascript
angularjs封装bootstrap时间插件datetimepicker
2016/06/20 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
jquery实现Ajax请求的几种常见方式总结
2019/05/28 jQuery
详解一次Vue低版本安卓白屏问题的解决过程
2019/05/30 Javascript
javascript 构建模块化开发过程解析
2019/09/11 Javascript
uniapp 仿微信的右边下拉选择弹出框的实现代码
2020/07/12 Javascript
微信小程序实现时间戳格式转换
2020/07/20 Javascript
[54:10]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
python实现动态创建类的方法分析
2019/06/25 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
在python下实现word2vec词向量训练与加载实例
2020/06/09 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
Spotahome意大利:公寓和房间出租
2020/02/21 全球购物
项目投资意向书
2014/04/01 职场文书
医生个人年度总结
2015/02/28 职场文书
教育教学读书笔记
2015/07/02 职场文书
新闻稿怎么写
2015/07/18 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
OpenCV-Python实现人脸磨皮算法
2021/06/07 Python