PHP 入门教程
PHP 魔术常量
本教程共 65 篇 · 第 17 篇 · 更新于 2026-07-24 · 约 4 分钟阅读
PHPPHP8魔术常量__FILE____DIR____LINE__
17. PHP 魔术常量
本节目标:掌握 PHP 内置的魔术常量。学完你能获取代码位置信息,方便调试和路径处理。
17.1 什么是魔术常量
魔术常量是由双下划线包围的预定义常量。它们的值会根据使用位置自动变化,所以称为”魔术”。
17.2 文件位置相关
__FILE__
返回当前文件的完整路径和文件名:
<?php
echo __FILE__;
// 输出:D:\project\index.php
// 常用于定位配置文件
$configPath = dirname(__FILE__) . '/config.php';
?>
__DIR__
返回当前文件所在目录的完整路径:
<?php
echo __DIR__;
// 输出:D:\project
// 加载同级目录下的文件
require __DIR__ . '/functions.php';
// 加载上级目录的文件
require __DIR__ . '/../vendor/autoload.php';
?>
Tip
__DIR__是 PHP 5.3 引入的,比dirname(__FILE__)更简洁。推荐始终使用__DIR__。
__LINE__
返回当前代码所在的行号:
<?php
echo __LINE__; // 2
echo __LINE__; // 4
// 调试时快速定位
function debug(string $msg): void {
echo "[行" . __LINE__ . "] $msg"; // 注意:这里显示的是 debug 函数定义的行
}
// 正确做法:把行号作为参数传入
function debug2(string $msg, int $line): void {
echo "[行{$line}] $msg";
}
debug2("出错了", __LINE__);
?>
17.3 函数和类相关
__FUNCTION__
返回当前函数的名称:
<?php
function myTest(): void {
echo __FUNCTION__; // myTest
}
myTest();
?>
__CLASS__
返回当前类的名称:
<?php
class User {
public function show(): void {
echo __CLASS__; // User
}
}
$user = new User();
$user->show();
?>
__METHOD__
返回当前方法的完整名称(类名::方法名):
<?php
class Product {
public function getName(): void {
echo __METHOD__; // Product::getName
}
}
$product = new Product();
$product->getName();
?>
__NAMESPACE__
返回当前命名空间的名称:
<?php
namespace App\Models;
class Order {
public function info(): void {
echo __NAMESPACE__; // App\Models
}
}
?>
__TRAIT__
返回当前 Trait 的名称:
<?php
trait Logger {
public function log(string $msg): void {
echo __TRAIT__; // Logger
}
}
class Service {
use Logger;
}
$service = new Service();
$service->log("test");
?>
17.4 魔术常量速查表
| 常量 | 含义 | 示例输出 |
|---|---|---|
__LINE__ | 当前行号 | 15 |
__FILE__ | 当前文件完整路径 | D:\project\index.php |
__DIR__ | 当前文件所在目录 | D:\project |
__FUNCTION__ | 当前函数名 | myFunc |
__CLASS__ | 当前类名 | User |
__TRAIT__ | 当前 Trait 名 | Logger |
__METHOD__ | 当前方法名 | User::save |
__NAMESPACE__ | 当前命名空间 | App\Models |
17.5 实际应用场景
自动加载类文件
<?php
// 基于 __DIR__ 构建路径
spl_autoload_register(function (string $class) {
$path = __DIR__ . '/src/' . str_replace('\\', '/', $class) . '.php';
if (file_exists($path)) {
require $path;
}
});
?>
日志记录
<?php
function logError(string $message): void {
$time = date('Y-m-d H:i:s');
$file = basename(__FILE__);
$line = __LINE__; // 注意:这是 logError 函数定义的行
error_log("[$time] $file:$line - $message");
}
// 更实用的日志类(使用 debug_backtrace 获取调用位置)
class Logger {
public static function error(string $message): void {
$trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 1)[0];
$file = basename($trace['file']);
$line = $trace['line'];
error_log("[$file:$line] $message");
}
}
?>
生成绝对路径
<?php
// 项目根目录
define('ROOT_DIR', __DIR__);
// 各目录常量
define('CONFIG_DIR', ROOT_DIR . '/config');
define('VIEW_DIR', ROOT_DIR . '/views');
define('UPLOAD_DIR', ROOT_DIR . '/uploads');
// 使用
$config = require CONFIG_DIR . '/database.php';
?>
来源:参考了 w3cschool「PHP 魔术常量」、runoob「PHP 魔术常量」以及 php.net 官方文档,综合改写后所得。