Инициализация всех классов Это хорошо? - PullRequest
1 голос
/ 11 ноября 2009

Я новичок в PHP. Я разработал сайт социальной сети, похожий на Orkut в PHP.

Основной поток программ моего сайта - перенаправление всего на index.php

index.php определяет $ _SERVER ['REQUEST_URI'] и делает то, что нужно сделать, и выводит результат.

Я инициализирую все классы в верхней части index.php. Я хочу знать, является ли это хорошей практикой, делать это или нет.

index.php начинается так: -

// all the configuration files
require_once ("siteconfig.php");

// include library files / classes
require_once "lib/auth.php";
require_once "lib/album.php";
require_once "lib/db.php";
require_once "lib/form.php";
require_once "lib/inbox.php";
require_once "lib/social.php";
require_once "lib/profile.php";
require_once "lib/user.php";
require_once "lib/settings.php";
require_once "lib/validate.php";
require_once "lib/logs.php";
require_once "lib/sms.php";



// initialize all the classes
$db = new db($dbuser, $dbpass, $dbname, $dbhost);
$validate = new validate();
$auth = new auth();
$user = new user();
$profile = new profile();
$social = new social();
$settings = new settings();
$usersearch = new usersearch();
$album = new album();
$logs = new logs();
$liveupdates = new liveupdates();
$sms = new sms();

Ответы [ 3 ]

3 голосов
/ 11 ноября 2009

Инициализация всех объектов с самого начала, очевидно, плохая идея. Менее очевидно, что использование «нового» в вашем «основном» коде также не является блестящей идеей. Используйте «загрузчик», который предоставляет вам нужные вам объекты (не классы), и избегайте «новых» за пределами загрузчика.

 // WRONG

 class MainController 
 {
          function action_send_sms() {
              require 'lib/sms.php'; // or use autoload
              $sms = new MySmsClass();
              $sms->send(....)


 // RIGHT

 class Loader
 {
        function sms_object() {
              require 'lib/sms.php'; // or use autoload
              return new MySmsClass();
        }
  ....

 class MainController 
 {
          function action_send_sms() {
              $sms = $this->loader->sms_object();
              $sms->send(....)

// edit: зачем нам это нужно?

Представьте, что в вашем контроллере есть числовые методы, которые используют объект Sms. Если вы используете «новый» и явное имя класса («неправильный» подход выше), 1) вы должны предоставить данные инициализации (например, адрес шлюза sms) для объекта в каждом методе, 2) вы должны редактировать код контроллера изменения имени класса или сигнатуры конструктора и 3) вы не можете временно заменить объект Sms в зависимости от условия (например, «DummySms» для тестирования на вашем локальном компьютере).

С классом Loader все проблемы не проблема, потому что вы пишете весь код инициализации объекта ровно один раз.

(Точнее, этот шаблон называется ServiceLocator, подробнее см. http://martinfowler.com/articles/injection.html).

1 голос
/ 11 ноября 2009

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

Учебное пособие по phpro.org - это то, что я использовал, чтобы узнать, как его использовать.

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

1 голос
/ 11 ноября 2009

Не совсем. Инициализируйте только то, что вам нужно. Используйте автозагрузку , чтобы загрузить по запросу то, что вам нужно. Также взгляните на метод автозагрузки из Zend_Loader .

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