什么时候PHP中的私有方法应该处理类变量,何时应该将这些方法用作函数?

时间:2010-09-16 13:46:11

标签: php oop methods private

我想知道私有/受保护的方法应该在类的变量(如$this->_results)上工作,以及何时应该使用这些方法,就像它们是函数一样(如$this->_method($results))。以下示例:

处理类属性

<?php

class TestA
{
    protected $_results;

    public function getResults()
    {
        $this->_results = getFromWebservice();
        $this->_filterResults();
    }

    protected function _filterResults()
    {
        $this->_results = doMagic($this->_results);
    }
}

工作“作为功能”

<?php

class TestB
{
    protected $_results;

    public function getResults()
    {
        $results = getFromWebservice();
        $this->_results = $this->_filterResults($results);
    }

    protected function _filterResults($results)
    {
        return doMagic($results);
    }
}

2 个答案:

答案 0 :(得分:3)

只要您确定,每个实例只需要维护一个结果变量,请始终使用第一个版本(适用于class属性)。这是使用类的目的之一:拥有共享变量。

您实际上可能会将类属性视为方法的参数,这些参数是隐式指定的。 (如果您使用C ++进行编程,您至少知道它确实是这样的。例如,您可以通过在方法参数之后放置const来指定您不会更改类属性。)< / p>

答案 1 :(得分:1)

仅使用您给出的示例,两种方法之间没有任何区别。您可以推断发现差异,但它们实际上并不存在。

我的猜测是你试图在没有先设计它的情况下实现一个类。由于图片不完整,没有明显的理由选择一种方法而不是另一种方法。

当你开始准确地充实你想要做的事情时,你可能会发现方法一将过滤例程绑定到类,而方法二鼓励例程与类分开。

方法一

  • 适用于副作用
  • 覆盖原始数据
  • 无法在其他数据上重复使用

方法二

  • 虽然方法一可以很容易地修改以记住它已经完成了过滤,但是方法二会特别困难,特别是当试图保持抽象时
  • 由于它的抽象,filterResults不再是一个逻辑名称,而是applyXyzFilter之类的东西,这很难证明在课堂上存在