可以在PHP中导入魔术常数吗

时间:2019-07-08 09:18:53

标签: php import php-7.3 magic-constants

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

试图喜欢...

<?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倾向于自动导入魔术常数。而且如果不可能的话,需要报告并解决。

1 个答案:

答案 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
}

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