属性VS引用:在类方法之间共享变量

时间:2014-08-20 19:18:26

标签: php oop

让我们说我正在构建一个类(用于通用目的),我有两种方法可以处理常见变量。

class renderElement
{
    public function process()
    {
        $output = array();
        $data = $this->supportMethod($output);
        // do stuff with $output
    }

    public function supportMethod(&$processed_output)
    {
        // do stuff with $processed_output
    }
}

我想在两种方法中使用相同的变量;让我们说 $ output

我很想知道最终依赖类属性(如下)的选择背后的理论,或者当将变量作为参考传递时可以(或更好)。

class renderElement
{
    private $output = array();

    public function process()
    {
        $data = $this->supportMethod();
        // do stuff with $this->output
    }

    public function supportMethod()
    {
        // do stuff with $this->output
    }
}

优点?缺点是什么?设计建议? 关于这种设计选择的建议讲座?

[编辑]

我想补充一点,变量/ property显然应该作为对象属性。我不是在谈论仅支持数据处理的变量。

1 个答案:

答案 0 :(得分:3)

一个对象从根本上包括两个方面,即行为和状态。

您的类的方法定义对象的行为。

您的类的属性定义对象的状态。

在您的第一个示例中,$output不是对象状态的一部分,因此它不会在对象的整个生命周期中持续存在。

在你的第二个例子中,$output将在对象的整个生命周期中持续存在,因为它是对象状态的一部分。

以此为例......

class Shape 
{    
    protected $sides;

    public function getNumberOfSides() 
    {
        return $this->sides;
    }
}

class Triangle extends Shape 
{
    public function __construct() 
    {
        $this->sides = 3;
    }
}

class Square extends Shape 
{    
    public function __construct() 
    {
        $this->sides = 4;
    }
}

$shape = new Square;
echo $shape->getNumberOfSides(); // Returns 4

$shape = new Triangle;
echo $shape->getNumberOfSides(); // Returns 3

$sides(边数)是形状本质的固有部分,因此在物体的整个生命周期中它成为物体状态的一部分是合适的。这与在同一类中的方法之间传递参数的便利性没有任何关系。