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 file_exists 检查文件或目录是否存在的函数
May 10 PHP
PHP分页函数代码(简单实用型)
Dec 02 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
使用php验证复选框有效性的示例
Nov 13 PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 PHP
PHP面向对象教程之自定义类
Jun 10 PHP
php中常见的sql攻击正则表达式汇总
Nov 06 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
深入讲解PHP的Yii框架中的属性(Property)
Mar 18 PHP
phpmailer简单发送邮件的方法(附phpmailer源码下载)
Jun 13 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
PHP 爬取网页的主要方法
Jul 13 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实现可运算的验证码
2015/11/10 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
PHP实现文件上传操作和封装
2020/03/04 PHP
整理的比较全的event对像在ie与firefox浏览器中的区别
2013/11/25 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
javascript动态添加、修改、删除对象的属性与方法详解
2014/01/27 Javascript
JavaScript中的类(Class)详细介绍
2014/12/30 Javascript
jquery插件validation实现验证身份证号等
2015/06/04 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
2015/08/21 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
2016/01/08 Javascript
基于javascript编写简单日历
2016/05/02 Javascript
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
基于Vue2x的图片预览插件的示例代码
2018/05/14 Javascript
深入理解Puppeteer的入门教程和实践
2019/03/05 Javascript
详解Vue+Element的动态表单,动态表格(后端发送配置,前端动态生成)
2019/04/20 Javascript
CountUp.js数字滚动插件使用方法详解
2019/10/17 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
2020/04/10 Javascript
深入webpack打包原理及loader和plugin的实现
2020/05/06 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
Python开发的单词频率统计工具wordsworth使用方法
2014/06/25 Python
Python实现将SQLite中的数据直接输出为CVS的方法示例
2017/07/13 Python
Python为何不能用可变对象作为默认参数的值
2019/07/01 Python
win8.1安装Python 2.7版环境图文详解
2019/07/01 Python
python tkinter组件摆放方式详解
2019/09/16 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
表达自我的市场:Society6
2018/08/01 全球购物
亿企通软件测试面试题
2012/04/10 面试题
思想汇报范文
2013/11/04 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
我的中国心演讲稿
2014/09/04 职场文书
群众路线组织生活会发言材料
2014/10/17 职场文书
歌舞青春观后感
2015/06/10 职场文书
python使用PySimpleGUI设置进度条及控件使用
2021/06/10 Python