我正在尝试为多个项目定义名称空间/自动加载结构。每个项目都有一个图书馆。将为每个项目扩展的组合类。这是一个项目的内容
parentclass.php:
<?php
class parentclass{
}
?>
myclass.php
<?php
class pr1_myclass extends parentclass{
}
在index.php中,我将定义一个全局数组,其中包含将在自动装带器中使用的设置:
<?php
$settings = array(
'dir' => __DIR__;
'lib_dir' => 'project1_dir',
'lib_namespace' => '??',
);
$project_prefix = 'pr1';
$GLOBALS['projectsAutoloadSettings'][$project_prefix] = $settings;
自动加载器将是这样的:
<?php
function my_autoloader($className){
$parts = explode('_',$className);
if(isset($GLOBALS['projectsAutoloadSettings'][$parts[0])){
$settings = $GLOBALS['projectsAutoloadSettings'][$parts[0]];
//I now have settings array for this project. From here i can include the right file:
include($settings['dir'].'/'.$parts[1].'.php');
}else{
//Need to include library file. This is part of my problem. I dont know how to handle this
}
}
spl_autoload_register('my_autoLoader');
这是1个项目的结构。我有多个项目。每个项目中的/ lib目录都是相同的。
现在我需要一个命名空间结构,它可以在下面提到的两个环境中工作,而只需要更改$ settings。
可以在单个网页上激活多个项目。我想我需要名称空间,但我的主要问题是/ lib目录始终是相同的代码(复制粘贴)。我希望保持这种方式,据我所知,/ project3 / lib的命名空间不可能比project1 / lib更多。
我怎样才能实现目标。我对代码结构很感兴趣,比如自动加载器代码(classname to filename),我会弄清楚自己。
编辑:我正面临一个问题的例子编辑,如果我看一下评论,这似乎不太清楚。
它处于实时(非开发人员)模式。我有第二个项目,其结构与项目一相同,但在/project2/someclass.php中使用此类
<?php
class pr2_someclass extends parentclass{
}
?>
现在这是我运行这两个项目的代码:
<?php
//project 1 start:
$myClass1 = new pr1_myclass();
//This loads pr1_myclass which is an extension from the parent class in project1/lib/parentclass.php.
//So far so good
//Project 2 start
$myClass2 = new pr2_someclass();
//Here the problem occurs. This class loads pr2_someclass, but it will be an extension of project1/lib/parentclass.php instead of project2/lib/parentclass.php.
?>
由于两个lib目录完全相同,您可能认为我应该为两个项目使用相同的库。但是,两个项目之间可能有一年多的时间,因此两个库可能不完全相同。