2009-11-11 68 views
1

我是一名PHP初学者。我在PHP中开发了一个类似于Orkut的社交网站。初始化所有类?这个好吗?

我的网站的基本程序流程是一切重定向到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(....) 

//编辑:为什么我们需要这个?

想象一下,在控制器中有一些使用Sms对象的数字方法。如果你使用“new”和一个明确的类名(上面的“错误”方法),1)你必须为每个方法中的对象提供初始化数据(例如短信网关地址),2)你必须编辑你的Controller代码案例类名称或构造函数签名的更改以及3)您不能临时替换取决于条件的Sms对象(例如,用于在本地计算机上测试的“DummySms”)。

使用Loader类的所有问题都没有问题,因为您只需编写一次所有的对象初始化代码。

(更确切地说,这种模式称为ServiceLocator,更多详细信息请参见http://martinfowler.com/articles/injection.html)。

+0

感谢提示 – 2009-11-11 14:29:04

+0

在主控制器中使用新关键字有什么缺点? – 2009-11-11 14:42:48

+0

非常感谢您的帮助 – 2009-11-11 17:32:43

1

不是真的。只初始化你需要的东西。使用autoloading根据您的需要加载。 另请参阅Zend_Loader的Autoloader方法。

+0

问题是有一些类是在自己的目录下lib文件夹(如captcha,邀请等)。我如何自动加载它们? – 2009-11-11 09:27:02

1

我最近在今年学到的一种方法是使用spl自动加载器来基本处理任何关于new关键字的调用,以确定实际抓取和包含类的位置,我相信这是延迟加载设计模式的一个示例。

关于phpro.org的教程是我用来学习如何使用它的教程。

但是,如果您要实现此方法,您可能需要重构一些代码,可能是一个很好的示例,可以粘贴一段代码来查看它与其中一个类变量实例的交互方式。