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经典的给图片加水印程序
Dec 06 PHP
php 无限分类的树类代码
Dec 03 PHP
PHP学习之正则表达式
Apr 17 PHP
PHP基础陷阱题(变量赋值)
Sep 12 PHP
apache配置虚拟主机的方法详解
Jun 17 PHP
浅析PHP绘图技术
Jul 03 PHP
浅谈json_encode用法
Mar 05 PHP
php简单smarty入门程序实例
Jun 11 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
Windows平台实现PHP连接SQL Server2008的方法
Jul 26 PHP
PHP基于迭代实现文件夹复制、删除、查看大小等操作的方法
Aug 11 PHP
yii2的restful api路由实例详解
May 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 header函数分析详解
2011/08/06 PHP
PHP人民币金额数字转中文大写的函数代码
2013/02/27 PHP
nodejs入门详解(多篇文章结合)
2012/03/07 NodeJs
ExpressJS入门实例
2015/01/14 Javascript
javascript实现检验的各种规则
2015/07/31 Javascript
JS获取input file绝对路径的方法(推荐)
2016/08/02 Javascript
javascript 实现动态侧边栏实例详解
2016/11/11 Javascript
Javascript中的prototype与继承
2017/02/06 Javascript
Angular在一个页面中使用两个ng-app的方法(二)
2017/02/20 Javascript
jQuery插件FusionCharts绘制2D柱状图和折线图的组合图效果示例【附demo源码】
2017/04/10 jQuery
JavaScript实现的仿新浪微博原生态输入字数即时检查功能【兼容IE6】
2017/09/26 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
详解javascript 变量提升(Hoisting)
2019/03/12 Javascript
vue props对象validator自定义函数实例
2019/11/13 Javascript
[49:05]Newbee vs TNC 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python通过zlib实现压缩与解压字符串的方法
2014/11/19 Python
在Python的Django框架中显示对象子集的方法
2015/07/21 Python
flask + pymysql操作Mysql数据库的实例
2017/11/13 Python
Python实现PS滤镜中马赛克效果示例
2018/01/20 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
如何利用pygame实现简单的五子棋游戏
2019/12/29 Python
python中def是做什么的
2020/06/10 Python
python如何爬取动态网站
2020/09/09 Python
通过实例解析Python文件操作实现步骤
2020/09/21 Python
python3列表删除大量重复元素remove()方法的问题详解
2021/01/04 Python
期末考试动员演讲稿
2014/01/10 职场文书
小学生期末自我鉴定
2014/01/19 职场文书
导购员的岗位职责
2014/02/08 职场文书
学校联谊活动方案
2014/02/15 职场文书
社保代办委托书怎么写
2014/10/06 职场文书
缓刑人员思想汇报
2014/10/11 职场文书
初婚初育证明范本
2015/06/18 职场文书
熟背这些句子,让您的英语口语突飞猛进(135句)
2019/09/06 职场文书
Python3.10的一些新特性原理分析
2021/09/15 Python
Python 全局空间和局部空间
2022/04/06 Python
使用python将HTML转换为PDF pdfkit包(wkhtmltopdf) 的使用方法
2022/04/21 Python