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与javascript对多项选择的处理
Oct 09 PHP
中篇:安装及配置PHP
Dec 13 PHP
PHP 批量删除 sql语句
Jun 05 PHP
详解PHP中strlen和mb_strlen函数的区别
Mar 07 PHP
php通过session防url攻击方法
Dec 10 PHP
php发送短信验证码完成注册功能
Nov 24 PHP
Adnroid 微信内置浏览器清除缓存
Jul 11 PHP
PHP支付系统设计与典型案例分享
Aug 02 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
PHP压缩图片功能的介绍
Mar 21 PHP
浅析PHP7 的垃圾回收机制
Sep 06 PHP
Laravel如何实现自动加载类
Oct 14 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写的基于Memcache的Queue实现代码
2011/11/27 PHP
php替换超长文本中的特殊字符的函数代码
2012/05/22 PHP
php防止sql注入简单分析
2015/03/18 PHP
Jquery Ajax学习实例4 向WebService发出请求,返回实体对象的异步调用
2010/03/16 Javascript
JavaScript中的View-Model使用介绍
2011/08/11 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
JS跨域问题详解
2014/11/25 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
JavaScript中的函数嵌套使用
2015/06/04 Javascript
js支持键盘控制的左右切换立体式图片轮播效果代码分享
2015/08/26 Javascript
jQuery简单实现仿京东分类导航层效果
2016/06/07 Javascript
JavaScript实现in-place思想的快速排序方法
2016/08/07 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
JavaScript实现的选择排序算法实例分析
2017/04/14 Javascript
Angular2安装angular-cli
2017/05/21 Javascript
JS使用ActiveXObject实现用户提交表单时屏蔽敏感词功能
2017/06/20 Javascript
javascript原生封装一个淡入淡出效果的函数测试实例代码
2018/03/19 Javascript
微信小程序换肤功能实现代码(思路详解)
2020/08/25 Javascript
jQuery实现鼠标拖拽登录框移动效果
2020/09/13 jQuery
Python中Numpy ndarray的使用详解
2019/05/24 Python
django框架模板中定义变量(set variable in django template)的方法分析
2019/06/24 Python
在Django的View中使用asyncio的方法
2019/07/12 Python
Python txt文件如何转换成字典
2020/11/03 Python
使用Python画了一棵圣诞树的实例代码
2020/11/27 Python
python中的对数log函数表示及用法
2020/12/09 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
纯css3制作的火影忍者写轮眼开眼至轮回眼及进化过程实例
2014/11/11 HTML / CSS
HTML5 Canvas图像模糊完美解决办法
2018/02/06 HTML / CSS
医学专业毕业生推荐信
2014/07/12 职场文书
仲裁协议书
2014/09/26 职场文书
2015秋季新学期开学寄语
2015/05/28 职场文书
2015选调生工作总结
2015/07/24 职场文书
《索溪峪的野》教学反思
2016/02/19 职场文书
《初涉尘世》读后感3篇
2020/01/10 职场文书
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
2021/06/21 Oracle
Java基础之线程锁相关知识总结
2021/06/30 Java/Android