首页 / PHP 入门教程 / PHP 魔术常量

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 官方文档,综合改写后所得。