Когда частные методы в PHP должны работать с переменными класса, и когда такие методы должны использоваться как функции? - PullRequest
0 голосов
/ 16 сентября 2010

Мне интересно, когда закрытые / защищенные методы должны работать с классом, его переменными (например, $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 ]

3 голосов
/ 16 сентября 2010

Пока вы уверены, что вам нужно поддерживать только одну переменную результатов на экземпляр, всегда используйте первую версию (которая работает со свойством класса).Это одна из целей использования классов: иметь общие переменные.

На самом деле вы можете рассматривать свойства класса как аргументы ваших методов, которые неявно указываются.(Если вы программируете на C ++, вы знаете, что, по крайней мере, так оно и есть. Например, вы можете указать, что не собираетесь изменять свойство класса, поставив const после аргументов метода.)

1 голос
/ 16 сентября 2010

Используя исключительно приведенный вами пример, нет никакой разницы между этими двумя методологиями. Вы можете экстраполировать, чтобы найти различия, но на самом деле их нет.

Я предполагаю, что вы пытаетесь реализовать класс без предварительного его проектирования. Поскольку картина не полная, нет очевидных причин выбирать одну методологию из другой.

Когда вы начнете конкретизировать, что именно вы хотите сделать, вы, вероятно, обнаружите, что первый метод привязывает подпрограмму фильтрации к классу, тогда как второй метод поощряет отделение подпрограммы от класса.

Способ первый

  • Работает на побочные эффекты
  • Перезаписывает исходные данные
  • Не может быть повторно использован для других данных

Второй способ

  • В то время как метод 1 можно легко изменить, чтобы он помнил, что он уже выполнил фильтрацию, метод 2 будет особенно трудным, если попытаться сохранить его абстрактным
  • Из-за своей абстракции filterResults больше не является логическим именем, а, скорее, чем-то вроде applyXyzFilter, что трудно оправдать в классе
...