有没有办法在不同的对象之间有一些共享数据?

时间:2014-04-19 12:09:34

标签: php oop

我正在处理表单类,我当前的代码如下所示:

$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];

1 个答案:

答案 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));

请注意,您不再需要指定密钥,这是您的初始问题试图避免的。