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在XP下IIS和Apache2服务器上的安装
Sep 05 PHP
用mysql内存表来代替php session的类
Feb 01 PHP
劣质的PHP代码简化
Feb 08 PHP
PHP的SQL注入过程分析
Jan 06 PHP
php提示无法加载或mcrypt没有找到 PHP 扩展 mbstring解决办法
Mar 27 PHP
typecho插件编写教程(三):保存配置
May 28 PHP
PHP检测用户语言的方法
Jun 15 PHP
PHP定时执行任务实现方法详解(Timer)
Jul 30 PHP
PHP图形操作之Jpgraph学习笔记
Dec 25 PHP
基于Codeigniter框架实现的student信息系统站点动态发布功能详解
Mar 23 PHP
php array_reverse 以相反的顺序返回数组实例代码
Apr 11 PHP
ThinkPHP5和ThinkPHP6的区别
Mar 31 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.ini中文版
2006/10/09 PHP
PHP 存储文本换行实现方法
2010/01/05 PHP
PHP调用Webservice实例代码
2011/07/29 PHP
用 Javascript 验证表单(form)中的单选(radio)值
2009/09/08 Javascript
iframe自适应宽度、高度 ie6 7 8,firefox 3.86下测试通过
2010/07/29 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
IE8下String的Trim()方法失效的解决方法
2013/11/08 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
JS+CSS实现弹出全屏灰黑色透明遮罩效果的方法
2014/12/20 Javascript
jQuery在线选座位插件seat-charts特效代码分享
2015/08/27 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
jquery 实现回车登录详解及实例代码
2016/10/23 Javascript
Javascript计算二维数组重复值示例代码
2016/12/18 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
微信小程序商城项目之商品属性分类(4)
2017/04/17 Javascript
js实现input密码框显示/隐藏功能
2020/09/10 Javascript
React SSR样式及SEO的实践
2018/10/22 Javascript
Vue中使用matomo进行访问流量统计的实现
2019/11/05 Javascript
[59:48]DOTA2-DPC中国联赛 正赛 VG vs Magma BO3 第一场 1月26日
2021/03/11 DOTA
Python实现比较两个文件夹中代码变化的方法
2015/07/10 Python
Python温度转换实例分析
2018/01/17 Python
Python基于matplotlib实现绘制三维图形功能示例
2018/01/18 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
python去掉 unicode 字符串前面的u方法
2018/10/21 Python
selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)
2018/11/29 Python
Python协程操作之gevent(yield阻塞,greenlet),协程实现多任务(有规律的交替协作执行)用法详解
2019/10/14 Python
详解Python中import机制
2020/09/11 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
英国太阳镜品牌:Taylor Morris Eyewear
2018/04/18 全球购物
手工制作的豪华英式沙发和沙发床:Willow & Hall
2019/05/03 全球购物
党校自我鉴定范文
2013/10/02 职场文书
寄语是什么意思
2014/04/10 职场文书
标准毕业生自荐信
2014/06/24 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
聘任合同书
2015/09/21 职场文书