【问题标题】:php namespaces: what needs to be qualified?php 命名空间:需要限定什么?
【发布时间】:2015-09-15 06:18:44
【问题描述】:

我不熟悉在 PHP 中使用命名空间,它们看起来很简单。但是,当我在包含类、接口和闭包的大文件顶部添加命名空间时,代码完全停止工作。显然有些元素没有正确限定。

例如:

<?php
namespace MyNamespace;
interface MyInterface { ... }
class MyClass implements MyInterface { ... }
...

我阅读了 php.net 上的文档,但找不到需要在单个命名空间(全局或其他方式)下限定的元素的简单列表。

所以我的问题是,如果你只是在一个没有命名空间的文件的顶部声明一个命名空间,那么在这种情况下哪些元素需要限定?

【问题讨论】:

  • 目前假定MyInterfaceMyNamespace 命名空间中。要从根/全局命名空间获取 MyInterface,请使用 \MyInterface,这意味着 MyInterface 没有命名空间。如果它是命名空间但是你应该做\TheNamespace\MyInterface 或在文件顶部定义\TheNamespace\MyInterface 这样你就可以简单地使用MyInterface
  • “代码完全停止工作”不是一个很清楚的问题描述。请向a complete example of a simple piece of code 提供您预期的结果,以及您得到的结果/错误消息。

标签: php oop namespaces


【解决方案1】:

您现在拥有的方式是将所有内容都放在一个文件中,该文件中的每个类、接口或函数现在都位于 MyNamespace 命名空间中。因此,在这些类、接口和函数中,如果要引用位于不同命名空间(全局或命名)中的类,则必须使用它的完全限定名称(或使用 use 语句在顶部声明别名文件)。注意:预先挂起 \ 将使您进入全局命名空间。

此外,如果您想从文件外部访问这些类、接口或函数之一,则必须使用完全限定名称。

MyNamespace\MyInterface
MyNamespace\MyClass

我还要提一下,这不是典型的设置。根据 psr 标准,每个文件应该只有 1 个类。查看http://www.php-fig.org/,了解有关标准和实践的更多指导。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-17
    • 2011-08-15
    • 2016-12-10
    • 2015-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2013-10-16
    相关资源
    最近更新 更多