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 相关文章推荐
NO3第三帝国留言簿制作过程
Oct 09 PHP
php输出echo、print、print_r、printf、sprintf、var_dump的区别比较
Jun 21 PHP
PHP检测移动设备类mobile detection使用实例
Apr 14 PHP
php利用scws实现mysql全文搜索功能的方法
Dec 25 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
Mar 12 PHP
php实现在站点里面添加邮件发送的功能
Apr 28 PHP
PHP自定义函数实现数组比较功能示例
Oct 19 PHP
PHP面向对象程序设计之接口的继承定义与用法详解
Dec 20 PHP
Laravel框架Auth用户认证操作实例分析
Sep 29 PHP
Laravel基础_关于view共享数据的示例讲解
Oct 14 PHP
php 中self,this的区别和操作方法实例分析
Nov 04 PHP
TP5框架安全机制实例分析
Apr 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php str_pad 函数使用详解
2009/01/13 PHP
php+javascript的日历控件
2009/11/19 PHP
php 注释规范
2012/03/29 PHP
THINKPHP3.2使用soap连接webservice的解决方法
2017/12/13 PHP
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
JS使用for循环遍历Table的所有单元格内容
2014/08/21 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
即将发布的jQuery 3 有哪些新特性
2016/04/14 Javascript
深入剖析JavaScript面向对象编程
2016/07/12 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
Vue.js每天必学之Class与样式绑定
2016/09/05 Javascript
JS扩展类,克隆对象与混合类实例分析
2016/11/26 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
微信小程序中的canvas 文字断行和省略号显示功能的处理方法
2018/11/14 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
2021/01/07 Vue.js
[16:01]夜魇凡尔赛茶话会 第二期01:你比划我猜
2021/03/11 DOTA
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
python使用itchat库实现微信机器人(好友聊天、群聊天)
2018/01/04 Python
几种实用的pythonic语法实例代码
2018/02/24 Python
Python-Seaborn热图绘制的实现方法
2019/07/15 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
python通过链接抓取网站详解
2019/11/20 Python
Pandas对DataFrame单列/多列进行运算(map, apply, transform, agg)
2020/06/14 Python
如何通过安装HomeBrew来安装Python3
2020/12/23 Python
你应该知道的30个css选择器
2014/03/19 HTML / CSS
飞利浦法国官网:Philips法国
2019/07/10 全球购物
大学新生军训感言
2014/02/25 职场文书
高考1977观后感
2015/06/04 职场文书
病假条格式范文
2015/08/17 职场文书
JavaScript实现两个数组的交集
2022/03/25 Javascript
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技
Docker安装MySql8并远程访问的实现
2022/07/07 Servers
apache虚拟主机配置的三种方式(小结)
2022/07/23 Servers