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 ajax 分页类代码
Nov 13 PHP
PHP最常用的ini函数分析 针对PHP.ini配置文件
Apr 22 PHP
解析php mysql 事务处理回滚操作(附实例)
Aug 05 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
回帖脱衣服的图片实现代码
Feb 15 PHP
PHP把网页保存为word文件的三种方法
Apr 01 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
Mar 03 PHP
PHP计算指定日期所在周的开始和结束日期的方法
Mar 24 PHP
php简单实现屏蔽指定ip段用户的访问
Apr 29 PHP
PHP Imagick完美实现图片裁切、生成缩略图、添加水印
Feb 22 PHP
PHP递归实现快速排序的方法示例
Dec 18 PHP
php慢查询日志和错误日志使用详解
Feb 27 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中new static()与new self()的比较
2016/08/19 PHP
PHP实现的DES加密解密封装类完整实例
2017/04/29 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
PHP sdk文档处理常用代码示例解析
2020/12/09 PHP
JSON 教程 json入门学习笔记
2020/09/22 Javascript
js自定义事件代码说明
2011/01/31 Javascript
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
JS实现可调整倒计时间代码分享
2015/08/18 Javascript
谈谈JavaScript中function多重理解
2015/08/28 Javascript
原生js的RSA和AES加密解密算法
2016/10/08 Javascript
js常用的继承--组合式继承
2017/03/06 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
通过button将form表单的数据提交到action层的实例
2017/09/08 Javascript
关于预加载InstantClick的问题解决方法
2017/09/12 Javascript
微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】
2017/12/05 Javascript
解决iview打包时UglifyJs报错的问题
2018/03/07 Javascript
Angular Material Icon使用详解
2018/11/07 Javascript
微信小程序实现form表单本地储存数据
2019/06/27 Javascript
浅谈Vue SSR中的Bundle的具有使用
2019/11/21 Javascript
vue+element-ui表格封装tag标签使用插槽
2020/06/18 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python3制作捧腹网段子页爬虫
2017/02/12 Python
Python实现读取Properties配置文件的方法
2018/03/29 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
TensorFlow实现简单的CNN的方法
2019/07/18 Python
python打开使用的方法
2019/09/30 Python
Flask中jinja2的继承实现方法及实例
2021/03/03 Python
amaze ui 的使用详细教程
2020/08/19 HTML / CSS
工程造价与财务管理专业应届生求职信
2013/10/06 职场文书
记者岗位职责
2014/01/06 职场文书
工作表现自我评价
2014/02/08 职场文书
委托书怎样写
2014/08/30 职场文书
2015企业年终工作总结范文
2015/05/27 职场文书
六五普法心得体会2016
2016/01/21 职场文书