如何使我的 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_default
、static 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
),
);
}
在下面的代码中,我想将 $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_default
、static 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
),
);
}