2009-11-11 3 views
1

Я начинающий 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

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

// 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 для более подробной информации).

+0

спасибо за подсказку –

+0

Каков недостаток использования нового ключевого слова в главном контроллере? –

+0

благодарит за помощь –

1

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

+0

Проблема в том, что есть некоторые классы, которые находятся внутри их собственных каталогов в папке lib (например, captcha, inviters и т. Д.). Как я могу автозагрузить их? –

1

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

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

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

Смежные вопросы