【问题标题】:Can I set up a default method argument with class property in PHP?我可以在 PHP 中使用类属性设置默认方法参数吗?
【发布时间】:2010-09-29 15:18:19
【问题描述】:

我使用的是 PHP 5.2.6。我想为方法中的参数设置默认值,但似乎我有点太聪明了。

类属性blnOverwrite 是默认的并且可以在类的其他地方设置。我有一个方法,我想让它再次可设置,但不覆盖现有值。尝试此操作时出现错误:

public function place( $path, $overwrite = $this->blnOverwrite ) { ... }

我必须这样做吗?

public function place( $path, $overwrite = NULL ) { 
    if ( ! is_null($overwrite) ) {
        $this->blnOverwrite = $overwrite;
    }
    ...
}

【问题讨论】:

    标签: php default


    【解决方案1】:

    是的,你必须这样做。您不能将成员值用作默认参数值。

    From the PHP manual on Function arguments:强调我的

    函数可以为标量参数定义 C++ 风格的默认值。 […] PHP 还允许使用数组和特殊类型 NULL 作为默认值。 [...] 默认值必须是常量表达式,而不是(例如)变量、类成员或函数调用。 [...] 请注意,当使用默认参数时,任何默认值都应该打开任何非默认参数的右侧;否则,事情将无法按预期进行。

    【讨论】:

      【解决方案2】:

      你绝对可以做到这一点。两全其美:使用类常量初始化您的默认属性和方法的默认参数。

      class Object {
      
          const DEFAULT_BLNOVERWRITE = TRUE;
      
          protected $blnOverwrite = self::DEFAULT_BLNOVERWRITE;
      
          public function place($path, $overwrite = self::DEFAULT_BLNOVERWRITE) {
              var_dump($overwrite);
          }
      }
      
      $Object = new Object();
      $Object->place('/'); //bool(true)
      

      【讨论】:

        【解决方案3】:

        你必须这样做,afaik,或者使用自 php 5.3 起的类常量,但当然它是固定的,以后不能更改,所以我肯定会使用你自己的解决方案:

        class foo{
            const constant = 'bar';
        
            public function place($path, $overwrite = self::constant ) { 
                die('bla' . $overwrite);
            }
        }
        
        $bar = new foo();
        $bar->place('baz');
        

        【讨论】:

          【解决方案4】:

          你可以把它缩短一点:

          public function place( $path, $overwrite = NULL ) { 
              if(!is_null($overwrite))$this->blnOverwrite = $overwrite;
              ...
          }
          

          但那几乎是一样的

          【讨论】: