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 相关文章推荐
对盗链说再见...
Oct 09 PHP
PHP取整数函数常用的四种方法小结
Jul 05 PHP
深入解析yii权限分级式访问控制的实现(非RBAC法)
Jun 13 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
Jun 19 PHP
解析phpstorm + xdebug 远程断点调试
Jun 20 PHP
php实现向javascript传递数组的方法
Jul 27 PHP
详解WordPress开发中用于获取分类及子页面的函数用法
Jan 08 PHP
PHP实现一个多功能购物网站的案例
Sep 13 PHP
使用 laravel sms 构建短信验证码发送校验功能
Nov 06 PHP
PHP大文件切割上传并带进度条功能示例
Jul 01 PHP
七种PHP开发环境搭建工具
Jun 28 PHP
浅析PHP中json_encode与json_decode的区别
Jul 15 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
ThinkPHP3.1新特性之动态设置自动完成和自动验证示例
2014/06/19 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
jQuery EasyUI API 中文文档 搜索框
2011/09/29 Javascript
javascript之Partial Application学习
2013/01/10 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
详谈AngularJs 控制器、数据绑定、作用域
2017/07/09 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
vue 项目如何引入微信sdk接口的方法
2017/12/18 Javascript
js实现左右两侧浮动广告
2018/07/09 Javascript
JavaScript常见事件对象与操作实例总结
2019/01/05 Javascript
解决vue+ element ui 表单验证有值但验证失败问题
2020/01/16 Javascript
JavaScript中this函数使用实例解析
2020/02/21 Javascript
微信小程序个人中心的列表控件实现代码
2020/04/26 Javascript
浅谈vue中resetFields()使用注意事项
2020/08/12 Javascript
Ant design vue table 单击行选中 勾选checkbox教程
2020/10/24 Javascript
[53:49]LGD vs Fnatic 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
[58:35]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
[48:11]完美世界DOTA2联赛 Magma vs GXR 第二场 11.07
2020/11/10 DOTA
matplotlib绘图实例演示标记路径
2018/01/23 Python
python之文件读取一行一行的方法
2018/07/12 Python
解决python3 requests headers参数不能有中文的问题
2019/08/21 Python
python爬虫 正则表达式解析
2019/09/28 Python
Matplotlib使用字符串代替变量绘制散点图的方法
2020/02/17 Python
详解selenium + chromedriver 被反爬的解决方法
2020/10/28 Python
python中spy++的使用超详细教程
2021/01/29 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
CSS3制作文字半透明倒影效果的两种实现方式
2014/08/08 HTML / CSS
4s店活动策划方案
2014/08/25 职场文书
银行培训心得体会范文
2016/01/09 职场文书
Django利用AJAX技术实现博文实时搜索
2021/05/06 Python
使用php的mail()函数实现发送邮件功能
2021/06/03 PHP
仅用几行Python代码就能复制她的U盘文件?
2021/06/26 Python