可以在 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
}
有些人混淆地在 echo
或 print
之后加上括号,将它们视为函数,但实际上它们不是。括号中列出的函数的行为类似于接受参数的函数,但您也不能导入它们。
我找不到关于我无法导入任何魔法常量这一事实的任何提示。
正在尝试喜欢...
<?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
}
有些人混淆地在 echo
或 print
之后加上括号,将它们视为函数,但实际上它们不是。括号中列出的函数的行为类似于接受参数的函数,但您也不能导入它们。