可以在 PHP 中导入魔法常量吗

Can magic constants be imported in PHP

我找不到关于我无法导入任何魔法常量这一事实的任何提示。

正在尝试喜欢...

<?php declare( strict_types = 1 );
namespace CodeKandis\MyVendor;

use function dirname;
use const __DIR__;

require_once dirname( __DIR__ ) . '/vendor/autoload.php';

...导致

Parse error: syntax error, unexpected '__DIR__' (T_DIR), expecting identifier (T_STRING) or \ (T_NS_SEPARATOR) in /public/index.php on line 5

这个问题很重要,因为 PHPStorm 倾向于自动导入魔法常量。如果不可能,则需要报告和修复。


编辑 (2019-07-25)

I opened an issue 之后,这将在 PHPStorm 2019.3 中修复。

在 PHP 中,只有 OOP 内容(classes、接口、异常、错误...)必须完全 named-qualified。如果您没有指定全名或没有将 class 导入另一个命名空间,PHP 将不会 回退到全局命名空间来查找它。

您还可以使用 fully-specified 函数或常量。函数可以属于一个命名空间,事实上所有核心函数都属于全局命名空间,即 \。 PHP会先在当前命名空间中查找函数,it will fall back to global functions or constants if a namespaced function or constant does not exist.如果明确指定全局命名空间,则可以执行micro-optimization,因为PHP会直接在全局命名空间中查找.

namespace A {
    function phpinfo(){
        echo 'I am bogus';
    }
    phpinfo(); // vs. \phpinfo()
}

Magic constants 根本不是常量。他们根据上下文更改值。它们更像是魔法变量。以下代码无效,因为这些常量不属于任何名称空间,甚至不属于全局名称空间。

namespace A {
    echo \__LINE__;
}

在编译时 PHP 将用实际值替换它们。出于完全相同的原因,它们也不能被导入,它们没有在任何地方定义,它们只是编译器的一条指令。

还有其他一些不能导入或命名空间的东西,参见:List of Keywords

You cannot use any of the following words as constants, class names, function or method names.

namespace A {
    \echo 'hi'; // <-- this line is invalid code
    \die(1); // neither is this, even if it looks and behaves like a function
}

有些人混淆地在 echoprint 之后加上括号,将它们视为函数,但实际上它们不是。括号中列出的函数的行为类似于接受参数的函数,但您也不能导入它们。