PHP 魔术常量(Magic Constants)
1. 什么是 PHP 魔术常量?
PHP 魔术常量(Magic Constants) 是 预定义的常量,它们的值 根据代码的具体位置动态变化,而 不像普通常量那样固定不变。
✅ 魔术常量的特点:
- 以
__(双下划线)开头和结尾 - 可在代码执行时动态获取值
- 与普通常量不同,它们的值是动态的
2. PHP 8.0 及更早版本的所有魔术常量
PHP 目前有 9 个魔术常量,如下所示:
| 魔术常量 | 说明 |
|---|---|
__LINE__ | 获取当前行号 |
__FILE__ | 获取当前文件的完整路径 |
__DIR__ | 获取当前文件所在目录的完整路径 |
__FUNCTION__ | 获取当前函数名称 |
__CLASS__ | 获取当前类的名称 |
__TRAIT__ | 获取当前 Trait(特性)的名称 |
__METHOD__ | 获取当前方法的名称 |
__NAMESPACE__ | 获取当前命名空间的名称 |
ClassName::class | 获取完整类名(包括命名空间) |
3. PHP 魔术常量详细讲解
1. __LINE__ – 获取当前代码行号
<?php
echo "当前行号:" . __LINE__ . "<br>";
?>
🔹 输出
当前行号:3
✅ 用法:可用于 调试代码,输出代码执行的行号。
2. __FILE__ – 获取当前文件的完整路径
<?php
echo "当前文件路径:" . __FILE__ . "<br>";
?>
🔹 输出
当前文件路径:/var/www/html/test.php
✅ 用法:可用于 获取当前脚本的完整路径,便于 调试或日志记录。
3. __DIR__ – 获取当前文件所在目录
<?php
echo "当前文件所在目录:" . __DIR__ . "<br>";
?>
🔹 输出
当前文件所在目录:/var/www/html
✅ 用法:适用于 包含(include)或引入(require)文件时使用,防止路径错误。
<?php
require __DIR__ . "/config.php";
?>
✅ 推荐使用 __DIR__ 而不是 dirname(__FILE__)(从 PHP 5.3 开始)
4. __FUNCTION__ – 获取当前函数名称
<?php
function testFunction() {
echo "当前函数名:" . __FUNCTION__ . "<br>";
}
testFunction();
?>
🔹 输出
当前函数名:testFunction
✅ 用法:用于 调试、日志记录 或 动态调用函数。
5. __CLASS__ – 获取当前类名
<?php
class MyClass {
function printClassName() {
echo "当前类名:" . __CLASS__ . "<br>";
}
}
$obj = new MyClass();
$obj->printClassName();
?>
🔹 输出
当前类名:MyClass
✅ 用法:用于 动态获取类名,便于 日志记录或反射(Reflection)。
6. __TRAIT__ – 获取当前 Trait 名
<?php
trait MyTrait {
function showTrait() {
echo "当前 Trait 名:" . __TRAIT__ . "<br>";
}
}
class MyClass {
use MyTrait;
}
$obj = new MyClass();
$obj->showTrait();
?>
🔹 输出
当前 Trait 名:MyTrait
✅ 用法:适用于 复用代码(Traits) 时的 动态获取 Trait 名称。
7. __METHOD__ – 获取当前方法名称
<?php
class MyClass {
function myMethod() {
echo "当前方法名:" . __METHOD__ . "<br>";
}
}
$obj = new MyClass();
$obj->myMethod();
?>
🔹 输出
当前方法名:MyClass::myMethod
✅ 用法:可用于 调试或日志记录,用于跟踪 哪个方法被调用。
8. __NAMESPACE__ – 获取当前命名空间
<?php
namespace MyNamespace;
echo "当前命名空间:" . __NAMESPACE__ . "<br>";
?>
🔹 输出
当前命名空间:MyNamespace
✅ 用法:可用于 动态调用命名空间内的函数。
9. ClassName::class – 获取完整类名(PHP 5.5+)
<?php
namespace MyNamespace;
class MyClass {}
echo MyClass::class;
?>
🔹 输出
MyNamespace\MyClass
✅ 用法:适用于 动态获取类名(包括命名空间),用于 自动加载类 或 反射(Reflection)。
4. 魔术常量使用场景
| 使用场景 | 推荐魔术常量 | 示例 |
|---|---|---|
| 日志记录 | __LINE__, __FILE__, __METHOD__ | 记录调试信息 |
| 动态调用类/函数 | __CLASS__, __FUNCTION__ | 反射(Reflection) |
| 自动加载文件 | __DIR__ | require __DIR__ . "/config.php"; |
| 命名空间 | __NAMESPACE__ | echo __NAMESPACE__; |
5. 完整示例:日志记录
<?php
function logMessage($message) {
$file = __FILE__;
$line = __LINE__;
$method = __METHOD__;
echo "[LOG] 文件: $file | 行: $line | 方法: $method | 消息: $message <br>";
}
class MyClass {
function myMethod() {
logMessage("进入方法");
}
}
$obj = new MyClass();
$obj->myMethod();
?>
🔹 示例输出
[LOG] 文件: /var/www/html/test.php | 行: 3 | 方法: logMessage | 消息: 进入方法
6. 结论
魔术常量的核心价值
- ✅ 动态获取代码信息
- ✅ 提高代码可维护性
- ✅ 方便调试、日志记录
- ✅ 适用于反射(Reflection)、自动加载、动态调用等高级用法
🔗 推荐阅读
更多详细内容请关注其他相关文章!