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实现快速排序法函数代码
Aug 27 PHP
PHP数据库链接类(PDO+Access)实例分享
Dec 05 PHP
php获取301跳转URL简单实例
Dec 16 PHP
PHP中如何实现常用邮箱的基本判断
Jan 07 PHP
PHP字符串的递增和递减示例介绍
Feb 11 PHP
php不使用插件导出excel的简单方法
Mar 04 PHP
Codeigniter+PHPExcel实现导出数据到Excel文件
Jun 12 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
PHP登录验证码的实现与使用方法
Jul 07 PHP
php接口技术实例详解
Dec 07 PHP
PHP convert_uudecode()函数讲解
Feb 14 PHP
PHP接口类(interface)的定义、特点和应用示例
May 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
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
php使用文本统计访问量的方法
2016/05/12 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
PHP验证终端类型是否为手机的简单实例
2017/02/07 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
javascript中兼容主流浏览器的动态生成iframe方法
2014/05/05 Javascript
js 动态修改css文件的方法
2014/08/05 Javascript
jQuery使用DataTable实现删除数据后重新加载功能
2017/02/27 Javascript
nodejs调取微信收货地址的方法
2017/12/20 NodeJs
Vue组件通信的几种实现方法
2019/04/25 Javascript
新手简单了解vue
2019/05/29 Javascript
微信小程序-API接口安全详解
2019/07/16 Javascript
Vue实现数据表格合并列rowspan效果
2020/11/30 Javascript
javascript用defineProperty实现简单的双向绑定方法
2020/04/03 Javascript
python中精确输出JSON浮点数的方法
2014/04/18 Python
异步任务队列Celery在Django中的使用方法
2018/06/07 Python
python实现输入数字的连续加减方法
2018/06/22 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
python调用staf自动化框架的方法
2018/12/26 Python
基于wxPython的GUI实现输入对话框(2)
2019/02/27 Python
Python对接 xray 和微信实现自动告警
2019/09/17 Python
Django中modelform组件实例用法总结
2020/02/10 Python
python 异步async库的使用说明
2020/05/04 Python
python将下载到本地m3u8视频合成MP4的代码详解
2020/11/24 Python
Django扫码抽奖平台的配置过程详解
2021/01/14 Python
孤独星球出版物:Lonely Planet Publications
2018/03/17 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
精彩的英文自荐信
2014/01/30 职场文书
幼儿园毕业典礼主持词
2014/03/21 职场文书
2014年清明节网上祭英烈寄语
2014/04/09 职场文书
个人求职信范文
2014/05/24 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
2014年公路养护工作总结
2014/12/04 职场文书
客户经理岗位职责大全
2015/04/09 职场文书
Windows Server 2019 配置远程控制以及管理方法
2022/04/28 Servers
使用Redis实现分布式锁的方法
2022/06/16 Redis