PHP: Require() и иерархия классов

Я рассматриваю эту проблему в основном как программист на С++/С#, что может помочь взглянуть на вещи в перспективе. Я не смог найти простого ответа на свой вопрос, поэтому прошу прощения, если он есть. Похоже, это будет очень распространенная проблема.

Предположим, у меня есть класс A, который является контейнером для экземпляров класса B. класс B, в свою очередь, является контейнером для экземпляров класса C. Под контейнером я подразумеваю, что каждый класс содержит массив определенных типов объектов и несколько общих параметров, описывающих эти объекты. Каждый класс хранится в [className].php

Теперь у меня есть сценарий, которому нужно создать экземпляр класса A. Для этого ему нужно будет создать экземпляры класса C. Каждый их набор будет использоваться для создания экземпляра класса B, и, наконец, все классы B будут использоваться для создания экземпляра класса A.

Вопрос в том, где в PHP лучшее (наименее подверженное ошибкам) ​​место для размещения операторов require()? Некоторые идеи:

  • require() все три класса в скрипте и больше нигде
  • require_once() классы везде, где вам нужно их использовать. В этом случае вы бы использовали require_once() A, B и C в скрипте, require B и C в A и require_once() C в B.
  • require() только класс следующего уровня в иерархии. Сценарий потребует (A), A потребует (B), а B потребует (C). Таким образом, требуя A в сценарии, вы получаете доступ ко всем классам, необходимым для заполнения A.
  • Что-то еще, вроде автозагрузки.

Как всегда, я ценю идеи. Хотя это может быть субъективно на каком-то уровне, я верю, что некоторые способы могут быть объективно лучше, чем другие, и это то, что мне нужно.


person Shaun    schedule 19.11.2010    source источник
comment
не усложняйте дело. использовать автозагрузку.   -  person bcosca    schedule 19.11.2010


Ответы (2)


Я бы выбрал автозагрузку. Вам не нужно беспокоиться о том, где вы require_once() проводите занятия, если он делает это автоматически. Все, что вам нужно сделать, это начать использовать ожидаемые классы, и PHP вызовет ваш автозагрузчик, чтобы убедиться, что классы загружены.

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

В любом случае работает. В основном это выбор стиля.

person Tyler Carter    schedule 19.11.2010
comment
Если вы используете автозагрузку в этой ситуации, куда вы поместите функцию автозагрузки? В каждом исполняемом файле php? - person Shaun; 19.11.2010
comment
В основном да, хотя на самом деле вам просто потребуется файл с __autoload() в любом исполняемом коде. Также проверьте spl_register_autoload(), что обеспечит вам большую гибкость (хотя и потенциально против небольшого снижения производительности). - person NSSec; 19.11.2010
comment
Разве операторы use в верхней части файла недостаточно хорошо описывают зависимости классов? - person Crozin; 22.11.2010
comment
На данный момент я решил просто использовать require_once() для любых зависимостей, так как мне нравится сразу видеть, что я использую, и это делает код более понятным для других. Однако для более крупной программы с большим количеством файлов или в ситуации, когда у меня очень высокий параллелизм, я мог бы вместо этого использовать автозагрузку, - person Shaun; 22.11.2010

Всегда используйте require_once для включения классов. Всегда. Минусов буквально нет. Включите файлы через require_once в каждый файл, который им нужен. Это не может не сработать: вы не можете использовать require_once слишком много раз, и класс гарантированно будет включен и доступен во всей программе.

person meagar    schedule 19.11.2010
comment
+1 Но требуются только те классы, которые вы фактически используете в исходном файле. - person cdhowie; 19.11.2010
comment
На самом деле, есть потенциальный недостаток, и это (немного) снижение производительности. Подробнее читайте здесь: techyouruniverse.com/software/ . - person NSSec; 19.11.2010
comment
@MathieuK Пытаться оптимизировать PHP бессмысленно. Оптимизация на основе PHP становится совершенно спорной из-за кэширования вывода. - person meagar; 19.11.2010
comment
Я не согласен, существует множество возможных ситуаций, когда кэширование вывода просто невозможно. - person NSSec; 20.11.2010