0

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

试图喜欢...

<?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)

我打开一个问题后,这将在 PHPStorm 2019.3 中得到修复。

4

1 回答 1

1

在 PHP 中,只有 OOP 的东西(类、接口、异常、错误...)必须是完全命名限定的。如果您没有指定全名或没有将类导入另一个命名空间,PHP将不会回退到全局命名空间来查找它。

您还可以使用完全指定的函数或常量。函数可以属于一个命名空间,实际上所有核心函数都属于全局命名空间,即\. PHP将首先在当前命名空间中查找函数,如果命名空间函数或常量不存在,它将回退到全局函数或常量如果显式指定全局命名空间,则可以执行微优化,因为 PHP 将直接在全局命名空间中查找。

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

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

namespace A {
    echo \__LINE__;
}

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

还有其他不能导入或命名空间的东西,请参阅:关键字列表

您不能将以下任何单词用作常量、类名、函数或方法名。

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

有些人混淆地把括号放在echoor之后print,将它们视为函数,但实际上并非如此。用括号列出的那些行为类似于接受参数的函数,但您也不能导入它们。

于 2019-07-08T20:33:45.997 回答