如何加载我需要的文件? PHP

问题描述:

尽管这可能是一个基本的问题,但人们会假定使用require_once,但实际上它更复杂 - 至少对我而言。如何加载我需要的文件? PHP

我遇到的问题是我的项目结构很像Java中的包结构。我们如何使用全局名称空间。因此,项目结构看起来是这样的:

ProjectName/ 
    ModuleOne/ 
    Class.php 
    composer.json 
    tests/ 
     phpunit.xml 
     bootstrap.php 
     Class_test.php 

在上面的例子Class.php将被实例化这样的:ProjectName\ModuleOne\Class();

现在的问题是我们如何建立我们的测试目录,因为Class_test.php将使用Class.php任何其他需要依赖的类,我需要一些方法让我在我的测试中进行实例化。当我试图让我得到一个错误,说它不能找到我试图实例化的类。

虽然这可能是一种不寻常的做事方式,但是这个项目可以使用composer将每个模块导出并使用我们选择的名称空间自动加载到您的项目中,在这种情况下为ProjectName

我似乎遇到的问题是,我需要每一个类被自动加载tests/目录,并准备到外面去,这样如果Class.php延伸的任何其他类,然后当Class.php被调用时就知道了,“好,我需要去这里看看这个其他班是否也存在。“

现在每个模块确实有一个作曲家文件,里面我们也有类似:

"autoload": { 
    "psr-0": { 
     "ProjectName\\ModuleOne\\": "" 
    } 
    }, 

这样我就可以使用这个一些如何在bootstrap.php中自动负载测试目的这整个模块?

+0

你能包括autoload.php文件作曲家在bootstrap.php中产生? – STLMikey

我不会试图重新发明*,我会去与作曲家建议的包装结构。

快速谷歌搜索给了我这个博客文章的链接:How to create a PSR-4 PHP package。它非常详细地描述了作曲家包的文件结构应该如何,以及如何设置和组织你的包的测试。

希望这会有所帮助。

编辑:

假设你在上面后建议的结构,所有你需要做的就是告诉PHPUnit的在哪里可以找到由作曲家创建的自动加载的文件。如果您需要更复杂的引导程序,可以执行以下操作。创建一个文件tests/bootstrap.php,并添加以下内容吧:

require_once 'path/to/composer/autoload.php'; 
// Set up your stubs, mocks etc. 

在你phpunit.xml文件,你需要点PHPUnit的正确引导文件,如:

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit backupGlobals="false" 
    backupStaticAttributes="false" 
    bootstrap="tests/bootstrap.php" 
    colors="true" 
    convertErrorsToExceptions="true" 
    convertNoticesToExceptions="true" 
    convertWarningsToExceptions="true" 
    processIsolation="false" 
    stopOnFailure="false" 
    syntaxCheck="false"> 
    <testsuites> 
     <testsuite name="Nacho Test Suite"> 
      <directory suffix=".php">./tests/</directory> 
     </testsuite> 
    </testsuites> 
</phpunit> 

或者你可以运行PHPUnit的与--bootstrap标志,如:

vendor/bin/phpunit --bootstrap path/to/bootstrap.php 
+0

那就是我是如何做事的,因为我从Zend Framework偷走了我的设置。所以我坚持习惯。我只是没有向你展示我的所有composer.json文件。 那么如何使用与phpunit相关的composer.json来加载这个模块呢? – TheWebs

+0

如果你的类是由composer自动加载的,并且如果你不需要任何额外的bootstrapping用于你的测试,可以在你的phpunit.xml配置文件中添加'bootstrap =“vendor/autoload.php”'(如上面链接所示)。我将编辑显示答案给你一个额外的引导示例。 –