如何使我的 class 变量赋值动态化?

How can I make my class variable assignment dynamic?

在下面的代码中,我想将 $settings 的键 help 分配给常量 class 变量值 $To_default。但是,有人告诉我 Constant expression contains invalid operations。有什么办法可以解决这个问题吗?

class EmailClass extends PluginBase {

  private $To_default = 'scrollout@whosebug.com';

  protected $settings = array(
    'To'=>array(
      'type'=>'text',
      'label'=>'To',
      'help'=>$this->To_default, // Constant expression contains invalid operations
    ),
  );

我尝试过以各种方式声明 $To_default,包括 private const $To_defaultstatic private $To_default 等,但 none 有效。 $settings 不是静态的,如您所见,所以我不明白为什么这是个问题。

您不能指定引用另一个 class 属性 的默认值($settings 是一个尝试读取 $To_default 的数组)。

我的建议是 $settings 可以是 getter 方法的结果,例如 getSettings,在其中可以构建一个数组并 return 它。

通过执行此操作,您还可以决定使用 setTo 方法覆盖 $To_default 值。

这是一个例子:

<?php

class EmailClass extends PluginBase {
    private string $toDefault = '';

    /**
     * @param string $toDefault
     */
    public function __construct( string $toDefault = 'scrollout@whosebug.com' ) {
        $this->toDefault = $toDefault;
    }

    /**
     * @param string $toDefault
     */
    public function setToDefault( string $toDefault ): void
    {
        $this->toDefault = $toDefault;
    }

    public function getSettings(): array
    {
        return [
            'TO' => [
                'type' => 'text',
                'label' => 'To',
                'help' => $this->toDefault,
            ]
        ];
    }

}

不知道对此的深入技术解释,但我认为这是因为通常您在构造函数中初始化属性,如下所示:

class EmailClass 
{
private $To_default = 'scrollout@whosebug.com'; // not a constant, so better throw it into constructor too
protected $settings;

public function __construct() {
    $this->settings = array(
    'To'=>array(
    'type'=>'text',
    'label'=>'To',
    'help'=>$this->To_default
    )
    );
}
}

类比我不知道为什么:'if isset(expression)' 不起作用,但它不必。有一个更好的解决方案:'if(expression)'。这就是我们的做法。

默认使用 class 常量而不是变量。

常量不以 $ 开头,这是您尝试此操作时遇到的问题。

class EmailClass extends PluginBase {

  private const TO_DEFAULT = 'scrollout@whosebug.com';

  protected $settings = array(
    'To'=>array(
      'type'=>'text',
      'label'=>'To',
      'help'=>self::TO_DEFAULT, // Constant expression contains invalid operations
    ),
  );
}