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 相关文章推荐
PHP5 操作MySQL数据库基础代码
Sep 29 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
发款php蜘蛛统计插件只要有mysql就可用
Oct 12 PHP
关于访问控制的一首PHP面试题(对属性或方法的访问控制)
Sep 13 PHP
php单例模式实现(对象只被创建一次)
Dec 05 PHP
destoon实现调用自增数字从1开始的方法
Aug 21 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
Mar 07 PHP
php多文件打包下载的实例代码
Jul 12 PHP
php+redis实现商城秒杀功能
Nov 19 PHP
php微信开发之谷歌测距
Jun 14 PHP
Yii 使用intervention/image拓展实现图像处理功能
Jun 22 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
Nov 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
php下清空字符串中的HTML标签的代码
2010/09/06 PHP
关于Iframe如何跨域访问Cookie和Session的解决方法
2013/04/15 PHP
php输入数据统一类实例
2015/02/23 PHP
PHP引用返回用法示例
2016/05/28 PHP
Laravel中错误与异常处理的用法示例
2018/09/16 PHP
jquery加载页面的方法(页面加载完成就执行)
2011/06/21 Javascript
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
单击某一段文字改写文本颜色
2014/06/06 Javascript
javascript实现textarea中tab键的缩排处理方法
2015/06/26 Javascript
AngularJS 表达式详解及实例代码
2016/09/14 Javascript
AngularJS ui-router (嵌套路由)实例
2017/03/10 Javascript
AngularJS表单验证功能分析
2017/05/26 Javascript
Require.js的基本用法详解
2017/07/03 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
使用 Vue 绑定单个或多个 Class 名的实例代码
2018/01/08 Javascript
小程序跨页面交互的作用与方法详解
2020/01/07 Javascript
Python使用urllib2获取网络资源实例讲解
2013/12/02 Python
Python对list列表结构中的值进行去重的方法总结
2016/05/07 Python
Python的包管理器pip更换软件源的方法详解
2016/06/20 Python
TensorFlow实现MLP多层感知机模型
2018/03/09 Python
Python for循环生成列表的实例
2018/06/15 Python
python爬虫自动创建文件夹的功能
2018/08/01 Python
对python多线程与global变量详解
2018/11/09 Python
解决pycharm同一目录下无法import其他文件
2020/02/12 Python
django rest framework serializer返回时间自动格式化方法
2020/03/31 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
Python中使用Selenium环境安装的方法步骤
2021/02/22 Python
同程旅游英文网站:LY.com
2018/11/13 全球购物
公司前台辞职报告
2014/01/19 职场文书
草船借箭教学反思
2014/02/03 职场文书
公司任命书模板
2014/06/06 职场文书
超市店庆活动方案
2014/08/31 职场文书
保安2014年终工作总结
2014/12/06 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
教你使用TensorFlow2识别验证码
2021/06/11 Python