PHP 实现重载


Posted in PHP onMarch 09, 2021

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
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
function sum($var1,$var2,$var3=NULL){//$var3设置默认值
    echo $var1+$var2+$var3;
}
sum(1,2);//2
sum(1,2,3);//2.5
?>

 

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读注册表
Oct 09 PHP
人大复印资料处理程序_查询篇
Oct 09 PHP
PHP中动态HTML的输出技术
Oct 09 PHP
php替换超长文本中的特殊字符的函数代码
May 22 PHP
PHP四大安全策略
Mar 12 PHP
PHP中数组的分组排序实例
Jun 01 PHP
浅析php工厂模式
Nov 25 PHP
php制作文本式留言板
Mar 18 PHP
php实现网站文件批量压缩下载功能
Oct 28 PHP
Smarty变量用法详解
May 11 PHP
PHP实现模拟http请求的方法分析
Dec 20 PHP
PHP获取链表中倒数第K个节点的方法
Jan 18 PHP
PHP 实现缩略图
Mar 09 #PHP
PHP 裁剪图片
Mar 09 #PHP
PHP 使用位运算实现四则运算的代码
Mar 09 #PHP
让你的PHP,APACHE,NGINX支持大文件上传
Mar 09 #PHP
PHP常用字符串输出方法分析(echo,print,printf及sprintf)
Mar 09 #PHP
PHP中echo与print区别点整理
Mar 09 #PHP
PHP filter_var() 函数, 验证判断EMAIL,URL等
Mar 09 #PHP
You might like
一首老MP3,致敬WAR3经典
2021/03/08 魔兽争霸
PHP syntax error, unexpected $end 错误的一种原因及解决
2008/10/25 PHP
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
PHP 文章中的远程图片采集到本地的代码
2009/07/30 PHP
不支持fsockopen但支持culr环境下下ucenter与modoer通讯问题
2011/08/12 PHP
浅析Yii2 gridview实现批量删除教程
2016/04/22 PHP
yii2中LinkPager增加总页数和总记录数的实例
2017/08/28 PHP
seajs1.3.0源码解析之module依赖有序加载
2012/11/07 Javascript
node.js中的fs.fchown方法使用说明
2014/12/16 Javascript
javascript获取元素离文档各边距离的方法
2015/02/13 Javascript
Javascript aop(面向切面编程)之around(环绕)分析
2015/05/01 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
laydate.js日期时间选择插件
2017/01/04 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
微信小程序网络封装(简单高效)
2018/08/06 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
ES6实现图片切换特效代码
2020/01/14 Javascript
详解JavaScript中的this指向问题
2021/02/05 Javascript
利用soaplib搭建webservice详细步骤和实例代码
2013/11/20 Python
Python学习笔记之解析json的方法分析
2017/04/21 Python
Python时间的精准正则匹配方法分析
2017/08/17 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
2017/11/29 Python
浅谈flask源码之请求过程
2018/07/26 Python
python实现指定文件夹下的指定文件移动到指定位置
2018/09/17 Python
Django之提交表单与前后端交互的方法
2019/07/19 Python
python实现切割url得到域名、协议、主机名等各个字段的例子
2019/07/25 Python
pyenv虚拟环境管理python多版本和软件库的方法
2019/12/26 Python
Holland & Barrett爱尔兰:英国领先的健康零售商
2019/03/31 全球购物
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
《争吵》教学反思
2014/02/15 职场文书
《学会待客》教学反思
2014/02/22 职场文书
十佳标兵事迹材料
2014/08/18 职场文书
教师考核表个人总结
2015/02/12 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
白银帝国观后感
2015/06/17 职场文书
Python入门之使用pandas分析excel数据
2021/05/12 Python