php 在父文件夹中使用`class

php `use` class in parent folder

我已经安装了 Propel ORM with Composer,但我无法创建新模型,因为 PHP 脚本与 PHP class 不在同一目录中。

我在 Test.php 中有 class Test,我想从 subfolder/index.php 开始使用它。请注意 class Test 然后使用 Base/Test.php 中的 Base/Test,因此在这里使用 require() 不是一个选项,因为 Base/Test 只是继续使用甚至更多 class 由作曲家生成。

传统上,我应该执行以下操作:

<?php
   use Test;
?>

但是因为我在父文件夹中有 Test,所以我不能那样做,显然

<?php
   use ../Test;
?>

不起作用。

我的文件夹结构:

My Project
|-- Base
|   `-- Test.php <-- File referenced by `Test` class
|-- subfolder
|   `-- index.php <-- File I want to use `Test` from
`-- Test.php <-- File containing `Test` class

实际代码: subfolder/index.php:

<?php 
use \Test;
    require __DIR__ . '/../vendor/autoload.php';
    $test = new Test();
?>

Test.php:

<?php
use Base\Test as BaseTest;

class Test extends BaseTest
{

}

Test 是一个命名空间,实际上与文件夹结构无关。命名空间有一个文件夹-类似的结构,但是你不能使用相对路径。

PSR-4 自动加载器,例如现在大多数 Composer 软件包使用的东西,以一种非常接近文件夹结构的方式映射它们的命名空间,但它们仍然是完全独立的概念。

如果您在文件中声明了命名空间,则所有后续名称都将被视为与该路径相关。例如:

namespace Foo;

class Bar {}; // \Foo\Bar

如果你想使用当前命名空间外部的东西,你需要声明完整路径,以\开头,表示root 命名空间。例如:

namespace Foo;
use \Test

class Bar { // \Foo\Bar
  public function test() {
    $test = new Test();
    $dbh = new \PDO();
  }
}

只需在 composer.json 文件中设置您想要的所有文件夹。像这样:

"autoload": {
    "psr-4": {
        "App\": "app/",
        "Config\": "config/"
    },
    "files": [
        "config/config.php"
    ]
},

搜索 composer.json 以了解更多信息。对于上面的示例,我为项目根目录中的目录“app/”和“config/”选择了命名空间“App”和“Config”,并选择了文件“config/config.php " 在我的项目中进行任何操作之前 运行。