PHP使用$this->variable作为类方法参数默认值

11

好的,这似乎是一个相当愚蠢的问题,但PHP告诉我我不能这样做,或者更确切地说是我的IDE...

在下面的例子中,它告诉我不能使用$this->somevar作为该方法的默认值。

也就是说...

class something {

public somevar = 'someval';

private function somefunc($default = $this->somevar) {

}



}

可能是默认方法参数与类属性?的重复问题。 - kapa
3个回答

21

恐怕你的IDE是正确的。这是因为“默认值必须是一个常量表达式,不能是变量、类成员或函数调用(例如)。”—函数参数

你需要做类似于这样的事情:

class something {

    public $somevar = 'someval';

    private function somefunc($default = null) {
        if ($default === null) {
            $default = $this->somevar;
        }
    }
}

这个也可以使用三元运算符来写:

$default = $default ?: $this->somevar;

你可以使用我的小型库ValueResolver来更紧凑地完成它。 - Victor Bocharsky
微小的错误 public somevar = 'someval'; 缺少了 $,应该是 public $somevar = 'someval'; 我只是复制并重新编辑,却因此浪费了约30秒钟,感到十分困惑。我在此发布,以防其他人也犯同样的错误! - BeNice
哇,看起来维克多和我都复制了原始帖子,却没有注意到错误!谢谢,已经修复 :-) - cmbuckley

5

0

在这种情况下,你可以使用我的小型库ValueResolver,例如:

class something {

    public somevar = 'someval';

    private function somefunc($default = null) {
        $default = ValueResolver::resolve($default, $this->somevar); // returns $this->somevar value if $default is empty
    }
}

不要忘记使用命名空间use LapaLabs\ValueResolver\Resolver\ValueResolver;

还有类型转换的能力,例如如果您的变量值应该是integer,那么请使用以下代码:

$id = ValueResolver::toInteger('6 apples', 1); // returns 6
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)

请查看文档以获取更多示例


为什么要添加整个第三方包来执行像$default = $default ?: $this->somevar;这样简单的操作呢? - harryg
有一些额外的类型转换方法。此外,我计划使这个库更加复杂,以避免在代码中使用 isset 函数。 - Victor Bocharsky
@harryg 这也将有助于使用它自动化框架的某些部分。 - Victor Bocharsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接