Intereting Posts
Как обрезать фрагменты HTML без разбивки тегов? Создать случайную строку Замена html-тега на preg_replace Почему, если я зарегистрировался на своем веб-сайте как зарегистрированный пользователь, я не могу получить доступ к другим страницам после установки правил сеанса? Чтение php генерирует XML во флэш-памяти? preg_match с международными символами и акцентами экспортировать переменную среды оболочки перед запуском команды из скрипта PHP CLI Использование SSL / TLS при отправке электронной почты с PHP Встроенные формы Несколько полей – Symfony2 Несколько полей JQuery обновлять / добавлять данные в XML-файл, используя php Slim – Как отправить ответ с заголовком Content-Type: application / json? Доступ к дочернему объекту из родительской области Как загрузить необработанные байты данных изображения в facebook PHP Новая строка не работает Symfony2: нет расширения, которое может загрузить конфигурацию для

Статические методы или нет?

Мне нужно разработать небольшую CMS с использованием PHP, и сейчас я пытаюсь выяснить структуру.

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

Я думал сделать это вот так:

  • сделать функции нестатических методов частью большого класса «сайта»; таким образом я мог запускать несколько экземпляров этого класса. Не уверен, что мне нужно будет это сделать ..

  • или разделять функции на отдельные классы со статическими методами

Основная проблема здесь в том, что CMS должна иметь возможность управлять несколькими небольшими сайтами, а не только одним. Таким образом, либо я делаю все методы статическими и добавляю функцию «переключатель сайта», либо делаю их обычными объектами, которые я создаю на основе сайта, который я хочу управлять

Какой из них был бы лучшим вариантом?

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

Статические методы обычно представляют собой плохую практику. Они представляют много потенциальных проблем.

1) Они вводят скрытые зависимости. Код, который произвольно вызывает foo :: bar (), имеет зависимость от foo и не может работать без определения foo. Объект, использующий foo :: bar (), будет правильно построен, но не будет использоваться, если foo не определен.

2) Статика – это глобалы. Глобальное состояние очень плохое, что-то может изменить код, и его состояние неизвестно. Вы жертвуете силой и контролем, достигнутыми инкапсуляцией ООП, используя статические методы.

3) Невозможно заменить функции для другой версии

4) Это делает модульное тестирование невозможным.

Более подробную информацию и примеры кода см. В этой статье и в этой статье.