PHP включает vs OOP

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

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

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

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

  • Создайте файл authenticate.php и включите его на каждую страницу. Он поддерживает логику аутентификации.

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

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

  • Существует сеанс;
  • Что сеанс действителен; и,
  • То, что пользователь, владеющий сеансом, имеет соответствующие привилегии.

Вы можете инкапсулировать все три шага в одну функцию (или статический метод в классе 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 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.
}