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 相关文章推荐
MySQL相关说明
Jan 15 PHP
PHP 用数组降低程序的时间复杂度
Dec 04 PHP
PHP输出当前进程所有变量/常量/模块/函数/类的示例
Nov 07 PHP
PHP错误和异长常处理总结
Mar 06 PHP
从零开始学YII2框架(六)高级应用程序模板
Aug 20 PHP
php中adodbzip类实例
Dec 08 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
php自定义时间转换函数示例
Dec 07 PHP
简单解决微信文章图片防盗链问题
Dec 17 PHP
PHP laravel中的多对多关系实例详解
Jun 07 PHP
php7基于递归实现删除空文件夹的方法示例
Jun 15 PHP
PHP使用CURL实现下载文件功能示例
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+MySQL 制作简单的留言本
2009/11/02 PHP
php文件压缩之PHPZip类用法实例
2015/06/18 PHP
PHP中Trait及其应用详解
2017/02/14 PHP
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
判断是否输入完毕再激活提交按钮
2006/06/26 Javascript
Javascript脚本实现静态网页加密实例代码
2013/11/05 Javascript
刷新页面的几种方法小结(JS,ASP.NET)
2014/01/07 Javascript
jQuery实现统计输入文字个数的方法
2015/03/11 Javascript
AngularJS基础教程之简单介绍
2015/09/27 Javascript
js图片轮播手动切换特效
2017/01/12 Javascript
Node接收电子邮件的实例代码
2017/07/21 Javascript
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
js断点调试经验分享
2017/12/08 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
JavaScript基于数组实现的栈与队列操作示例
2018/12/22 Javascript
小程序实现搜索框
2020/06/19 Javascript
微信小程序从注册账号到上架(图文详解)
2019/07/17 Javascript
vue实现简单加法计算器
2020/10/22 Javascript
python 实现视频流下载保存MP4的方法
2019/01/09 Python
Django框架创建mysql连接与使用示例
2019/07/29 Python
pyqt5 QScrollArea设置在自定义侧(任何位置)
2019/09/25 Python
Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
2019/11/07 Python
python 通过exifread读取照片信息
2020/12/24 Python
Python抖音快手代码舞(字符舞)的实现方法
2021/02/07 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
森海塞尔美国官网:Sennheiser耳机与耳麦
2017/07/19 全球购物
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
金融专业个人的自我评价
2013/10/18 职场文书
机械制造专业个人的自我评价
2013/12/28 职场文书
自我评价是什么
2014/01/04 职场文书
关于迟到的检讨书
2014/01/26 职场文书
党员对照检查剖析材料
2014/10/13 职场文书
学校社团活动总结
2015/05/07 职场文书
起诉书范文
2015/05/20 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书