【发布时间】: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