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 cookis创建实现代码
Mar 16 PHP
php数组函数序列之array_unique() - 去除数组中重复的元素值
Oct 29 PHP
PHP持久连接mysql_pconnect()函数使用介绍
Feb 05 PHP
PHP的简易冒泡法代码分享
Aug 28 PHP
CI映射(加载)数据到view层的方法
Mar 28 PHP
smarty的section嵌套循环用法示例
May 28 PHP
PHP文件与目录操作示例
Dec 24 PHP
php实现数据库的增删改查
Feb 26 PHP
老生常谈php中传统验证与thinkphp框架(必看篇)
Jun 10 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
Aug 01 PHP
php格式文件打开的四种方法
Feb 24 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 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
php checkdate、getdate等日期时间函数操作详解
2010/03/11 PHP
PHP面向对象精要总结
2014/11/07 PHP
php简单解析mysqli查询结果的方法(2种方法)
2016/06/29 PHP
js玩一玩WSH吧
2007/02/23 Javascript
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
JScript内置对象Array中元素的删除方法
2007/03/08 Javascript
jquery 子窗口操作父窗口的代码
2009/09/21 Javascript
始终在屏幕中间显示Div的代码(css+js)
2011/03/10 Javascript
获取元素距离浏览器周边的位置的方法getBoundingClientRect
2013/04/17 Javascript
JS获取url链接字符串 location.href
2013/12/23 Javascript
jQuery打字效果实现方法(附demo源码下载)
2015/12/18 Javascript
jQuery mobile的header和footer在点击屏幕的时候消失的解决办法
2016/07/01 Javascript
深入理解AngularJS中的ng-bind-html指令和$sce服务
2016/09/08 Javascript
select下拉框插件jquery.editable-select详解
2017/01/22 Javascript
React简单介绍
2017/05/24 Javascript
基于js中的存储键值对以及注意事项介绍
2018/03/30 Javascript
一个Vue视频媒体多段裁剪组件的实现示例
2018/08/09 Javascript
vue 解决遍历对象显示的顺序不对问题
2019/11/07 Javascript
nodejs+koa2 实现模仿springMVC框架
2020/10/21 NodeJs
[36:20]完美世界DOTA2联赛PWL S3 access vs Rebirth 第一场 12.17
2020/12/18 DOTA
Python中字典创建、遍历、添加等实用操作技巧合集
2015/06/02 Python
Python的消息队列包SnakeMQ使用初探
2016/06/29 Python
Python检查图片是否损坏及图片类型是否正确过程详解
2019/09/30 Python
Web页面中八种创建多列等高(等高列布局)的实现技术
2012/12/24 HTML / CSS
阿玛尼化妆品美国官网:Giorgio Armani Beauty
2017/02/02 全球购物
商务英语专业毕业生自荐信
2013/11/05 职场文书
同学会邀请书大全
2014/01/12 职场文书
授权委托书格式模板
2014/04/03 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
后勤管理员岗位职责
2014/08/27 职场文书
名人演讲稿范文
2014/09/16 职场文书
2014学校领导四风问题对照检查材料思想汇报
2014/09/22 职场文书
党的群众路线教育实践活动组织生活会发言材料
2014/10/17 职场文书
2014年终个人总结报告
2015/03/09 职场文书
Django使用redis配置缓存的方法
2021/06/01 Redis
2022年四月新番
2022/03/15 日漫