【问题标题】:php redeclaring function like in java [duplicate]php在java中重新声明函数[重复]
【发布时间】:2012-12-31 05:54:53
【问题描述】:

可能重复:
php function overloading

我想重新声明这样的函数:

class Name{
    function a(){ something; }
    function a($param1){ something; }
}

但它会返回

Fatal error: Cannot redeclare Name::a()

在java中它只是工作。如何在 PHP 中做到这一点?

【问题讨论】:

标签: java php overloading redeclare


【解决方案1】:

使用默认参数:

class Name{
    function a($param1=null){ something; }
}

如果没有参数传递给Name::a(),它将分配一个$param1,其值为null。所以基本上传递该参数成为可选的。如果你需要知道它是否有值,你可以做一个简单的检查:

if (!is_null($param1))
{
 //do something
}

【讨论】:

  • 电缆太繁琐了... =(但是谢谢!它有效...
【解决方案2】:

您不会重新声明函数。相反,您可以通过为其分配默认值来使参数成为可选。像这样:

function a($param1 = null){ something; }

【讨论】:

    【解决方案3】:

    函数参数不能唯一标识一个函数。在 Java 中,参数是严格定义的。这使编译器可以知道您正在调用哪个函数。

    但是,在 PHP 中,情况并非如此。

    function a()
    {
        $args = func_get_args();
        foreach($args as $value)
        {
            echo $value;
        }
    }
    

    可以创建没有参数定义的函数,但仍然传递参数。

    a("你好","世界")

    会输出

    你好世界

    因此,PHP 无法区分 a() 和 a($arg)。因此,a() 已经定义好了。

    PHP 程序员有不同的做法来处理这个单函数问题。

    您可以使用默认值定义参数。

    a($arg = 'hello world');

    您可以传递混合变量类型。

     function a($mixed)
     {
         if(is_bool($mixed))
         {
             .....
         }
         if(is_string($mixed))
         {
             .....
         }
     }
    

    我的偏好是使用带有默认值的数组。它更加灵活。

     function a($options=array())
     {
           $default = array('setting'=>true);
           $options = array_merge($default,$options);
           ....
     }
    
     a(array('setting'=>false);
    

    【讨论】:

      【解决方案4】:

      不幸的是,PHP 不像 Java 那样支持方法重载。在这里查看解决方案:PHP function overloading
      所以func_get_args() 是要走的路:

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 2011-09-12
        • 2016-10-31
        • 1970-01-01
        • 2013-05-02
        • 2011-07-17
        • 2011-11-24
        • 2010-11-19
        相关资源
        最近更新 更多