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 相关文章推荐
BBS(php &amp; mysql)完整版(六)
Oct 09 PHP
《PHP边学边教》(02.Apache+PHP环境配置――上篇)
Dec 13 PHP
PHP 日,周,月点击排行统计
Jan 11 PHP
测试PHP连接MYSQL成功与否的代码
Aug 16 PHP
PHP中CURL的CURLOPT_POSTFIELDS参数使用细节
Mar 17 PHP
codeigniter集成ucenter1.6双向通信的解决办法
Jun 12 PHP
php输出xml属性的方法
Mar 19 PHP
PHP实现事件机制实例分析
Jun 26 PHP
PHP里面把16进制的图片数据显示在html的img标签上(实现方法)
May 02 PHP
thinkPHP5 tablib标签库自定义方法详解
May 10 PHP
thinkphp5修改view到根目录实例方法
Jul 02 PHP
phpstudy隐藏index.php的方法
Sep 21 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 Undefined index的问题
2009/06/01 PHP
php 静态变量与自定义常量的使用方法
2010/01/26 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
浅谈PHP Cookie处理函数
2016/06/10 PHP
iis 7下安装laravel 5.4环境的方法教程
2017/06/14 PHP
js传值 判断
2006/10/26 Javascript
用jscript实现新建word文档
2007/06/15 Javascript
犀利的js 函数集合
2009/06/11 Javascript
解决js中window.open弹出的是上次的缓存页面问题
2013/12/29 Javascript
js toFixed()方法的重写实现精度的统一
2014/03/06 Javascript
javascript实现网站加入收藏功能
2015/12/16 Javascript
DeviceOne 让你一见钟情的App快速开发平台
2016/02/17 Javascript
vue动态生成dom并且自动绑定事件
2017/04/19 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
vue-devtools的安装步骤
2018/04/23 Javascript
简化vuex的状态管理方案的方法
2018/06/02 Javascript
简述JS控制台的使用
2018/07/15 Javascript
Vue项目从webpack3.x升级webpack4不完全指南
2019/04/28 Javascript
vue v-for 点击当前行,获取当前行数据及event当前事件对象的操作
2020/09/10 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
用PyQt进行Python图形界面的程序的开发的入门指引
2015/04/14 Python
Python中的ctime()方法使用教程
2015/05/22 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
python list转矩阵的实例讲解
2018/08/04 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
ET Mall东森购物网:东森严选
2017/03/06 全球购物
英国团购网站:Groupon英国
2017/11/28 全球购物
Unix里面如何在后台运行程序
2016/10/14 面试题
畜牧兽医本科生个人的自我评价
2013/10/11 职场文书
物理专业大学生职业生涯规划书
2014/02/07 职场文书
大学校务公开实施方案
2014/03/31 职场文书
优秀毕业生就业推荐信
2014/05/22 职场文书
检察院起诉书
2015/05/20 职场文书
python运算符之与用户交互
2022/04/13 Python