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 相关文章推荐
使用sockets:从新闻组中获取文章(二)
Oct 09 PHP
PHP 编程的 5个良好习惯
Feb 20 PHP
一个PHP的String类代码
Apr 20 PHP
php递归创建和删除文件夹的代码小结
Apr 13 PHP
php 模拟GMAIL,HOTMAIL(MSN),YAHOO,163,126邮箱登录的详细介绍
Jun 18 PHP
php中PDO方式实现数据库的增删改查
May 17 PHP
php结合正则获取字符串中数字
Jun 19 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
Jan 08 PHP
浅谈PHP中的数据传输CURL
Sep 06 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
浅谈Laravel中的一个后期静态绑定
Aug 11 PHP
PHP基于rabbitmq操作类的生产者和消费者功能示例
Jun 16 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小马小结(方便查找后门的朋友)
2012/05/05 PHP
thinkphp备份数据库的方法分享
2015/01/04 PHP
PHP将HTML转换成文本的实现代码
2015/01/21 PHP
Yii基于CActiveForm的Ajax数据验证用法示例
2016/07/14 PHP
详谈php ip2long 出现负数的原因及解决方法
2017/04/05 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
2017/10/23 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
多种方法实现load加载完成后把图片一次性显示出来
2014/02/19 Javascript
Extjs grid添加一个图片状态或者按钮的方法
2014/04/03 Javascript
zeroclipboard 单个复制按钮和多个复制按钮的实现方法
2014/06/14 Javascript
原生javascript实现简单的datagrid数据表格
2015/01/02 Javascript
AngularJS基础学习笔记之指令
2015/05/10 Javascript
jQuery实现的经典滑动门效果
2015/09/22 Javascript
jquery简单倒计时实现方法
2015/12/18 Javascript
jQuery Form 表单提交插件之formSerialize,fieldSerialize,fieldValue,resetForm,clearForm,clearFields的应用
2016/01/23 Javascript
浅谈Angular2 ng-content 指令在组件中嵌入内容
2017/08/18 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
Vue infinite update loop的问题解决
2019/04/23 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
JavaScript array常用方法代码实例详解
2020/09/02 Javascript
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
python 对txt中每行内容进行批量替换的方法
2018/07/11 Python
浅谈Python里面小数点精度的控制
2018/07/16 Python
python3实现表白神器
2019/04/09 Python
Pandas时间序列:重采样及频率转换方式
2019/12/26 Python
python3发送request请求及查看返回结果实例
2020/04/30 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
CSS3不透明度实例讲解
2016/04/26 HTML / CSS
基于canvas的骨骼动画的示例代码
2018/06/12 HTML / CSS
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
物理系毕业生自荐书范文
2014/02/22 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
2014大学辅导员工作总结
2014/12/02 职场文书
2016年学校“6﹒26国际禁毒日”宣传活动总结
2016/04/05 职场文书
Python OpenCV实现图形检测示例详解
2022/04/08 Python
Nginx代理Redis哨兵主从配置的实现
2022/07/15 Servers