1

这个问题对某些人来说可能很明显,但我才刚刚开始接触 Web 应用程序的多层架构的表面,尤其是 PHP。我有一个包含多个对象的库,并且它正在迅速扩展。我总是尝试从可重用性的角度来思考,并将我的项目分解成小的、可重用的、松散耦合的组件,这样我不仅要创建项目,还要为未来的项目创建部分。我正在尝试设计一种包管理系统,以便我可以停止在包含对象的语句中使用绝对路径。我想有一个包含我的库中每个类文件的文件。除了包含,我想添加一个带有“单例”的类 模式将允许我按需获取库中每个对象的实例。我计划为每个返回对新实例的引用的对象创建一个静态 getter。基本上,像这样的东西......

include('classa.php');
include('classb.php');
include('classc.php');
class pacman{
     private static $instance_stack;
     public static function GetPackage($strPackage){
         if(!self::$instance_stack){
             self::$instance_stack['classa']=new ClassA();
             self::$instance_stack['classb']=new ClassB();
             self::$instance_stack['classc']=new ClassC();
         }
         if(array_key_exists(strtolower($strPackage),self::$instance_stack)){
             return self::$instance_stack[strtolower($strPackage)];
         }
         else{
             return false;
         }
     }

}

那么如果我想上a课...

include('pacman.php');
$ClassA = pacman::GetPackage('classa');

我意识到这是一个非常基本的实现。我的示例仅涵盖最低限度。我的问题不是实现这个;相反,问题在于包含的数百个未实例化的类是否会对性能产生显着影响。如果是这样,有人知道解决方法吗?我无法告诉您跟踪数百个按内容分类为导向器的类的相对路径有多么困难。

4

2 回答 2

2

您应该尝试自动加载它们:

<?php
function __autoload($class_name) {
    include $class_name . '.php';
}

$obj  = new ClassA();
$obj2 = new ClassB(); 
?>

这会“按需”加载类,从而减少开销并且需要预先包含所有文件。更多信息在这里: http: //php.net/autoload

于 2012-09-28T19:39:02.200 回答
0

对你的表现问题的回答是——没关系。在您拥有 Facebook2、Yahoo2 或 Googl2 之前,您不会注意到任何区别。

我个人不鼓励您广泛使用单音。这是一个具有好名字的 GLOBAL。使您的代码难以长期使用。

如果您对可重用包/库感兴趣,请了解Phar

如果你到处都需要一个静态 getter,请检查最新的 5.4.x 特性,称为traits。它将帮助您避免代码重复。

最后,不要对您的课程使用 require 。使用自动加载

于 2012-09-28T19:38:26.653 回答