具有静态库

时间:2016-01-18 09:26:51

标签: php namespaces autoload

我正在尝试为多个项目定义名称空间/自动加载结构。每个项目都有一个图书馆。将为每个项目扩展的组合类。这是一个项目的内容

  • / PROJECT1
    • / lib中
      • parentclass.php
      • autoloader.php
    • 的index.php
    • myclass.php

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。因此,例如,项目3中的类将从项目1的库中扩展父类。
  • 活跃的环境。这里项目中的每个类都扩展了它的项目库。因此,项目3中的类将始终从项目3扩展父类。

可以在单个网页上激活多个项目。我想我需要名称空间,但我的主要问题是/ 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目录完全相同,您可能认为我应该为两个项目使用相同的库。但是,两个项目之间可能有一年多的时间,因此两个库可能不完全相同。

0 个答案:

没有答案