初始化所有类?这个好吗?

时间:2009-11-11 09:08:15

标签: php class

我是一名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 个答案:

答案 0 :(得分:3)

从一开始就初始化所有对象显然是个坏主意。不太明显的是,在“主要”代码中使用“new”也不是一个好主意。使用“loader”为您提供所需的对象(而不是类),并避免在加载器之外使用“new”。

 // 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(....)

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

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

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

(更确切地说,此模式称为ServiceLocator,有关详细信息,请参阅http://martinfowler.com/articles/injection.html。)

答案 1 :(得分:1)

不是真的。只初始化您需要的内容。使用autoloading按需加载您需要的内容。 另请参阅Zend_Loader中的Autoloader方法。

答案 2 :(得分:1)

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

phpro.org上的教程是我过去学习如何使用它的教程。

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