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之第一天
Oct 09 PHP
apache rewrite_module模块使用教程
Jan 10 PHP
php 删除无限级目录与文件代码共享
Nov 22 PHP
PHP autoload与spl_autoload自动加载机制的深入理解
Jun 05 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
Jun 25 PHP
php foreach循环中使用引用的问题
Nov 06 PHP
Laravel框架路由配置总结、设置技巧大全
Sep 03 PHP
php读取csv数据保存到数组的方法
Jan 03 PHP
PHP文件上传之多文件上传的实现思路
Jan 27 PHP
php获取文章内容第一张图片的方法示例
Jul 03 PHP
PHP编程实现计算抽奖概率算法完整实例
Aug 09 PHP
Laravel如何使用数据库事务及捕获事务失败后的异常详解
Oct 23 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 mkdir()无写权限的问题解决方法
2014/06/19 PHP
PHP文件上传操作实例详解
2016/09/27 PHP
PHP使用两个栈实现队列功能的方法
2018/01/15 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
2019/10/21 PHP
一个JQuery操作Table的代码分享
2012/03/30 Javascript
js/html光标定位的实现代码
2013/09/23 Javascript
jQuery遍历之next()、nextAll()方法使用实例
2014/11/08 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
手机端转盘抽奖代码分享
2015/09/10 Javascript
深入解析JavaScript的闭包机制
2015/10/20 Javascript
js实现图片无缝滚动
2015/12/23 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
JS图片延迟加载插件LazyImgv1.0用法分析【附demo源码下载】
2017/09/04 Javascript
JavaScript屏蔽Backspace键的实现代码
2017/11/02 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
在vue中使用Echarts利用watch做动态数据渲染操作
2020/07/20 Javascript
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
python的三目运算符和not in运算符使用示例
2014/03/03 Python
Python break语句详解
2014/03/11 Python
Python的装饰器模式与面向切面编程详解
2015/06/21 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
python傅里叶变换FFT绘制频谱图
2019/07/19 Python
python+mysql实现个人论文管理系统
2019/10/25 Python
用 Python 制作地球仪的方法
2020/04/24 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
澳大利亚购买健身器材网站:Gym Direct
2019/12/19 全球购物
计算机通信工程专业毕业生推荐信
2013/12/24 职场文书
大学军训感想
2014/02/12 职场文书
中学教师师德承诺书
2014/05/23 职场文书
三提三创主题教育活动查摆整改措施
2014/10/25 职场文书
中学生旷课检讨书500字
2014/10/29 职场文书
Oracle笔记
2021/04/05 Oracle