2010-09-29 63 views
15

我使用PHP 5.2.6。我想为方法中的参数设置默认值,但看起来我太聪明了。我可以使用PHP中的类属性设置默认方法参数吗?

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

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

我必须这样做吗?

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

是的,这是正确的方法 – Galen 2010-09-29 15:22:03

回答

11

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

From the PHP manual on Function arguments:重点矿山

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

0

你只可以缩短它一点:

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

但那几乎相同

3

你必须这样做的,据我所知,或者使用类常量自PHP 5.3,当然,但它的固定和不能改变后,所以我一定会去你自己的解决方案:

class foo{ 
    const constant = 'bar'; 

    public function place($path, $overwrite = self::constant) { 
     die('bla' . $overwrite); 
    } 
} 

$bar = new foo(); 
$bar->place('baz'); 
10

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

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) 
相关问题