【问题标题】:Can you avoid specifying a namespace when invoking a class which uses one?在调用使用命名空间的类时,你能避免指定命名空间吗?
【发布时间】:2021-04-15 12:56:58
【问题描述】:

我有一个不实现命名空间的旧框架。如果我尝试通过首先在类声明的顶部声明一个命名空间来慢慢引入命名空间,那么该类的任何调用现在都将失败,因为它不是通过其命名空间调用的。即使类文件已经包含在内,并且(或者我认为)不需要 PHP 知道命名空间。

似乎 PHP 并不关心它可以找到名称为 Foo 的类,因为如果 Foo 在命名空间下,那么它总是会要求您必须指定命名空间也是如此。

作为一个简单的测试,我把它放在一个文件中:

<?php

namespace Test;

class Foo {
    function bar(): void {
        print "Hello world.";
    }
}

这在另一个:

<?php

include "Foo.php";

$foo = new Foo;
$foo->bar();

它给了我以下错误:

致命错误:未捕获的错误:未找到“Foo”类

所以我的问题是,是否可以避免这种行为(可能使用一些配置选项)以缓解从不使用命名空间的框架到使用命名空间的框架的缓慢过渡,或者我是否必须替换所有在它变得可用之前立即上课?是否有任何 hacky 替代方案?

【问题讨论】:

  • 您可以尝试使用 class_alias() 将命名空间类别名为没有命名空间的旧名称,但这无助于将代码库移动到命名空间,只会造成更大的混乱。您应该通过将 use Test\Foo; 添加到使用此类的所有文件来修复此类的所有用法(并可能处理类名定义为字符串的情况,因为 use 关键字不会影响它们。应该有工具可以帮助自动执行此操作(例如,PhpStorm 能够重命名类并修复所有用法)。

标签: php namespaces php-7


【解决方案1】:

你丢失了命名空间:)

$foo = new \Test\Foo();

【讨论】:

    【解决方案2】:

    您需要像这样提供类的“路径”:

    <?php
    
    use Test\Foo;
    
    include "foo.class.php";
    
    $foo = new Foo;
    $foo->bar();
    

    我没有看到其他解决方案...

    有关使用的更多信息:https://www.php.net/manual/en/language.namespaces.importing.php

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2011-08-16
      • 1970-01-01
      • 1970-01-01
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多