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 相关文章推荐
桌面中心(三)修改数据库
Oct 09 PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
Jan 27 PHP
php处理斐波那契数列非递归方法
Feb 04 PHP
PHP+Mysql实现多关键字与多字段生成SQL语句的函数
Nov 05 PHP
PHP集成百度Ueditor 1.4.3
Nov 23 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
Yii框架结合sphinx,Ajax实现搜索分页功能示例
Oct 18 PHP
php版微信小店API二次开发及使用示例
Nov 12 PHP
Laravel使用scout集成elasticsearch做全文搜索的实现方法
Nov 30 PHP
PHP PDOStatement::fetchAll讲解
Jan 31 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 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
中东人咖啡哲学
2021/03/03 咖啡文化
PHP 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
php采集时被封ip的解决方法
2010/08/29 PHP
php常用表单验证类用法实例
2015/06/18 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
详解Yii2 定制表单输入字段的标签和样式
2017/01/04 PHP
PHP获取php,mysql,apche的版本信息及更多服务器信息
2021/03/09 PHP
JavaScript 仿关机效果的图片层
2008/12/26 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
关于用Jquery的height()、width()计算动态插入的IMG标签的宽高的问题
2010/12/08 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
JS获取地址栏参数的小例子
2013/08/23 Javascript
js输入框邮箱自动提示功能代码实现
2013/12/10 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
Vue报错:Uncaught TypeError: Cannot assign to read only property’exports‘ of object’#‘的解决方法
2017/06/17 Javascript
Vue中如何实现轮播图的示例代码
2017/07/27 Javascript
ActiveX控件的使用-js实现打印超市小票功能代码详解
2017/11/22 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
angularjs1.5 组件内用函数向外传值的实例
2018/09/30 Javascript
nodejs遍历文件夹下并操作HTML/CSS/JS/PNG/JPG的方法
2018/11/01 NodeJs
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
Python实现动态图解析、合成与倒放
2018/01/18 Python
Python lxml解析HTML并用xpath获取元素的方法
2019/01/02 Python
浅谈Python中threading join和setDaemon用法及区别说明
2020/05/02 Python
Python实现CAN报文转换工具教程
2020/05/05 Python
Python脚本打包成可执行文件过程解析
2020/10/20 Python
使用css3和jquery实现可伸缩搜索框
2014/02/12 HTML / CSS
html5中的input新属性range使用记录
2014/09/05 HTML / CSS
微软马来西亚官方网站:Microsoft马来西亚
2019/11/22 全球购物
武汉某公司的C#笔试题面试题
2015/12/25 面试题
经济管理专业毕业生推荐信
2013/11/11 职场文书
荷叶母亲教学反思
2014/04/30 职场文书
秋季运动会广播稿(30篇)
2014/09/13 职场文书
中英文求职信范文
2015/03/19 职场文书
2015小学音乐教师个人工作总结
2015/07/21 职场文书