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

Php 初始化所有类??这个好吗?,php,class,Php,Class,我是一个PHP初学者。我开发了一个类似于PHP中Orkut的社交网站 我的网站的基本程序流程是将所有内容重定向到index.php php确定$\u服务器['REQUEST\u URI'],并执行需要执行的操作和呈现输出 我初始化index.php顶部的所有类,我想知道这样做是否是一种好的做法 index.php的开头如下所示:- // all the configuration files require_once ("siteconfig.php"); // include library

我是一个PHP初学者。我开发了一个类似于PHP中Orkut的社交网站

我的网站的基本程序流程是将所有内容重定向到index.php

php确定$\u服务器['REQUEST\u 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();

不是真的。只初始化你需要的。用于根据请求加载所需内容。
还可以从中查看自动加载器方法。

不太可能。只初始化你需要的。用于根据请求加载所需内容。
还可以从中查看Autoloader方法。

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

上的教程是我用来学习如何使用它的


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

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

上的教程是我用来学习如何使用它的


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

从一开始初始化所有对象显然是一个坏主意。不太明显的是,在主代码中使用新代码也不是一个聪明的想法。使用一个为您提供对象而不是您需要的类的加载程序,并避免在加载程序之外添加新的对象

 // 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对象的方法。如果您在上述方法中使用了新的显式类名,1您必须提供初始化数据,例如每个方法中对象的sms网关地址,2您必须编辑控制器代码,以防类名或构造函数签名发生更改,3您不能临时替换Sms对象,这取决于在本地计算机上进行测试的条件,例如DummySms

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


更准确地说,此模式称为ServiceLocator,有关详细信息,请参阅。

从一开始初始化所有对象显然是个坏主意。不太明显的是,在主代码中使用新代码也不是一个聪明的想法。使用一个为您提供对象而不是您需要的类的加载程序,并避免在加载程序之外添加新的对象

 // 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对象的方法。如果您在上述方法中使用了新的显式类名,1您必须提供初始化数据,例如每个方法中对象的sms网关地址,2您必须编辑控制器代码,以防类名或构造函数签名发生更改,3您不能临时替换Sms对象,这取决于在本地计算机上进行测试的条件,例如DummySms

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


更准确地说,此模式称为ServiceLocator,有关详细信息,请参阅。

问题在于,在lib文件夹下,有一些类位于它们自己的目录中,如captcha、inviters等。如何自动加载它们?问题在于,在lib文件夹下,如captcha,有一些类位于它们自己的目录中,邀请者等。如何自动加载它们?在主控制器中使用新关键字的缺点是什么?在主控制器中使用新关键字的缺点是什么?