【问题标题】:When should private methods in PHP work on class variables, and when should such methods be used as functions?PHP 中的私有方法什么时候应该作用于类变量,什么时候应该将这些方法用作函数?
【发布时间】:2011-04-13 05:45:36
【问题描述】:

我想知道什么时候私有/受保护的方法应该在类上工作它的变量(比如$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);
    }
}

【问题讨论】:

    标签: php oop methods private


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      方法一

      • 处理副作用
      • 覆盖原始数据
      • 不能在其他数据上重复使用

      方法二

      • 虽然方法一可以很容易地修改以记住它已经完成了过滤,但方法二会很困难,尤其是在尝试保持抽象时
      • 由于它的抽象,filterResults 不再是一个逻辑名称,而是类似于applyXyzFilter,很难证明保留在类中是合理的

      【讨论】:

        猜你喜欢
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-27
        • 1970-01-01
        • 2023-04-02
        相关资源
        最近更新 更多