PHP Conference Japan 2024

魔术常量

有一些魔术常量会根据它们的使用位置而改变。例如,__LINE__的值取决于它在脚本中使用的行号。所有这些“魔术”常量都在编译时解析,这与在运行时解析的常规常量不同。这些特殊常量不区分大小写,如下所示:

PHP 的魔术常量
名称 描述
__LINE__ 文件的当前行号。
__FILE__ 文件的完整路径和文件名,已解析符号链接。如果在 include 中使用,则返回包含文件的名称。
__DIR__ 文件的目录。如果在 include 中使用,则返回包含文件的目录。这等效于dirname(__FILE__)。此目录名不包含尾部斜杠,除非它是根目录。
__FUNCTION__ 函数名,或匿名函数的{closure}
__CLASS__ 类名。类名包含其声明的命名空间(例如 Foo\Bar)。在 trait 方法内部使用时,__CLASS__ 是使用 trait 的类的名称。
__TRAIT__ trait 名。trait 名包含其声明的命名空间(例如 Foo\Bar)。
__METHOD__ 类方法名。
__PROPERTY__ 仅在属性钩子内部有效。它等于属性的名称。
__NAMESPACE__ 当前命名空间的名称。
ClassName::class 完全限定的类名。

添加备注

用户贡献的备注 3 条备注

Rich
1 年前
<?php

namespace My\App {
class
Api {
public static
fetch() {
print
__FUNCTION__ . "\n"; // 输出 fetch
print __METHOD__ . "\n"; // 输出 My\App\Api::fetch
}
}

Api::fetch();
}

namespace {
My\App\Api::fetch();
}
?>

__METHOD__ 输出完全限定的方法名;__FUNCTION__ 在方法中使用时,只输出方法名。
chris at ocproducts dot com
1 年前
请注意,__CLASS__ 和 __METHOD__ 都引用编写代码的类,而不是对象的类。例如,如果您有一个继承自类 A 的类 B 对象,则在类 A 中使用 __CLASS__ 将返回“A”。
theking2 at king dot ma
2 年前
如果 PHP 在 Web 服务器请求中运行,则 __DIR__ 常量和 $_SERVER['DOCUMENT_ROOT'] 之间存在重要区别。

其中,包含在子文件夹中的 PHP 脚本的 __DIR__ 将包含完整的服务器路径,而 $_SERVER['DOCUMENT_ROOT'] 将包含应用程序根目录之前的服务器路径。例如,当自动加载器定义在位于子文件夹中的 include 文件中,而类位于应用程序根目录下的另一个文件夹中时,这将非常有用。
To Top