我正在处理表单类,我当前的代码如下所示:
$Form->addElement(new FormElementText($name, $value));
e.g。
$Form->addElement(new FormElementText('user_name', $values['user_name']));
$Form->addElement(new FormElementText('user_nick', $values['user_nick']));
$name
的字符串将始终与$values
的索引字符串相同。
有没有办法将$values
存储在所有表单元素的中心位置,以便我可以单独传递$name
参数?我怀疑没有(除了global $values
),但我希望......
编辑:有人建议使用静态属性,但很快就删除了他们的答案。这似乎是一个可行的解决方案,在尝试之后,它就可以解决问题。
FormElementText::$values = $values;
$Form->addElement(new FormElementText('user_nick');
和FormElementText
$value = self::$values[$this->name];
答案 0 :(得分:1)
首先,让我们不要理解静力学。如果将静态代码编写到对象中,则引入外部依赖关系 - 将对象耦合到静态调用,以及可能提供全局可变状态(禁止否定)。永远不要为此而堕落,不要听那些会试图说服你“在某些情况下静态是好的”的人。一般来说,它们很容易避免。
$ name的字符串将始终与$ values的索引字符串相同。
如果他们总是相同,请让FormElement
抽象基类为您处理。
/**
* This is abstract, it cannot be instantiated directly, only inherited from
*
* @abstract
*/
abstract class FormElement
{
/**
* @var string
*/
protected $name;
/**
* @var string
*/
protected $value;
/**
* @constructor
*
* @param string $name
* @param array $values
*/
public function __construct($name, array $values)
{
$this->name = $name;
/** @todo Check that the index *definitely* exists **/
$this->value = $values[$name];
/** @todo Do whatever else you want with other stuff in $values **/
}
}
因此,您的基类将处理所有FormElement
个孩子的共同逻辑。让我们在您的上下文中使用它:
/**
* Inherits the constructor of FormElement
*/
class FormElementText extends FormElement { }
$form->addElement(new FormElementText('user_name', $values));
请注意,您不再需要指定密钥,这是您的初始问题试图避免的。