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

How do I load the file I need? PHP

虽然这可能是一个基本问题,但人们会假设使用 require_once,它实际上比那个更复杂 - 至少对我而言。

我遇到的问题是我的项目结构很像 Java 中的包结构。我们如何使用全局名称 space。所以项目结构看起来像:

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

在上面的示例中,Class.php 将被实例化为:ProjectName\ModuleOne\Class();

现在的问题是我们如何设置我们的测试目录,因为 Class_test.php 将使用 Class.php 和任何其他依赖的 classes,我需要一些方法来允许我在我的测试中实例化,class 有问题。每当我尝试时,我都会收到一条错误消息,说它找不到我正在尝试实例化的有问题的 class。

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

我似乎遇到的问题是我需要 tests/ 目录之外的每个 class 自动加载并准备好,这样如果 Class.php 扩展任何其他目录class 那么当 Class.php 被调用时它会知道,"ok I need to go here to see if this other class exists as well."

现在每个模块都有一个 composer 文件,里面有类似的东西:

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

那么我可以在 bootstrap.php 中使用它来自动加载整个模块以进行测试吗?

我不会尝试重新发明轮子,我会采用 composer 建议的包结构。

快速 google 搜索让我 link 这个博客 post:How to create a PSR-4 PHP package。它几乎描述了 composer 包的文件结构应该是什么样子以及如何设置和组织包的测试。

希望对您有所帮助。

编辑:

假设你有上面 post 中建议的结构,你需要做的就是告诉 phpunit 在哪里可以找到由 composer 创建的自动加载文件。如果您需要更复杂的 bootstrapping,您可以执行以下操作。创建文件 tests/bootstrap.php 并向其中添加以下内容:

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

在您的 phpunit.xml 文件中,您需要将 phpunit 指向正确的 bootstrap 文件,例如:

<?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>

或者你可以 运行 带有 --bootstrap 标志的 phpunit,例如:

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