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抽象工厂模式(Elgg)
Mar 21 PHP
php 阴历-农历-转换类代码
Jan 16 PHP
基于php设计模式中单例模式的应用分析
May 15 PHP
php实现把数组按指定的个数分隔
Feb 17 PHP
phpmyadmin中禁止外网使用的方法
Nov 04 PHP
PHP中Header使用的HTTP协议及常用方法小结
Nov 04 PHP
php生成excel列名超过26列大于Z时的解决方法
Dec 29 PHP
在html文件中也可以执行php语句的方法
Apr 09 PHP
YII2.0之Activeform表单组件用法实例
Jan 09 PHP
Yii2中使用join、joinwith多表关联查询
Jun 30 PHP
PHP fclose函数用法总结
Feb 15 PHP
php使用curl模拟多线程实现批处理功能示例
Jul 25 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实现文件编码批量转换
2014/03/10 PHP
PHP中nowdoc和heredoc使用需要注意的一点
2014/03/21 PHP
PHP的new static和new self的区别与使用
2019/11/27 PHP
js获取单选按钮的数据
2006/11/27 Javascript
JavaScript 的方法重载效果
2009/08/07 Javascript
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
jquery组件使用中遇到的问题整理及解决
2014/02/21 Javascript
JavaScript获得表单target属性的方法
2015/04/02 Javascript
JavaScript 实现的 zip 压缩和解压缩工具包Zip.js使用详解
2015/12/14 Javascript
利用JavaScript判断浏览器类型及版本
2016/08/23 Javascript
jQuery实现鼠标跟随效果
2017/02/20 Javascript
浅谈Redux中间件的实践
2018/07/27 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
JavaScript实现放大镜效果代码示例
2020/04/29 Javascript
jQuery zTree如何改变指定节点文本样式
2020/10/16 jQuery
javascript 数组(list)添加/删除的实现
2020/12/17 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
在Python中使用PIL模块对图片进行高斯模糊处理的教程
2015/05/05 Python
Python使用修饰器执行函数的参数检查功能示例
2017/09/26 Python
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
matplotlib给子图添加图例的方法
2018/08/03 Python
win10下python3.5.2和tensorflow安装环境搭建教程
2018/09/19 Python
pandas读取csv文件,分隔符参数sep的实例
2018/12/12 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
python 的numpy库中的mean()函数用法介绍
2020/03/03 Python
解决pytorch多GPU训练保存的模型,在单GPU环境下加载出错问题
2020/06/23 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
详解HTML5中的拖放事件(Drag 和 drop)
2016/11/14 HTML / CSS
荷兰本土平价百货:HEMA
2017/10/23 全球购物
xml有哪些解析技术?区别是什么
2016/04/26 面试题
大学生社会实践评语
2014/04/25 职场文书
商务考察邀请函模板
2015/02/02 职场文书
安全保证书格式
2015/02/28 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
车辆管理制度范本
2015/08/05 职场文书
php访问对象中的成员的实例方法
2021/11/17 PHP