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开发文件系统实例讲解
Oct 09 PHP
php设计模式 Singleton(单例模式)
Jun 26 PHP
Sorting Array Values in PHP(数组排序)
Sep 15 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
Jun 06 PHP
深入php 正则表达式的学习探讨
Jun 06 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
Aug 19 PHP
PHP邮件发送类PHPMailer用法实例详解
Sep 22 PHP
Yii配置文件用法详解
Dec 04 PHP
PHP正则表达式过滤html标签属性(DEMO)
May 04 PHP
thinkPHP3.2简单实现文件上传的方法
May 16 PHP
浅谈PHP的排列组合(如输入a,b,c 输出他们的全部组合)
Mar 14 PHP
详解PHP用mb_string处理windows中文字符
May 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中显示格式化的用户输入
2006/10/09 PHP
PHP教程 基本语法
2009/10/23 PHP
分割GBK中文遭遇乱码的解决方法
2013/08/09 PHP
使用XHGui来测试PHP性能的教程
2015/07/03 PHP
PHP实现批量删除(封装)
2017/04/28 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
css动画效果之animation的常用样式
2021/03/09 HTML / CSS
js静态作用域的功能。
2006/12/25 Javascript
一个刚完成的layout(拖动流畅,不受iframe影响)
2007/08/17 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
Jquery 数组操作大全个人总结
2013/11/13 Javascript
基于JavaScript制作霓虹灯文字 代码 特效
2015/09/01 Javascript
AngularJS基础 ng-src 指令简单示例
2016/08/03 Javascript
手机端js和html5刮刮卡效果
2020/09/29 Javascript
详解微信小程序设置底部导航栏目方法
2017/06/29 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
vue实现路由监听和参数监听
2019/10/29 Javascript
vue分页插件的使用方法
2019/12/25 Javascript
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
浅谈flask中的before_request与after_request
2018/01/20 Python
为什么入门大数据选择Python而不是Java?
2018/03/07 Python
django模板加载静态文件的方法步骤
2019/03/01 Python
python 遍历pd.Series的index和value
2019/11/26 Python
Django 如何使用日期时间选择器规范用户的时间输入示例代码详解
2020/05/22 Python
用Java语言将一个键盘输入的数字转化成中文输出
2013/01/25 面试题
社团招新策划书
2014/02/04 职场文书
电子商务优秀毕业生求职信
2014/07/11 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
2015年支教教师工作总结
2015/07/22 职场文书
生产设备维护保养制度
2015/08/06 职场文书
宣传委员竞选稿
2015/11/19 职场文书
2016教师给学生的毕业寄语
2015/12/04 职场文书