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的日期与时间函数技巧
Apr 24 PHP
关于php fread()使用技巧
Jan 22 PHP
新浪微博API开发简介之用户授权(PHP基础篇)
Sep 25 PHP
解析php中array_merge与array+array的区别
Jun 21 PHP
PHP采用XML-RPC构造Web Service实例教程
Jul 16 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
PHP PDO操作MySQL基础教程
Jun 05 PHP
php+croppic.js实现剪切上传图片功能
Aug 14 PHP
PHP-FPM的配置与优化讲解
Mar 15 PHP
PHP常量define和const的区别详解
May 18 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
Oct 15 PHP
PHP设计模式概论【概念、分类、原则等】
May 01 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获得文件扩展名三法
2006/11/25 PHP
PHP入门学习的几个不错的实例代码
2008/07/13 PHP
php中数组首字符过滤功能代码
2012/07/31 PHP
php对csv文件的读取,写入,输出下载操作详解
2013/08/10 PHP
微信营销平台系统?刮刮乐的开发
2014/06/10 PHP
PHP实现ftp上传文件示例
2014/08/21 PHP
php使用explode()函数将字符串拆分成数组的方法
2015/02/17 PHP
php curl 获取https请求的2种方法
2015/04/27 PHP
微信公众平台DEMO(PHP)
2016/05/04 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
javascript 数组排序函数
2009/08/20 Javascript
js 与或运算符 || &amp;&amp; 妙用
2009/12/09 Javascript
JQuery的html(data)方法与&amp;lt;script&amp;gt;脚本块的解决方法
2010/03/09 Javascript
Nodejs使用mysql模块之获得更新和删除影响的行数的方法
2014/03/18 NodeJs
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
基于JS代码实现当鼠标悬停表格上显示这一格的全部内容
2016/06/12 Javascript
js实现可键盘控制的简单抽奖程序
2016/07/13 Javascript
利用Angularjs实现幻灯片效果
2016/09/07 Javascript
微信小程序中做用户登录与登录态维护的实现详解
2017/05/17 Javascript
Python3实现从文件中读取指定行的方法
2015/05/22 Python
详解Python的Django框架中Manager方法的使用
2015/07/21 Python
Python中字符串格式化str.format的详细介绍
2017/02/17 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
使用TensorFlow实现简单线性回归模型
2019/07/19 Python
丽笙酒店官方网站:Radisson Hotels
2019/05/07 全球购物
大学毕业生工作的自我评价
2013/10/01 职场文书
自荐信怎么写呢?
2013/12/09 职场文书
大学生学习面向未来的赶考思想汇报
2014/09/12 职场文书
政风行风建设整改方案
2014/10/27 职场文书
销售内勤岗位职责
2015/02/10 职场文书
大一学生个人总结
2015/02/15 职场文书
三八节活动简报
2015/07/20 职场文书
Mysql中存储引擎的区别及比较
2021/06/04 MySQL
MySQL约束(创建表时的各种条件说明)
2022/06/21 MySQL