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 相关文章推荐
PHP中str_replace函数使用小结
Oct 11 PHP
PHP文件操作实现代码分享
Sep 01 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
ThinkPHP2.x防范XSS跨站攻击的方法
Sep 25 PHP
PHP 中提示undefined index如何解决(多种方法)
Mar 16 PHP
CI操作cookie的方法分析(基于helper类库)
Mar 28 PHP
Yii框架使用魔术方法实现跨文件调用功能示例
May 20 PHP
php实现的pdo公共类定义与用法示例
Jul 19 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
YII框架关联查询操作示例
Apr 29 PHP
yii2的restful api路由实例详解
May 14 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桌面中心(三) 修改数据库
2007/03/11 PHP
php中使用preg_match_all匹配文章中的图片
2013/02/06 PHP
解决Codeigniter不能上传rar和zip压缩包问题
2014/03/07 PHP
php+ajax无刷新上传图片实例代码
2015/11/17 PHP
360搜索引擎自动收录php改写方案
2018/04/28 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
JQuery学习笔记 nt-child的使用
2011/01/17 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
javascript 动态修改css样式方法汇总(四种方法)
2015/08/27 Javascript
node学习记录之搭建web服务器教程
2017/02/16 Javascript
js利用for in循环获取 一个对象的所有属性以及值的实例
2017/03/30 Javascript
JS实现动态给标签控件添加事件的方法示例
2017/05/13 Javascript
JS基于正则实现数字千分位用逗号分隔的方法
2017/06/16 Javascript
详解微信小程序调用支付接口支付
2019/04/28 Javascript
JavaScript Dom 绑定事件操作实例详解
2019/10/02 Javascript
[56:00]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第二场
2018/04/10 DOTA
python数字图像处理之高级形态学处理
2018/04/27 Python
python爬取cnvd漏洞库信息的实例
2019/02/14 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
Python 2/3下处理cjk编码的zip文件的方法
2019/04/26 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
python 导入数据及作图的实现
2019/12/03 Python
Keras 中Leaky ReLU等高级激活函数的用法
2020/07/05 Python
基本款天堂:Everlane
2017/05/13 全球购物
美国背景检查、公共记录和人物搜索网站:BeenVerified
2018/02/25 全球购物
瑞典度假品牌:OAS
2019/05/28 全球购物
测绘工程个人的自我评价
2013/11/23 职场文书
领导干部群众路线剖析材料
2014/10/09 职场文书
教师党员群众路线教育实践活动心得体会
2014/11/04 职场文书
全国法制宣传日活动总结
2015/05/05 职场文书
学校艾滋病宣传活动总结
2015/05/09 职场文书
赢在中国观后感
2015/06/02 职场文书
解析laravel使用workerman用户交互、服务器交互
2021/04/28 PHP
mybatis中注解与xml配置的对应关系和对比分析
2021/08/04 Java/Android
关于python爬虫应用urllib库作用分析
2021/09/04 Python
Android实现获取短信验证码并自动填充
2023/05/21 Java/Android