【问题标题】:PHP Using $this->variable as Class Method Parameter Default ValuePHP 使用 $this->variable 作为类方法参数默认值
【发布时间】:2013-01-31 21:57:06
【问题描述】:

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

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

即……

class something {

public somevar = 'someval';

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

}



}

【问题讨论】:

标签: php class variables default


【解决方案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 它还可以用于自动化框架的某些部分
    猜你喜欢
    • 2013-09-06
    • 2017-07-25
    • 2013-04-27
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 2011-03-06
    • 2015-12-10
    • 2019-05-20
    相关资源
    最近更新 更多