我找不到关于无法导入任何魔术常数的事实的提示。
试图喜欢...
<?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倾向于自动导入魔术常数。而且如果不可能的话,需要报告并解决。
答案 0 :(得分:2)
在PHP中,只有OOP内容(类,接口,异常,错误...)必须完全由名称限定。如果您未指定全名或未将类导入另一个名称空间,则PHP 不会回退到全局名称空间来查找它。
您还可以使用完全指定的函数或常量。函数可以属于一个名称空间,并且实际上所有核心功能都属于全局名称空间,即\
。 PHP将首先在当前名称空间中查找函数,并且it will fall back to global functions or constants if a namespaced function or constant does not exist.如果显式指定全局名称空间,则可以执行微优化,因为PHP将直接在全局名称空间中查找。
namespace A {
function phpinfo(){
echo 'I am bogus';
}
phpinfo(); // vs. \phpinfo()
}
Magic constants根本不是常量。它们根据上下文改变价值。它们更像是魔术变量。以下代码无效,因为这些常量不属于任何名称空间,甚至不属于全局名称空间。
namespace A {
echo \__LINE__;
}
在编译时,PHP将用实际值替换它们。由于完全相同的原因,它们也无法导入,它们在任何地方都没有定义,它们只是编译器的一条指令。
还有其他无法导入或命名空间的内容,请参见:List of Keywords。
您不能使用以下任何单词作为常量,类名,函数或方法名。
namespace A {
\echo 'hi'; // <-- this line is invalid code
\die(1); // neither is this, even if it looks and behaves like a function
}
有些人混淆地将括号放在echo
或print
之后,将其视为函数,但实际上并非如此。带有括号的列的行为类似于接受参数的函数,但是您也不能导入它们。