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 setcookie() cannot modify header information 的解决方法
Jan 09 PHP
PHP性能优化准备篇图解PEAR安装
Dec 05 PHP
php一次性删除前台checkbox多选内容的方法
Sep 22 PHP
PHP中$_FILES的使用方法及注意事项说明
Feb 14 PHP
PHP小技巧之函数重载
Jun 02 PHP
php mb_substr()函数截取中文字符串应用示例
Jul 29 PHP
推荐25款php中非常有用的类库
Sep 29 PHP
PHP Hash算法:Times33算法代码实例
May 13 PHP
php+jQuery+Ajax实现点赞效果的方法(附源码下载)
Jul 21 PHP
关于Laravel Route重定向的一个注意点
Jan 16 PHP
基于laravel where的高级使用方法
Oct 10 PHP
基于thinkphp6.0的success、error实现方法
Nov 05 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/06/01 PHP
PHP5.3连接Oracle客户端及PDO_OCI模块的安装方法
2016/05/13 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
使用PHP反射机制来构造&quot;CREATE TABLE&quot;的sql语句
2019/03/21 PHP
div移动 输入框不能输入的问题
2009/11/19 Javascript
JS左右无缝滚动(一般方法+面向对象方法)
2012/08/17 Javascript
JavaScript在XHTML中的用法详解
2013/04/11 Javascript
js跑马灯代码(自写)
2013/04/17 Javascript
jquery.ui.draggable中文文档(原文翻译)
2013/11/15 Javascript
jquery处理页面弹出层查询数据等待操作实例
2015/03/25 Javascript
JavaScript数组和循环详解
2015/04/27 Javascript
JavaScript中Number.NEGATIVE_INFINITY值的使用详解
2015/06/05 Javascript
原生JS实现网络彩票投注效果
2016/09/25 Javascript
JS操作input标签属性checkbox全选的实现代码
2017/03/02 Javascript
vue中七牛插件使用的实例代码
2017/07/28 Javascript
利用JavaScript的%做隔行换色的实例
2017/11/25 Javascript
vue进行图片的预加载watch用法实例讲解
2018/02/07 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
JS扁平化输出数组的2种方法解析
2019/09/17 Javascript
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python3.6通过自带的urllib通过get或post方法请求url的实例
2018/05/10 Python
PyCharm设置每行最大长度限制的方法
2019/01/16 Python
python实现文本进度条 程序进度条 加载进度条 单行刷新功能
2019/07/03 Python
Python读写文件模式和文件对象方法实例详解
2019/09/17 Python
Python程序暂停的正常处理方法
2019/11/07 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
纯CSS实现颜色渐变效果(包含环形渐变、线性渐变、彩虹效果等)
2014/05/07 HTML / CSS
丝芙兰巴西官方商城:SEPHORA巴西
2016/10/31 全球购物
大学生校园创业计划书
2014/02/08 职场文书
品质管理部岗位职责范文
2014/03/01 职场文书
网络技术专业求职信
2014/05/02 职场文书
2015年学雷锋活动总结
2015/02/06 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
民主生活会意见
2015/06/05 职场文书