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初学者常见问题集合 修正版(21问答)
Mar 23 PHP
discuz的php防止sql注入函数
Jan 17 PHP
php 文件上传实例代码
Apr 19 PHP
php中的注释、变量、数组、常量、函数应用介绍
Nov 16 PHP
基于php设计模式中工厂模式详细介绍
May 15 PHP
php计算程序运行时间的简单例子分享
May 10 PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 PHP
PHP Callable强制指定回调类型的方法
Aug 30 PHP
Laravel5中防止XSS跨站攻击的方法
Oct 10 PHP
php快速导入大量数据的实例方法
Sep 23 PHP
浅谈laravel数据库查询返回的数据形式
Oct 21 PHP
Laravel中获取IP的真实地理位置
Apr 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
杏林同学录(二)
2006/10/09 PHP
一个PHP二维数组排序的函数分享
2014/01/17 PHP
php计算2个日期的差值函数分享
2015/02/02 PHP
thinkphp框架下实现登录、注册、找回密码功能
2016/04/06 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
javascript不同页面传值的改进版
2008/09/30 Javascript
struts2 jquery 打造无限层次的树
2009/10/23 Javascript
Web Inspector:关于在 Sublime Text 中调试Js的介绍
2013/04/18 Javascript
jQuery获取选中内容及设置元素属性的方法
2014/07/09 Javascript
node.js中的fs.linkSync方法使用说明
2014/12/15 Javascript
JavaScript显示表单内元素数量的方法
2015/04/02 Javascript
Angular在一个页面中使用两个ng-app的方法
2017/02/20 Javascript
vue中子组件向父组件传递数据的实例代码(实现加减功能)
2018/04/20 Javascript
vue中的计算属性实例详解
2018/09/19 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
vue实现在线学生录入系统
2020/05/30 Javascript
vue 解决addRoutes多次添加路由重复的操作
2020/08/04 Javascript
微信小程序实现转盘抽奖
2020/09/21 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
[03:11]完美世界DOTA2联赛PWL DAY8集锦
2020/11/09 DOTA
python中string模块各属性以及函数的用法介绍
2016/05/30 Python
python3.4用函数操作mysql5.7数据库
2017/06/23 Python
Python实现求数列和的方法示例
2018/01/12 Python
快速解决安装python没有scripts文件夹的问题
2018/04/03 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
python os.fork() 循环输出方法
2019/08/08 Python
python 函数的缺省参数使用注意事项分析
2019/09/17 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
HTML5中的Article和Section元素认识及使用
2013/03/22 HTML / CSS
HTML5自定义视频播放器源码
2020/01/06 HTML / CSS
匈牙利墨盒和碳粉购买网站:CDRmarket
2018/04/14 全球购物
十八大闭幕感言
2014/01/22 职场文书
避暑山庄导游词
2015/02/04 职场文书
聚会通知怎么写
2015/04/23 职场文书
pandas取dataframe特定行列的实现方法
2021/05/24 Python