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 相关文章推荐
apache+php完美解决301重定向的两种方法
Jun 08 PHP
php日历制作代码分享
Jan 20 PHP
PHP实现货币换算的方法
Nov 29 PHP
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
Jun 17 PHP
php生成验证码,缩略图及水印图的类分享
Apr 07 PHP
PHP二进制与字符串之间的相互转换教程
Oct 14 PHP
PHP使用curl制作简易百度搜索
Nov 03 PHP
浅谈PHP中try{}catch{}的使用方法
Dec 09 PHP
PHP两种实现无级递归分类的方法
Mar 02 PHP
PHP中的Iterator迭代对象属性详解
Apr 12 PHP
PHP超低内存遍历目录文件和读取超大文件的方法
May 01 PHP
php设计模式之抽象工厂模式分析【星际争霸游戏案例】
Jan 23 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执行.SQL文件
2013/07/05 PHP
PHP自定session保存路径及删除、注销与写入的方法
2014/11/18 PHP
ThinkPHP框架安全实现分析
2016/03/14 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
找出字符串中出现次数最多的字母和出现次数精简版
2012/11/07 Javascript
借助script进行Http跨域请求:JSONP实现原理及代码
2013/03/19 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
jQuery源码解读之addClass()方法分析
2015/02/20 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
原生和jQuery的ajax用法详解
2017/01/23 Javascript
javascript按顺序加载运行js方法
2017/12/01 Javascript
浏览器调试动态js脚本的方法(图解)
2018/01/19 Javascript
解决vue单页使用keep-alive页面返回不刷新的问题
2018/03/13 Javascript
vue项目关闭eslint校验
2018/03/21 Javascript
工作中常用到的ES6语法
2018/09/04 Javascript
React Native 混合开发多入口加载方式详解
2019/09/23 Javascript
Vue封装全局过滤器Filters的步骤
2020/09/16 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
pygame学习笔记(4):声音控制
2015/04/15 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
python实现批量视频分帧、保存视频帧
2019/05/31 Python
python实现在函数图像上添加文字和标注的方法
2019/07/08 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
python opencv实现简易画图板
2020/08/27 Python
Selenium关闭INFO:CONSOLE提示的解决
2020/12/07 Python
关于HTML5 Placeholder新标签低版本浏览器下不兼容的问题分析及解决办法
2016/01/27 HTML / CSS
HTML5标签嵌套规则详解【必看】
2016/04/26 HTML / CSS
遮罩层 + Iframe实现界面自动显示的示例代码
2020/04/26 HTML / CSS
俄罗斯眼镜网: optikaworld
2016/07/31 全球购物
攀岩、滑雪、徒步旅行装备:Black Diamond Equipment
2019/08/16 全球购物
社区综治工作汇报
2014/10/27 职场文书
2014年节能工作总结
2014/12/18 职场文书
单身证明范本
2015/06/15 职场文书
2019财务转正述职报告
2019/06/27 职场文书
高中优秀作文(范文)
2019/08/15 职场文书
详解Flutter自定义应用程序内键盘的实现方法
2022/06/14 Java/Android