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+javascript液晶时钟
Oct 09 PHP
PHP 图片上传实现代码 带详细注释
Apr 29 PHP
检测png图片是否完整的php代码
Sep 06 PHP
PHP使用ob_start生成html页面的方法
Nov 07 PHP
用php守护另一个php进程的例子
Feb 13 PHP
php数组生成html下拉列表的方法
Jul 20 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
浅谈php中urlencode与rawurlencode的区别
Sep 05 PHP
浅谈PHP中关于foreach使用引用变量的坑
Nov 14 PHP
laravel 框架结合关联查询 when()用法分析
Nov 22 PHP
Thinkphp 框架基础之入口文件功能、定义与用法分析
Apr 27 PHP
Apache+PHP+MySQL搭建PHP开发环境图文教程
Aug 06 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
PHP脚本数据库功能详解(上)
2006/10/09 PHP
Windows Apache2.2.11及Php5.2.9-1的安装与配置方法
2009/06/08 PHP
PHP函数篇之掌握ord()与chr()函数应用
2011/12/05 PHP
修改php.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
学习php过程中的一些注意点的总结
2013/10/25 PHP
PHP中使用json数据格式定义字面量对象的方法
2014/08/20 PHP
PHP记录搜索引擎蜘蛛访问网站足迹的方法
2015/04/15 PHP
微信公众号实现扫码获取微信用户信息(网页授权)
2019/04/09 PHP
thinkphp5.1框架模板布局与模板继承用法分析
2019/07/19 PHP
laravel框架上传图片实现实时预览功能
2019/10/14 PHP
PHP哈希表实现算法原理解析
2020/12/11 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
javascript Base类 包含基本的方法
2009/07/22 Javascript
使用jquery插件实现图片延迟加载技术详细说明
2011/03/12 Javascript
使用Post提交时须将空格转换成加号的解释
2013/01/14 Javascript
js对列表中第一个值处理与jsp页面对列表中第一个值处理的区别详解
2013/11/05 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
小议JavaScript中Generator和Iterator的使用
2015/07/29 Javascript
JS点击某个图标或按钮弹出文件选择框的实现代码
2016/09/27 Javascript
jQuery实现可移动选项的左右下拉列表示例
2016/12/26 Javascript
详解如何在你的Vue项目配置vux
2018/06/04 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
基于Python实现的微信好友数据分析
2018/02/26 Python
python绘制圆柱体的方法
2018/07/02 Python
python实现学生信息管理系统(精简版)
2020/11/27 Python
html5表单及新增的改良元素详解
2016/06/07 HTML / CSS
Steiff台湾官网:德国金耳釦泰迪熊
2019/12/26 全球购物
学院书画协会部门岗位职责
2013/12/01 职场文书
满月酒主持词
2014/03/27 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
计算机应用应届生求职信
2014/07/12 职场文书
2014党员学习习主席讲话思想汇报
2014/09/15 职场文书
纯html+css实现Element loading效果
2021/08/02 HTML / CSS
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
聊聊配置 Nginx 访问与错误日志的问题
2022/05/25 Servers