PHP включает в себя против ООП - PullRequest
10 голосов
/ 22 августа 2008

Я хотел бы получить справку о преимуществах и недостатках использования файлов против объектов (классов) при разработке приложений PHP.

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

Простой пример:

Некоторые страницы на моем сайте доступны только зарегистрированным пользователям. У меня есть два варианта реализации (есть другие, но давайте ограничимся этими двумя)

  1. Создайте файл authenticate.php и добавьте его на каждую страницу. Содержит логику для аутентификации.

  2. Создать пользовательский объект, который имеет функцию аутентификации, ссылаться на объект для аутентификации на каждой странице.

Редактировать Я хотел бы увидеть, как можно взвесить преимущества одного над другим. Мои текущие (и слабые причины) следуют:

Включает - Иногда функцию просто / короче / быстрее вызывать Объекты - Группировка функциональности и свойств приводит к более длительному обслуживанию.

Включает в себя - Меньше кода для записи (без конструктора, без синтаксиса классов) называют меня ленивым, но это правда.

Объекты - Принудительная формальность и единый подход к функциям и созданию.

Включает - Новичку легче иметь дело Объекты - Сложнее для новичков, но не одобряют профессионалы.

Я смотрю на эти факторы в начале проекта, чтобы решить, хочу ли я включать объекты или объекты. Вот несколько плюсов и минусов на моей голове.

Ответы [ 6 ]

13 голосов
/ 22 августа 2008

Это не совсем противоположный выбор. Вы должны будете включить проверочный код в любом случае. Я читаю ваш вопрос как процедурное программирование против ОО-программирования.

Написание нескольких строк кода или функции и включение ее в заголовок вашей страницы - вот как все это делалось в PHP3 или PHP4. Все просто, работает (вот как мы это сделали в osCommerce , например, в PHP-приложении для электронной коммерции).

Но поддерживать и изменять нелегко, как могут подтвердить многие разработчики.

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

5 голосов
/ 22 августа 2008

Хотя этот вопрос затрагивает пару очень спорных вопросов (ООП, аутентификация пользователя), я пропущу эти и второй комментарий Конрада по поводу __autoload. Любой, кто знает C / C ++, знает, сколько боли может быть в том числе и файлов. С автозагрузкой, добавлением PHP5, если вы решите использовать ООП (что я и делаю почти исключительно), вам нужно всего лишь использовать некоторые стандартные правила именования файлов и (я бы порекомендовал) ограничить один класс на файл, а PHP сделает все остальное за вас. Очищает код, и вам больше не нужно беспокоиться о том, чтобы не забыть удалить включения, которые больше не нужны (одна из многих проблем с включениями).

1 голос
/ 22 августа 2008

Я научился никогда не использовать include в PHP, кроме как внутри основных библиотек, которые я использую, и одной центральной include этих библиотек (+ config) в приложении. Все остальное обрабатывается глобальным обработчиком __autoload, который можно настроить для распознавания различных необходимых классов. Это можно легко сделать, используя соответствующие соглашения об именах для классов.

Это не только гибкий, но и достаточно эффективный инструмент, обеспечивающий чистоту архитектуры.

1 голос
/ 22 августа 2008

У меня мало опыта работы с PHP, хотя я использую его на своей текущей работе. В целом, я считаю, что большие системы выигрывают от читабельности и понятности, которые обеспечивает ОО. Но такие вещи, как последовательность (не смешивайте OO и не OO) и ваши личные предпочтения (хотя на самом деле только в личных проектах) также важны.

0 голосов
/ 22 августа 2008

Делаете ли вы это на уроках или в более процедурном стиле, вам просто нужно проверить, чтобы:

  1. Есть сеанс;
  2. что сессия действительна; и
  3. что пользователь, владеющий сеансом, имеет надлежащие привилегии.

Вы можете инкапсулировать все три шага в одну функцию (или статический метод в классе Session может работать). Попробуйте это:

class Session
{
  const GUEST = 0;
  const SUBSCRIBER = 1;
  const ADMINISTRATOR = 2;

  public static function Type()
  {
    session_start();

    // Depending on how you use sessions on
    // your site, you might just check for the
    // existence of PHPSESSID. If you track
    // every visitor with sessions, however, you
    // might want to assign some separate unique
    // number (that you can track in a DB) to
    // authenticated sessions
    if(!$_SESSION['uniqid'])
    {
      return Session::GUEST;
    }
    else
    {
      // For the best security, don't store the
      // user's access permissions in the $_SESSION,
      // but rather check against the DB. This will
      // ensure that recently deleted or downgraded
      // administrators will not be able to make use
      // of a previous session.

      return THE_ACCESS_LEVEL_ACCORDING_TO_THE_DB
    }
  } 
}


// In your files that need to check for authentication (you
// could also do this in a controller if you're going MVC

if(!(Session::Type() == Session::ADMINISTRATOR))
{
  // Redirect them to wherever you want them to go instead,
  // like a log in page or something like that.
}
0 голосов
/ 22 августа 2008

Можете ли вы быть более конкретным? Для примера, который вы приводите, вы должны использовать include в обоих направлениях. В случае 1 вы включаете только файл, в случае 2 вам нужно включить файл класса (например, user.class.php), чтобы разрешить создание экземпляра класса User.

Зависит от того, как строится остальная часть приложения, это OO? Используйте OO.

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