我正在使用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;
}
...
}
答案 0 :(得分:12)
是的,你必须这样做。您不能使用成员值作为默认参数值。
From the PHP manual on Function arguments:(强调我的)
函数可以为标量参数定义C ++样式的默认值。 [...] PHP还允许使用数组和特殊类型NULL作为默认值。 [...] 默认值必须是常量表达式,而不是(例如)变量,类成员或函数调用。 [...]请注意,使用默认参数时,任何默认值都应该打开任何非默认参数的右侧;否则,事情将无法按预期发挥作用。
答案 1 :(得分: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)
答案 2 :(得分: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');
答案 3 :(得分:0)
public function place( $path, $overwrite = NULL ) {
if(!is_null($overwrite))$this->blnOverwrite = $overwrite;
...
}
但那几乎相同