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 相关文章推荐
给初学者的30条PHP最佳实践(荒野无灯)
Aug 02 PHP
php增删改查示例自己写的demo
Sep 04 PHP
对PHP语言认识上需要避免的10大误区
Jun 12 PHP
php正则替换处理HTML页面的方法
Jun 17 PHP
PHP版QQ互联OAuth示例代码分享
Jul 05 PHP
PHP使用正则表达式获取微博中的话题和对象名
Jul 18 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
php实现倒计时效果
Dec 19 PHP
利用PHP判断文件是否为图片的方法总结
Jan 06 PHP
详解yii2实现分库分表的方案与思路
Feb 03 PHP
php 如何设置一个严格控制过期时间的session
May 05 PHP
PHP中Session ID的实现原理实例分析
Aug 17 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
PHP删除HTMl标签的三种解决方法
2013/06/30 PHP
CI框架整合widget(页面格局)的方法
2016/05/17 PHP
PHP实现生成带背景的图形验证码功能
2016/10/03 PHP
php中通过eval实现字符串格式的计算公式
2017/03/18 PHP
读jQuery之九 一些瑕疵说明
2011/06/21 Javascript
jquery简单实现滚动条下拉DIV固定在头部不动
2013/11/25 Javascript
分析了一下JQuery中的extend方法实现原理
2015/02/27 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
使用jquery提交form表单并自定义action的实现代码
2016/05/25 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
实现微信小程序的wxml文件和wxss文件在webstrom的支持
2017/06/12 Javascript
JS实现获取进今年第几天是周几的方法分析
2018/06/27 Javascript
JS拖动选择table里的单元格完整实例【基于jQuery】
2019/05/28 jQuery
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
webpack DllPlugin xxx is not defined解决办法
2019/12/13 Javascript
[59:26]DOTA2上海特级锦标赛D组资格赛#1 EG VS VP第二局
2016/02/28 DOTA
Python使用reportlab将目录下所有的文本文件打印成pdf的方法
2015/05/20 Python
简单讲解Python中的数字类型及基本的数学计算
2016/03/11 Python
Python实现Windows和Linux之间互相传输文件(文件夹)的方法
2017/05/08 Python
python保存文件方法小结
2018/07/27 Python
flask框架单元测试原理与用法实例分析
2019/07/23 Python
pycharm如何实现跨目录调用文件
2020/02/28 Python
css3 transform导致子元素固定定位变成绝对定位的方法
2020/03/06 HTML / CSS
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
Tory Burch美国官方网站:美国时尚生活品牌
2016/08/01 全球购物
墨尔本最受欢迎的复古风格品牌:Princess Highway
2018/12/21 全球购物
年会搞笑主持词
2014/03/27 职场文书
优秀团员自我评价范文
2014/04/23 职场文书
学生实习证明范文
2014/09/28 职场文书
2014年作风建设工作总结
2014/10/29 职场文书
暑期社会实践证明书
2014/11/17 职场文书
2015年感恩母亲节活动方案
2015/05/04 职场文书
先进基层党组织事迹材料2016
2016/02/29 职场文书
python3读取文件指定行的三种方法
2021/05/24 Python