PHP OOP体系结构问题



这个问题对一些人来说可能是显而易见的,但我刚刚开始触及web应用程序的多层架构的表面,尤其是PHP。我有一个包含几个对象的库,它正在快速扩展。我总是试着从可重用性的角度来思考,并将我的项目分解为小型、可重用和松散耦合的组件,这样我不仅在创建项目,而且还在为未来的项目创建部分。我正在尝试设计一种包管理系统,这样我就可以停止使用对象的include语句中的绝对路径。我希望在我的库中的每个类文件中都有一个包含includes的单个文件。除了includes,我还想添加一个具有"singleton"模式的类,这将允许我根据需要获取库中每个对象的实例。我计划为每个返回对新实例的引用的对象创建一个静态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');

我意识到这是一个非常初级的实现。我的例子只涵盖了最低限度。我的问题不是实现这一点;相反,问题是includes中数百个未实例化的类是否会对性能产生显著影响。如果是,有人知道变通办法吗?我无法告诉你跟踪数百个类的相对路径有多难,这些类都是按内容排序的。

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

<?php
function __autoload($class_name) {
include $class_name . '.php';
}
$obj  = new ClassA();
$obj2 = new ClassB(); 
?>

这样可以"按需"加载类,从而减少了开销,并且需要预先包含所有文件。更多信息请点击此处:http://php.net/autoload

性能问题的答案是-这无关紧要。除非你有了Facebook2、Yahoo2或Googl2,否则你不会注意到任何区别。

我个人不鼓励你广泛使用单身人士。这是一个名字很好听的GLOBAL。使您的代码难以长期使用。

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

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

最后,不要对类使用require。使用自动加载。

最新更新