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 程序授权验证开发思路
Jul 09 PHP
discuz authcode 经典php加密解密函数解析
Jul 12 PHP
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
php数据入库前清理 注意php intval与mysql的int取值范围不同
Dec 12 PHP
php导入csv文件碰到乱码问题的解决方法
Feb 10 PHP
详谈PHP文件目录基础操作
Nov 11 PHP
php实现CSV文件导入和导出
Oct 24 PHP
php文档工具PHP Documentor安装与使用方法
Jan 25 PHP
php中的单引号、双引号和转义字符详解
Feb 16 PHP
PHP实现批量删除(封装)
Apr 28 PHP
PHP 7.0新增加的特性介绍
Jun 08 PHP
PHP静态延迟绑定和普通静态效率的对比
Oct 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中看实例学正则表达式
2006/12/25 PHP
深入理解php的MySQL连接类
2013/06/07 PHP
php正则取img标记中任意属性(正则替换去掉或改变图片img标记中的任意属性)
2013/08/13 PHP
PHP $_FILES中error返回值详解
2014/01/30 PHP
php+mysql开发中的经验与常识小结
2019/03/25 PHP
javascript网页关键字高亮代码
2008/07/30 Javascript
Javascript 判断函数类型完美解决方案
2009/09/02 Javascript
jquery 模板的应用示例
2013/11/12 Javascript
javascript运行机制之this详细介绍
2014/02/07 Javascript
JS取request值以及自动执行使用示例
2014/02/24 Javascript
js在IE与firefox的差异集锦
2014/11/11 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
Vue精简版风格指南(推荐)
2018/01/30 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
js获取 gif 的帧数的代码实例
2019/09/10 Javascript
原生js实现购物车功能
2020/09/23 Javascript
Python实现将罗马数字转换成普通阿拉伯数字的方法
2017/04/19 Python
django 发送手机验证码的示例代码
2018/04/25 Python
Python WSGI的深入理解
2018/08/01 Python
Pytorch之卷积层的使用详解
2019/12/31 Python
css3实现简单的白云飘动背景特效
2020/10/28 HTML / CSS
香港草莓网土耳其网站:Strawberrynet TR
2017/03/02 全球购物
世界各地的当地人的食物体验:Eatwith
2019/07/26 全球购物
旷课检讨书2000字
2014/01/14 职场文书
展会邀请函范文
2014/01/26 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
兽医医药专业求职信
2014/07/27 职场文书
法定代表人资格证明书
2014/09/11 职场文书
2015年党员干部承诺书
2015/01/21 职场文书
2015年六一儿童节活动总结
2015/02/11 职场文书
会计工作能力自我评价
2015/03/05 职场文书
反腐倡廉影片观后感
2015/06/08 职场文书
2015-2016年小学教导工作总结
2015/07/21 职场文书
小学二年级语文教学反思
2016/03/03 职场文书