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 相关文章推荐
phpmyadmin MySQL 加密配置方法
Jul 05 PHP
PHP Stream_*系列函数
Aug 01 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
PHP使用数组实现队列
Feb 05 PHP
PHP连接SQLServer2005的实现方法(附ntwdblib.dll下载)
Jul 02 PHP
php二维数组排序与默认自然排序的方法介绍
Apr 27 PHP
ThinkPHP的模版中调用session数据的方法
Jul 01 PHP
laravel 5 实现模板主题功能
Mar 02 PHP
php中使用websocket详解
Sep 23 PHP
适合PHP初学者阅读的4本经典书籍
Sep 23 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
PHP实现rar解压读取扩展包小结
Jun 03 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数组应用之比较两个时间的相减排序
2008/08/18 PHP
php连接数据库代码应用分析
2011/05/29 PHP
Linux下创建nginx脚本-start、stop、reload…
2014/08/03 PHP
PHP实现加密文本文件并限制特定页面的存取的效果
2016/10/21 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
Extjs显示从数据库取出时间转换JSON后的出现问题
2012/11/20 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
jQuery+CSS实现菜单滑动伸展收缩(仿淘宝)
2013/03/22 Javascript
JavaScript中的函数重载深入理解
2014/08/04 Javascript
jQuery实现鼠标单击网页文字后在文本框显示的方法
2015/05/06 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
node.js路径处理方法以及绝对路径详解
2021/03/04 Javascript
Vue 2.X的状态管理vuex记录详解
2017/03/23 Javascript
jQuery实现动态给table赋值的方法示例
2017/07/04 jQuery
详解Vue中一种简易路由传参办法
2017/09/15 Javascript
JS面试题大坑之隐式类型转换实例代码
2018/10/14 Javascript
JS栈stack类的实现与使用方法示例
2019/01/31 Javascript
mpvue开发音频类小程序踩坑和建议详解
2019/03/12 Javascript
Vue CLI项目 axios模块前后端交互的使用(类似ajax提交)
2019/09/01 Javascript
javascript浅层克隆、深度克隆对比及实例解析
2020/02/09 Javascript
Vue 实现v-for循环的时候更改 class的样式名称
2020/07/17 Javascript
js操作两个json数组合并、去重,以及删除某一项元素
2020/09/22 Javascript
Python2.X/Python3.X中urllib库区别讲解
2017/12/19 Python
python 对key为时间的dict排序方法
2018/10/17 Python
python实现批量注册网站用户的示例
2019/02/22 Python
python搜索包的路径的实现方法
2019/07/19 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
python不同系统中打开方法
2020/06/23 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
CSS3 :not()选择器实现最后一行li去除某种css样式
2016/10/19 HTML / CSS
adidas泰国官网:adidas TH
2020/07/11 全球购物
毕业生就业推荐表自我鉴定
2014/03/20 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
设备技术员岗位职责
2015/04/11 职场文书
Canvas三种动态画圆实现方法说明(小结)
2021/04/16 Javascript