2012-09-28 63 views
1

对于某些人来说,这个问题可能很明显,但我刚开始用Web应用程序(特别是PHP)开始抓住多层体系结构的表面。我有一个包含多个对象的库,它正在迅速扩展。我总是试图从可重用性的角度思考问题,并将我的项目分解为小的,可重用的和松散耦合的组件,这样我不仅创建项目,而且还为未来的项目创建部件。我试图设计一种包管理系统,这样我就可以停止在包含对象中使用绝对路径。我想有一个文件包含我的库中的每个类文件。随着包含,我想添加一个“单身”模式的类,将允许我抓住库中的每个对象的实例按需。我打算为每个对象创建一个静态获取器,以返回对新实例的引用。基本上,这样的事情...PHP OOP架构问题

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; 
     } 
    } 

} 

然后,如果我想获得一流的...

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

我意识到这是一个非常基本的实现。我的例子只涵盖了最低限度。我的问题是没有实现这一点;相反,这是一个问题,从包含的数百个未被证实的类是否会对性能产生显着影响。如果是这样,是否有人知道解决方法?我无法告诉你,要追踪数百个按内容排序成董事的班级的相对路径是多么困难。

+0

[在尤达的声音]在你可以重用之前,你必须先使用。关注未来项目对目前项目线索失败的需求。 – cleong

+0

没有先入为主。为什么我会花2个小时创建一个项目特定的组件,当我可以采取2:30并创建一个通用的可重用组件。长期而短暂,它更有意义。我宁愿在500个具有多态性的地方使用单个泛型函数,而不是通过代码库分散500个变体。你想谈谈噩梦 –

回答

2

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

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

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

这种“按需”加载类,减少开销,需要有所有文件包括的前期。更多的信息在这里:http://php.net/autoload

+0

谢谢!对此,我真的非常感激 –

0

回答你的表现问题是 - 没关系。除非你有Facebook2,Yahoo2或者Googl2,否则你不会注意到任何区别。

我个人不鼓励你广泛使用单身。这是一个全球化的名字。使您的代码难以长期使用。

如果您对可重复使用的软件包/库感兴趣,请参阅Phar

如果您在任何地方需要静态吸气器,请检查最新的5.4.x功能traits。它将帮助您避免代码重复。

最后,不要使用require作为你的类。使用autoload

+0

荣誉的帮助。通过自动加载,全球范围内的类是否可用? –