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 全文搜索和替换的实现代码
Jul 29 PHP
php读取msn上的用户信息类
Dec 05 PHP
Thinkphp模板中使用自定义函数的方法
Sep 23 PHP
mod_php、FastCGI、PHP-FPM等PHP运行方式对比
Jul 02 PHP
PHP 返回13位时间戳的实现代码
May 13 PHP
php排序算法实例分析
Oct 17 PHP
php获取访问者浏览页面的浏览器类型
Jan 23 PHP
Laravel框架中Blade模板的用法示例
Aug 30 PHP
CodeIgniter框架数据库基本操作示例
May 24 PHP
PHP中常见的密码处理方式和建议总结
Oct 14 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
PHP如何使用array_unshift()在数组开头插入元素
Sep 01 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
DedeCms模板安装/制作概述
2007/03/11 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php中ob函数缓冲机制深入理解
2015/08/03 PHP
PHP二维数组实现去除重复项的方法【保留各个键值】
2017/12/21 PHP
PHP自动载入类文件函数__autoload的使用方法
2019/03/25 PHP
php实现统计IP数及在线人数的示例代码
2020/07/22 PHP
javascript获得服务器端控件的ID的实现代码
2011/12/28 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
javascript获取form里的表单元素的示例代码
2014/02/14 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
JavaScript中的数组特性介绍
2014/12/30 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
微信小程序 本地数据存储实例详解
2017/04/13 Javascript
使用node.js搭建服务器
2017/05/20 Javascript
jquery animate动画持续运动的实例
2017/11/29 jQuery
快速解决vue在ios端下点击响应延时的问题
2018/08/27 Javascript
微信小程序开发之路由切换页面重定向问题
2018/09/18 Javascript
我要点爆”微信小程序云开发之项目建立与我的页面功能实现
2019/05/26 Javascript
ECharts地图绘制和钻取简易接口详解
2019/07/12 Javascript
js实现鼠标点击飘爱心效果
2020/08/19 Javascript
Python中使用Flask、MongoDB搭建简易图片服务器
2015/02/04 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
python pyheatmap包绘制热力图
2018/11/09 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
python设计微型小说网站(基于Django+Bootstrap框架)
2019/07/08 Python
Django之创建引擎索引报错及解决详解
2019/07/17 Python
实习生自荐信范文
2013/11/13 职场文书
财务专业大学生职业生涯规划范文
2013/12/30 职场文书
英语教师岗位职责
2014/03/16 职场文书
2014机关干部学习“焦裕禄精神”思想汇报
2014/09/19 职场文书
2014年工作总结与下年工作计划
2014/11/27 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
给客户的感谢信
2015/01/21 职场文书
法定代表人免职证明
2015/06/24 职场文书