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 相关文章推荐
用mysql_fetch_array()获取当前行数据的方法详解
Jun 05 PHP
Yii使用CLinkPager分页实例详解
Jul 23 PHP
PHP实现事件机制的方法
Jul 10 PHP
php实现简单的上传进度条
Nov 17 PHP
PHP实现页面静态化的超简单方法
Sep 06 PHP
php实现的简单中文验证码功能示例
Jan 03 PHP
根据key删除数组中指定的元素实现方法
Mar 02 PHP
php从数据库中读取特定的行(实例)
Jun 02 PHP
PHP共享内存使用与信号控制实例分析
May 09 PHP
PHP 获取客户端 IP 地址的方法实例代码
Nov 11 PHP
PHP cookie,session的使用与用户自动登录功能实现方法分析
Jun 05 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 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中限制IP段访问、禁止IP提交表单的代码
2011/04/23 PHP
如何批量替换相对地址为绝对地址(利用bat批处理实现)
2013/05/27 PHP
PHP实现导出带样式的Excel
2016/08/28 PHP
js实现简单的购物车有图有代码
2014/05/26 Javascript
jQuery 回调函数(callback)的使用和基础
2015/02/26 Javascript
JavaScript面向对象的实现方法小结
2015/04/14 Javascript
jQuery AJAX timeout 超时问题详解
2016/06/21 Javascript
jQuery动态修改字体大小的方法【测试可用】
2016/09/09 Javascript
深入理解JavaScript中的并行处理
2016/09/22 Javascript
80%应聘者都不及格的JS面试题
2017/03/21 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
在 Angular 中使用Chart.js 和 ng2-charts的示例代码
2017/08/17 Javascript
使用ef6创建oracle数据库的实体模型遇到的问题及解决方案
2017/11/09 Javascript
详解React Native 屏幕适配(炒鸡简单的方法)
2018/06/11 Javascript
微信小程序实现滴滴导航tab切换效果
2018/07/24 Javascript
详解Webpack多环境代码打包的方法
2018/08/03 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
Python中使用logging模块代替print(logging简明指南)
2014/07/09 Python
跟老齐学Python之关于类的初步认识
2014/10/11 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
Python基于递归和非递归算法求两个数最大公约数、最小公倍数示例
2018/05/21 Python
python 输入一个数n,求n个数求乘或求和的实例
2018/11/13 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
2020/03/30 Python
Pycharm中使用git进行合作开发的教程详解
2020/11/17 Python
Ruby中的保护方法和私有方法与一般面向对象程序设计语言的一样吗
2013/05/01 面试题
网络工程师个人的自我评价范文
2013/10/01 职场文书
应用电子专业学生的自我评价
2013/10/16 职场文书
行政部岗位职责范本
2014/03/13 职场文书
二手房购房意向书范本
2014/04/01 职场文书
小学三年级学生评语
2014/04/22 职场文书
人事代理委托书
2014/09/27 职场文书
2014年度工作总结报告
2014/12/15 职场文书
龙潭大峡谷导游词
2015/02/10 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
MySQL磁盘碎片整理实例演示
2022/04/03 MySQL