PHP - статический метод в классе или просто функция - PullRequest
3 голосов
/ 04 августа 2011

У меня есть некоторая дилемма по поводу использования контроллера.Как обычно, маршрутизатор (диспетчер или фронт-контроллер) вызывает некоторый статический метод в классе контроллера, например, PageController :: showIndexPage () .Мои контроллеры обычно имеют несколько строк кода, и это обычно загрузка модели, получение данных и передача их для просмотра.

У меня такой вопрос - поскольку для каждого http-запроса выполняется только один метод, следует ли мне избегать классов и просто создать одну функцию для контроллера?Иногда у меня есть несколько методов на контроллер, но каждый раз используется только один метод.Я знаю, что это не имеет большого значения, но, может быть, я могу получить лучшую систему?Вот пример: мой AuthController имеет такие методы, как showLoginPage (), doLogin (), doLogout () ... Так что, может быть, лучше избегать класса и поместить запись этого контроллера как несколько функций в отдельные файлы, например, auth / show_login_page.php, auth / do_login.php и так далее?Есть ли у этой концепции некоторые плюсы / минусы?

Обновление: поскольку некоторые пользователи раздувают мое использование статического метода, я должен защищаться :) Я не создаю экземпляр контроллера, потому что в этом нет необходимости.В 99% случаев контроллер используется только для передачи данных из модели для просмотра.И нет необходимости в создании экземпляра только для одного вызова метода. По этой причине метод является статическим.Вот пример одного из моих контроллеров:

class ArticlesController {

    static function showArticle($article_id) {
        $article = ArticlesModel::getArticleById($article_id);
        View::getInstance()->assignByRef("article", $article);
        View::getInstance()->display("articles/one.tpl");
    }
    static function showAllArticles() {
        $articles = ArticlesModel::getAllArticles();
        View::getInstance()->assignByRef("articles", $articles);
        View::getInstance()->display("articles/all.tpl");
    }
}

Ответы [ 3 ]

2 голосов
/ 04 августа 2011

Статические функции класса очень похожи на глобальные функции, поэтому не знаю, почему вы используете статические функции класса для своих контроллеров (что довольно неудобно), поэтому либо измените их на стандартные методы объекта или глобальные функции в целом.

Я предлагаю вам разделить все ваше приложение на одну ветвь, которая заменяет все контроллеры глобальными функциями, а другую ветвь - нестатическими функциями классов.Тогда вы можете лучше сравнить обе концепции.

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

2 голосов
/ 14 декабря 2017

Не совсем понимаю первый ответ, за который проголосовали и пометили как правильный.Вот мое мнение:

Статические методы похожи на глобальные методы, но более организованы и содержатся в пространстве имен и классе.Это не значит, что они лучше, чем объекты только из-за этого определения.У них есть свое использование.Если вы работаете с классом, который будет поддерживать определенное состояние, то этот класс больше подходит для нестатического класса, то есть вы должны создать его экземпляр и использовать его.Если он не собирается поддерживать определенное состояние в указанном процессе, т.е. он просто получает параметры, что-то с ним делает и возвращает ответ, то он больше подходит для статического.

Это мой упрощенный взгляд на статический-static.В вашем случае вам могут потребоваться другие вещи для бесперебойной работы ваших контроллеров.Одной из таких проблем, которая обычно проблематична, является тот факт, что статические классы не имеют конструктора, поскольку они не создаются.Это единственная веская причина, по которой я думаю, что ваш контроллер может быть создан, если родительский объект имеет конструктор и получает объекты, которые установлены для использования через ваши контроллеры.Я думаю, что у вас все в порядке со статическими контроллерами, если они такие простые.

Что касается вашего вопроса просто иметь функции или иметь класс.Класс инкапсулирует вашу логику в одну единицу.Это просто статичный способ, что все, что находится в этой группе, строго принадлежит этому блоку.Мы пришли из мира, где раньше у нас были простые функции, но обычно они довольно быстро деформируются.Посмотрите на энтропию программного обеспечения, их мало что останавливает.Так как классы являются ссылкой на то, что они содержат, люди используют это таким образом.Вы можете изобразить 10 требований в верхней части файла, тогда вам вдруг понадобится функция, разработчик может не задумываться об этом и просто добавить ее в один из ближайших подходящих файлов и сказать «ах», все ли оно включено в любом случае, так чтобуду работать.Принимая во внимание, что с классами, вы как бы вынуждены думать, куда их поместить, если вы поместите его в неправильное место, разработчики, вероятно, пропустят его, поскольку они не доступны глобально.

Надеюсь, это поможет.

0 голосов
/ 04 августа 2011

Я бы сказал, держите вместе то, что принадлежит друг другу.Так что используйте класс.Кроме того, использование класса автоматически дает какое-то пространство имен.Просто потому, что если у вас есть метод с именем doSomething() в нескольких включаемых файлах, вы не можете включить более одного из этих файлов.Однако если метод помещен в «статический класс», все они могут быть включены.Начиная с PHP 5.3, вы также можете использовать «настоящие» пространства имен, но классовый подход все же лучше.

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

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