如何在文件中包含php别名
Posted
技术标签:
【中文标题】如何在文件中包含php别名【英文标题】:how to include php aliases across files 【发布时间】:2015-10-24 13:22:03 【问题描述】:我可以把它写在一个文件里:
use Carbon\Carbon as Carbon;
我试图创建一个文件'aliases.php':
use Carbon\Carbon as Carbon;
然后我这样引用:
require __DIR__.'/../bootstrap/aliases.php';
printf("Right now is %s", Carbon::now()->toDateTimeString());
但这给了我错误:“致命错误:未找到‘Carbon’类”
那么我怎样才能“包含”一个包含所有预定义别名的文件呢?
【问题讨论】:
你能贴一张你的文件和文件夹结构的图片吗? @WilliamFrancisGomes 问题不在于包含路径,我通过从 aliases.php 中回显一个字符串进行了测试 我不认为 /../ 在 DIR 之后是必需的。可以吗? 【参考方案1】:首先,您的 aliases.php 文件不起作用的原因是 use 语句仅在声明它们的文件中可见。在换句话说,它们在您的 aliases.php 文件中有效,但在 include/require aliases.php 的文件中无效。
来自 PHP 文档Using namespaces: Aliasing/Importing:
注意:
导入规则是基于每个文件的,这意味着包含的文件不会继承父文件的导入规则。
其次,由于命名空间在 PHP 中的工作方式,不可能做你想做的事情。当 PHP 看到一个类名时,它总是 会尝试在当前命名空间中查找该类,并且无法更改它。因此,如果您在任何命名空间代码中调用 Carbon,它将被解释为 Current\Namespace\Carbon,如果您从全局命名空间调用它,它将被解释为\碳。
我想到的唯一可以做类似事情的事情是在全局命名空间中声明一个类,该类将扩展您尝试使用的类,然后改用这些类。对于碳,它将是:
<?php
use Carbon\Carbon as BaseCarbon;
class Carbon extends BaseCarbon
然后在您的代码中,您可以通过以下方式访问它:
\Carbon::now();
请记住,您需要在类名前加上 \ 前缀,以便它始终取自全局命名空间,除非您正在执行的代码已经在全局命名空间中。
【讨论】:
感谢您提供如此简洁的解释和替代方法。我的一些命名空间路径很长,所以基本上只是想在其他地方整理它们,也许我会坚持使用它们,因为扩展每个类可能会变得混乱。 我会这样做,因为这是使用命名空间的正确方法。大多数(如果不是全部)IDE 会自动添加 use 语句,因此不会增加任何开销。 是否有关于“使用语句仅在声明它们的文件中可见”引用的任何文档?这正是我想要的,但在 PHP 命名空间文档中找不到它 现在我知道要找什么了,我找到了 :)以上是关于如何在文件中包含php别名的主要内容,如果未能解决你的问题,请参考以下文章
如何在另一个 php.ini 文件中包含一个 php.ini 文件?