PHP实现的函数重载功能示例


Posted in PHP onAugust 03, 2018

本文实例讲述了PHP实现的函数重载功能。分享给大家供大家参考,具体如下:

由于PHP是弱类型语言,因此函数的输入参数类型无法确定(可以使用类型暗示,但是类型暗示无法用在诸如整型,字符串之类的标量类型上),并且对于一个函数,比如只定义了3个输入参数,PHP却运行调用的时候输入4个或者更多的参数。因此基于这2点,注定了PHP中无法重载函数,(类似Javascript语言),也无法有构造函数的重载。

由于实现函数的重载对提高开发效率很有帮助,如果能象C#或者C++那样,那就非常好了。事实上,PHP的提供了一个魔术方法,mixed __call ( string name, array arguments )。这个方法在php手册中也有提及,根据官方文档,称此方法可以实现函数重载。当调用对象中一个不存在的方法的时候,如果定义了__call()方法,则会调用该方法。比如下面的代码:

<?php
class A
{
  function __call ( $name, $arguments )
  {
    echo "__call调用<br/>";
    echo '$name为'.$name."<br/>";
    print_r ($arguments);
  }
}
(new A)->test("test","argument");
?>

运行结果为:

__call调用
$name为test
Array ( [0] => test [1] => argument )

因此只需要利用该魔术方法既可以实现函数重载。

代码如下:

<?php
class A
{
  function __call ($name, $args )
  {
    if($name=='f')
    {
      $i=count($args);
      if (method_exists($this,$f='f'.$i)) {
        call_user_func_array(array($this,$f),$args);
      }
    }
  }
  function f1($a1)
  {
    echo "1个参数".$a1."<br/>";
  }
  function f2($a1,$a2)
  {
    echo "2个参数".$a1.",".$a2."<br/>";
  }
  function f3($a1,$a2,$a3)
  {
     echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
  }
}
(new A)->f('a');
(new A)->f('a','b');
(new A)->f('a','b','c');
?>

输出如下:

1个参数a
2个参数a,b
3个参数a,b,c

同样的在PHP中,实现构造函数的重载,也只能变通的实现。实现的关键要素是获取输入参数,并且根据输入参数判断调用哪个方法。下面是一个示例代码:

<?php
class A
{
  function __construct()
  {
    echo "执行构造函数<br/>";
    $a = func_get_args(); //获取构造函数中的参数
    $i = count($a);
    if (method_exists($this,$f='__construct'.$i)) {
      call_user_func_array(array($this,$f),$a);
    }
  }
  function __construct1($a1)
  {
    echo "1个参数".$a1."<br/>";
  }
  function __construct2($a1,$a2)
  {
    echo "2个参数".$a1.",".$a2."<br/>";
  }
  function __construct3($a1,$a2,$a3)
  {
     echo "3个参数".$a1.",".$a2.",".$a3."<br/>";
  }
}
$o = new A('a');
$o = new A('a','b');
$o = new A('a','b','c');
?>

执行构造函数
1个参数a
执行构造函数
2个参数a,b
执行构造函数
3个参数a,b,c

顺便提一下,和c#等面向对象语言一样,php中,把构造函数设成私有或者protected,就不能实例化该对象了。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
一个改进的UBB类
Oct 09 PHP
php 论坛采集程序 模拟登陆,抓取页面 实现代码
Jul 09 PHP
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
php array_pop()数组函数将数组最后一个单元弹出(出栈)
Jul 12 PHP
php中3种方法统计字符串中每种字符的个数并排序
Aug 27 PHP
php.ini save_handler 修改不生效的解决办法
Jul 22 PHP
Ubuntu中启用php的mail()函数并解决发送邮件速度慢问题
Mar 27 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
PHP实现动态添加XML中数据的方法
Mar 30 PHP
浅谈Laravel核心解读之Console内核
Dec 02 PHP
php数组指针函数功能及用法示例
Feb 11 PHP
PHP实现基本留言板功能原理与步骤详解
Mar 26 PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 #PHP
PHP命名空间namespace及use的简单用法分析
Aug 03 #PHP
PHP后台实现微信小程序登录
Aug 03 #PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 #PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 #PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 #PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 #PHP
You might like
php FPDF类库应用实现代码
2009/03/20 PHP
分享10段PHP常用代码
2015/11/11 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
js下获得客户端操作系统的函数代码(1:vista,2:windows7,3:2000,4:xp,5:2003,6:2008)
2011/10/31 Javascript
js动态设置div的值下例子
2013/10/29 Javascript
javascript中parentNode,childNodes,children的应用详解
2013/12/17 Javascript
jquery删除提示框弹出是否删除对话框
2014/01/07 Javascript
jQuery制作简洁的图片轮播效果
2015/04/03 Javascript
简单学习JavaScript中的for语句循环结构
2015/11/10 Javascript
javascript自动切换焦点控制效果完整实例
2016/02/02 Javascript
微信小程序滚动Tab实现左右可滑动切换
2017/08/17 Javascript
修改npm全局安装模式的路径方法
2018/05/15 Javascript
详解解决使用axios发送json后台接收不到的问题
2018/06/27 Javascript
ES6 Promise对象的含义和基本用法分析
2019/06/14 Javascript
JavaScript实现轮播图效果代码实例
2019/09/28 Javascript
javascript History对象原理解析
2020/02/17 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
Python re模块介绍
2014/11/30 Python
Python中的进程分支fork和exec详解
2015/04/11 Python
python实现TCP服务器端与客户端的方法详解
2015/04/30 Python
Django Highcharts制作图表
2016/08/27 Python
Python实现购物车功能的方法分析
2017/11/10 Python
keras 获取某层输出 获取复用层的多次输出实例
2020/05/23 Python
pandas统计重复值次数的方法实现
2021/02/20 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
洲际酒店集团美国官网:IHG美国
2017/11/16 全球购物
澳大利亚波西米亚风情网上商店:Czarina
2019/03/18 全球购物
酒店拾金不昧表扬信
2014/01/18 职场文书
决心书标准格式
2014/03/11 职场文书
初中新生军训方案
2014/05/13 职场文书
技术比武方案
2014/05/19 职场文书
竞聘演讲稿怎么写
2014/08/28 职场文书
优秀员工推荐材料
2014/12/20 职场文书
中学社团活动总结
2015/05/07 职场文书
Nginx反向代理至go-fastdfs案例讲解
2021/08/02 Servers
蓝牙耳机怎么连接电脑win11? Win11蓝牙耳机连接电脑的技巧
2023/01/09 数码科技