【问题标题】:Same namespace with files in different folders具有不同文件夹中文件的相同命名空间
【发布时间】:2020-07-17 03:47:12
【问题描述】:

我正在尝试构建一个项目,以便自动生成的一些代码位于子文件夹 generated/ 中,但它与父目录中的文件具有相同的命名空间。

例如,我有这个结构,它给了我错误PHP Fatal error: Uncaught Error: Class 'MyProject\Foo' not found

这样的不同文件夹中的 2 个不同文件是否可以具有相同的命名空间?

--lib/
----Foo.php
----generated/
----generated/Bar.php

lib/Foo.php

<?php

namespace MyProject;

class Foo {
  ...
}

lib/generated/Bar.php

<?php

namespace MyProject;

class Bar {

  public function __construct() {
    $foo = new Foo();
  }
}

我的自动加载部分如下所示:

"autoload": {
      "psr-4": {
          "MyProject\\" : "lib/"
      }
  },

【问题讨论】:

  • 是的,这完全有可能。您只需要确保 Foo.php 在某个时候是 included,无论是显式地还是通过自动加载。
  • 我的 composer.json 文件会自动加载整个 MyProject 命名空间。
  • 您是否也在加载自动装载机……?如果您直接调用生成的文件并且它不包含自动加载器,则不会发生这种情况......
  • 我没有在我的库中加载自动加载器,但在一个项目中我正在使用这个库,是的。我在lib/ 下的文件/文件夹的重置按预期工作。

标签: php namespaces


【解决方案1】:

您正在尝试使用命名空间而不使用 use 键。尝试遵循以下对您有帮助的代码。当您尝试访问其他类时,您必须通过命名空间访问,否则您将无法做到这一点。按照下面的代码。

<?php

namespace MyProject;

class Foo {
  ...
}

<?php

namespace MyProject;
use MyProject\Foo;

class Bar {

  public function __construct() {
    $foo = new Foo();
  }
}

希望现在可以使用。

【讨论】:

  • new Foonamespace MyProject 中已经引用了MyProject\Foo,没有多余的use。错误消息甚至是这样说的。
【解决方案2】:

只有在调用函数时包含 Foo.php 才能工作。

正如您所提到的,您正在使用 composer 自动加载整个命名空间。命名空间就像一个虚拟目录结构。在您的情况下,每个类都具有相同的命名空间,因此它试图查看同一目录中的所有文件,因为在您的情况下 Foo.php 没有通过作曲家加载。

所以最好明智地使用不同的命名空间目录或将它们包含在路径中。

【讨论】:

    【解决方案3】:

    听起来您正在使用 Composer 进行自动加载。您可以配置 composer 在多个目录中搜索给定的命名空间。

    这是一些示例配置(假设 PSR-4 自动加载)

    {
        "autoload": {
            "psr-4": { "MyProject\\": ["lib/", "lib/generated"] }
        }
    }
    

    如果您可以提供您的 Composer 项目的 autoload 部分,我可以提供更具体的详细信息。

    【讨论】:

    • 我添加了我的自动加载部分。我的印象是 lib/ 下的所有内容都将被搜索,因为我的所有其他文件夹(我在示例中未列出)都被正确找到,因为它们具有不同的命名空间子路径。
    • 子目录必须匹配命名空间。对于您生成的文件夹,命名空间需要是“MyProject\generated”
    • 如上所述将“MyProject\\”的映射添加到“lib/”和“lib/generated”应该可以工作。每个目录都不是一个搜索路径,而是一个精确的映射。
    • 我特别不希望我的命名空间中有MyProject\generated。添加两个值的数组有效!
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多