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数组是否为空的代码
Sep 08 PHP
PHP5中实现多态的两种方法实例分享
Apr 21 PHP
Codeigniter操作数据库表的优化写法总结
Jun 12 PHP
php数组索引的Key加引号和不加引号的区别
Aug 19 PHP
PHP中常见的缓存技术实例分析
Sep 23 PHP
Laravel如何友好的修改.env配置文件详解
Jun 07 PHP
PHP curl批处理及多请求并发实现方法分析
Aug 15 PHP
php实现有序数组旋转后寻找最小值方法
Sep 27 PHP
对php 判断http还是https,以及获得当前url的方法详解
Jan 15 PHP
vmware linux系统安装最新的php7图解
Apr 14 PHP
php链式操作的实现方式分析
Aug 12 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
Feb 27 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
Zend Framework教程之Zend_Layout布局助手详解
2016/03/04 PHP
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
2010/05/18 Javascript
基于jQuery实现的Ajax 验证用户名是否存在的实现代码
2011/04/06 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
JavaScript 选中文字并响应获取的实现代码
2011/08/28 Javascript
一个js导致的jquery失效问题的解决方法
2013/11/27 Javascript
Nodejs中自定义事件实例
2014/06/20 NodeJs
javasript实现密码的隐藏与显示
2015/05/08 Javascript
JQuery实现超链接鼠标提示效果的方法
2015/06/10 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
2015/08/14 Javascript
js制作带有遮罩弹出层实现登录注册表单特效代码分享
2015/09/05 Javascript
原生JS+CSS实现炫酷重力模拟弹跳系统的登录页面
2017/11/01 Javascript
JS实现数组简单去重及数组根据对象中的元素去重操作示例
2018/01/05 Javascript
详解webpack模块加载器兼打包工具
2018/09/11 Javascript
详解JavaScript类型判断的四种方法
2020/10/21 Javascript
python实现提取百度搜索结果的方法
2015/05/19 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
2018/05/09 Python
Python3获取电脑IP、主机名、Mac地址的方法示例
2019/04/11 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
Python实现栈和队列的简单操作方法示例
2019/11/29 Python
pytorch 图像中的数据预处理和批标准化实例
2020/01/15 Python
python orm 框架中sqlalchemy用法实例详解
2020/02/02 Python
Matplotlib.pyplot 三维绘图的实现示例
2020/07/28 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
微软日本官方网站:Microsoft日本
2017/11/26 全球购物
夏洛特和乔治婴儿和儿童时装精品店:Charlotte and George
2018/06/06 全球购物
jurlique茱莉蔻英国官网:澳洲天然护肤品
2018/08/03 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
学前教育毕业生自荐信范文
2013/12/24 职场文书
部队学习十八大感言
2014/01/11 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
关于雷锋的演讲稿
2014/05/10 职场文书
2015年秋季校长开学典礼致辞
2015/07/29 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书