PHP 使用 $this->variable 作为类方法参数默认值
Posted
技术标签:
【中文标题】PHP 使用 $this->variable 作为类方法参数默认值【英文标题】:PHP Using $this->variable as Class Method Parameter Default Value 【发布时间】:2013-01-31 21:57:06 【问题描述】:好吧,这似乎是一个非常愚蠢的问题,但 php 告诉我我不能这样做,或者更确切地说是我的 IDE...
在下面的示例中,它告诉我不能使用 $this->somevar 作为该方法的默认值。
即……
class something
public somevar = 'someval';
private function somefunc($default = $this->somevar)
【问题讨论】:
default method argument with class property? 的可能重复项 【参考方案1】:恐怕您的 IDE 是正确的。这是因为“默认值必须是常量表达式,而不是(例如)变量、类成员或函数调用。” — Function arguments
你需要这样做:
class something
public $somevar = 'someval';
private function somefunc($default = null)
if ($default === null)
$default = $this->somevar;
这也可以使用ternary operator:
$default = $default ?: $this->somevar;
【讨论】:
你可以使用我的小库 ValueResolver 让它更紧凑 小错误public somevar = 'someval';
缺少 $ 并且应该是 public $somevar = 'someval';
我复制并粘贴以重新制作它并丢失了大约 30 秒的混乱。在这里张贴,以防另一个麻木头骨出现!
哇,看起来 Victor 和我都复制了 OP,但从未注意到错误!谢谢,已修复:-)【参考方案2】:
"[函数参数的]默认值必须是常量表达式,而不是(例如) 变量、类成员或函数调用。”
http://php.net/manual/en/functions.arguments.php
【讨论】:
【参考方案3】:在这种情况下,您可以使用我的小型库 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)
查看docs 了解更多示例
【讨论】:
你为什么要添加一个完整的 3rd 方包只是为了做像$default = $default ?: $this->somevar;
这样简单的事情?
几乎没有其他方法可以对其进行类型转换。另外,我打算让这个库更复杂,以避免在代码中使用isset
函数
@harryg 它还可以用于自动化框架的某些部分以上是关于PHP 使用 $this->variable 作为类方法参数默认值的主要内容,如果未能解决你的问题,请参考以下文章
Only variables should be assigned by reference
PHP 替代 if (!isset(...)) ... => GetVar($Variable, $ValueIfNotExists)