首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP函数重载

PHP函数重载
EN

Stack Overflow用户
提问于 2011-01-15 11:03:01
回答 9查看 165.1K关注 0票数 211

来自C++背景;)

如何重载PHP函数?

如果有任何参数就定义一个函数,如果没有参数就定义另一个函数?这在PHP中是可能的吗?或者我应该使用if else来检查是否有任何参数从$_GET和POST传递过来??并将它们联系起来?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2011-01-15 11:04:55

您不能重载PHP函数。函数签名仅基于它们的名称,不包括参数列表,因此不能有两个同名的函数。PHP中的method overloading类与许多其他语言中的不同。PHP使用相同的单词,但它描述了不同的模式。

但是,您可以声明一个接受可变数量参数的variadic function。您将使用func_num_args()func_get_arg()来获取传递的参数,并正常使用它们。

例如:

代码语言:javascript
复制
function myFunc() {
    for ($i = 0; $i < func_num_args(); $i++) {
        printf("Argument %d: %s\n", $i, func_get_arg($i));
    }
}

/*
Argument 0: a
Argument 1: 2
Argument 2: 3.5
*/
myFunc('a', 2, 3.5);
票数 238
EN

Stack Overflow用户

发布于 2011-01-15 11:25:57

PHP不支持传统的方法重载,但是有一种方法可以实现你想要的,那就是使用__call的神奇方法:

代码语言:javascript
复制
class MyClass {
    public function __call($name, $args) {

        switch ($name) {
            case 'funcOne':
                switch (count($args)) {
                    case 1:
                        return call_user_func_array(array($this, 'funcOneWithOneArg'), $args);
                    case 3:
                        return call_user_func_array(array($this, 'funcOneWithThreeArgs'), $args);
                 }
            case 'anotherFunc':
                switch (count($args)) {
                    case 0:
                        return $this->anotherFuncWithNoArgs();
                    case 5:
                        return call_user_func_array(array($this, 'anotherFuncWithMoreArgs'), $args);
                }
        }
    }

    protected function funcOneWithOneArg($a) {

    }

    protected function funcOneWithThreeArgs($a, $b, $c) {

    }

    protected function anotherFuncWithNoArgs() {

    }

    protected function anotherFuncWithMoreArgs($a, $b, $c, $d, $e) {

    }

}
票数 84
EN

Stack Overflow用户

发布于 2013-06-11 18:10:39

要重载函数,只需在默认情况下将参数作为null传递,

代码语言:javascript
复制
class ParentClass
{
   function mymethod($arg1 = null, $arg2 = null, $arg3 = null)  
     {  
        if( $arg1 == null && $arg2 == null && $arg3 == null ){ 
           return 'function has got zero parameters <br />';
        }
        else
        {
           $str = '';
           if( $arg1 != null ) 
              $str .= "arg1 = ".$arg1." <br />";

           if( $arg2 != null ) 
              $str .= "arg2 = ".$arg2." <br />";

           if( $arg3 != null ) 
              $str .= "arg3 = ".$arg3." <br />";

           return $str;
         }
     }
}

// and call it in order given below ...

 $obj = new ParentClass;

 echo '<br />$obj->mymethod()<br />';
 echo $obj->mymethod();

 echo '<br />$obj->mymethod(null,"test") <br />';
 echo $obj->mymethod(null,'test');

 echo '<br /> $obj->mymethod("test","test","test")<br />';
 echo $obj->mymethod('test','test','test');
票数 31
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4697705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档