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 相关文章推荐
关于IIS php调用com组件的权限问题
Jan 11 PHP
php curl 伪造IP来源的实例代码
Nov 01 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(四)
Jun 23 PHP
PHP获取当前所在目录位置的方法
Nov 26 PHP
PHP获取当前完整URL地址的函数
Dec 21 PHP
浅析PHP中Session可能会引起并发问题
Jul 23 PHP
PHP实现对xml的增删改查操作案例分析
May 19 PHP
PHP用函数嵌入网站访问量计数器
Oct 27 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 PHP
php 实现银联商务H5支付的示例代码
Oct 12 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
Feb 27 PHP
PHP Trait功能与用法实例分析
Jun 03 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 5.3.x 的strtotime() 时区设定 警告信息修复
2013/08/05 PHP
常用PHP封装分页工具类
2017/01/14 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
js 点击按钮弹出另一页,选择值后,返回到当前页
2010/05/26 Javascript
验证手机号码的JS方法分享
2013/09/10 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
JS 打印界面的CSS居中代码适用所有浏览器
2014/03/19 Javascript
JavaScript数组Array对象增加和删除元素方法总结
2015/01/20 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
深入理解Vue router的部分高级用法
2018/08/15 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
vue-router权限控制(简单方式)
2018/10/29 Javascript
JavaScript中的惰性载入函数及优势
2020/02/18 Javascript
[00:21]DOTA2亚洲邀请赛 Logo演绎
2015/02/07 DOTA
[52:29]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第三局
2016/03/03 DOTA
Python中的filter()函数的用法
2015/04/27 Python
用Python中的字典来处理索引统计的方法
2015/05/05 Python
读写json中文ASCII乱码问题的解决方法
2016/11/05 Python
selenium+python 去除启动的黑色cmd窗口方法
2018/05/22 Python
python实现对服务器脚本敏感信息的加密解密功能
2019/08/13 Python
Python3 实现爬取网站下所有URL方式
2020/01/16 Python
快速一键生成Python爬虫请求头
2021/03/04 Python
请写出 float x 与"零值"比较的 if 语句
2016/01/04 面试题
.net开发工程师面试题
2014/02/25 面试题
理货员的岗位职责
2013/11/23 职场文书
办公室主任先进事迹
2014/01/18 职场文书
秘书英文求职信范文
2014/01/31 职场文书
报关报检委托书
2014/04/08 职场文书
2014年女职工工作总结
2014/11/27 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
思想品德评语大全
2014/12/31 职场文书
任命书怎么写
2015/03/02 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
Golang并发操作中常见的读写锁详析
2021/08/30 Golang