如何跨文件包含php别名

S..*_*S.. 4 php namespaces aliases

我可以把它写在一个文件中:

use Carbon\Carbon as Carbon;
Run Code Online (Sandbox Code Playgroud)

我试图创建一个文件“aliases.php”:

use Carbon\Carbon as Carbon;
Run Code Online (Sandbox Code Playgroud)

然后我像这样引用:

require __DIR__.'/../bootstrap/aliases.php';

printf("Right now is %s", Carbon::now()->toDateTimeString());
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:“致命错误:找不到‘碳’类”

那么如何“包含”一个具有所有预定义别名的文件呢?

jed*_*ylo 5

首先,您的aliases.php文件不起作用的原因是use语句仅在声明它们的文件中可见。换句话说,它们在您的aliases.php文件中工作,但在包含/require aliases.php。

来自 PHP 文档Using namespaces: Aliasing/Importing

笔记:

导入规则是基于每个文件的,这意味着包含的文件不会继承父文件的导入规则。

其次,由于命名空间在 PHP 中的工作方式,无法执行您正在尝试执行的操作。当 PHP 看到一个类名时,它总是试图在当前命名空间中找到该类,并且无法更改它。因此,如果您在任何命名空间代码中调用Carbon,它将被解释为Current\Namespace\Carbon,如果您从全局命名空间调用它,它将被解释为\Carbon

我想到的唯一可以做类似事情的事情是在全局命名空间中声明一个类,该类将扩展您尝试使用的类,然后改用这些类。对于碳,它将是:

<?php
use Carbon\Carbon as BaseCarbon;

class Carbon extends BaseCarbon {}
Run Code Online (Sandbox Code Playgroud)

然后在您的代码中,您可以通过以下方式访问它:

\Carbon::now();
Run Code Online (Sandbox Code Playgroud)

请记住,您需要在类名前加上\前缀,以便它始终取自全局命名空间,除非您正在执行的代码已经在全局命名空间中。