Какой шаблон выбрать для модуля php? - PullRequest
2 голосов
/ 02 февраля 2012

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

У меня есть несколько предложений:

1. Статический класс

PHP не имеет реального статического класса, поэтому я просто создаю класс со всеми статическими методами:

class Some_Module
{
    static public function sum($a, $b, $c)
    {
        return $a+$b+$c;
    }

    static public function method2($a, $b)
    {
         return $a-$b+5;
    }
}

Использовать такие модули очень просто:

$x = Some_module::sum(1,2,3);

Но я слышал (есть много тем по SO), что статический - плохая практика.

2. Singleton

Это не так просто в использовании:

// we should not to forget to get instance
$module_instance = new Some_module;
$x = $module_instance->sum(1,2,3);

Неудобство заключается в том, что мы должны сейчас инициализировать этот модуль. Кроме того, существует огромное количество тем по SO, где объясняется, почему Singleton не полезен в PHP, поэтому это тоже плохая практика.

Какой шаблон использовать для такого модуля?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Я думаю, что это обсуждение поможет в вашем решении Статические методы: они все еще плохи, учитывая позднюю статическую привязку PHP 5.3?

Лично это зависит от контекста. Чтобы хранить кучу разного. вспомогательные методы, более вероятно, что я буду использовать это как глобальное пространство имен. При хранении ограниченного количества методов определенной категории, для которых нет необходимости создавать экземпляры, статический класс может быть хорошим вариантом. Просто имейте в виду, что для модульного тестирования многие классы, использующие статические методы в неправильном контексте, например cool::method, окажутся адом.

// keep it abstract to prevent it from being instantiated
abstract class Foo {
   // cannot be altered if inherited, although limitation still exists
   final public static function bar() {
      echo 'test';
   }
}

Foo::bar();

2 голосов
/ 02 февраля 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...