【问题标题】:Initializing all the classes ?? Is this good?初始化所有类??这个好吗?
【发布时间】:2009-11-11 09:08:14
【问题描述】:

我是 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();

【问题讨论】:

    标签: php class


    【解决方案1】:

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

     // 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)您必须为每个方法中的对象提供初始化数据(例如 sms 网关地址),2)您必须在案例类名称或构造函数签名更改,以及 3)您不能根据条件临时替换 Sms 对象(例如,用于在本地机器上测试的“DummySms”)。

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

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

    【讨论】:

    • 在主控制器中使用new关键字有什么缺点?
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      不是真的。只初始化你需要的。使用autoloading 按需加载您需要的内容。 还可以看看 Zend_Loader 的 Autoloader 方法。

      【讨论】:

      • 问题是有一些类在他们自己的 lib 文件夹下的目录中(如验证码、邀请者等)。如何自动加载它们?
      猜你喜欢
      • 2011-03-19
      • 2020-09-15
      • 2011-01-26
      • 1970-01-01
      • 2010-10-07
      • 2015-04-10
      • 2011-05-30
      • 2020-08-10
      • 2017-09-14
      相关资源
      最近更新 更多