首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 魔術常數 __METHOD__ 與 __FUNCTION__ 差異完整解析

     編輯:PHP 相關知識

一句話總結

__FUNCTION__ 返回「函式/方法名稱」
__METHOD__ 返回「類別名稱::方法名稱」

程式碼驗證

<?php
class UserService {
    public function register($data) {
        echo "FUNCTION: " . __FUNCTION__ . "\n"; // register
        echo "METHOD: " . __METHOD__ . "\n";     // UserService::register
    }
    
    public static function findById($id) {
        echo "FUNCTION: " . __FUNCTION__ . "\n"; // findById
        echo "METHOD: " . __METHOD__ . "\n";     // UserService::findById
    }
}

// 實例方法
$service = new UserService();
$service->register(['name' => 'John']);

// 靜態方法
UserService::findById(123);

// 全域函式 (兩者相同)
function helper() {
    echo __FUNCTION__ . " == " . __METHOD__ . "\n"; // helper == helper
}
helper();

所有 9 個魔術常數速查

常數返回值備註
__LINE__目前行號整數
__FILE__完整檔案路徑已解析符號連結
__DIR__檔案目錄PHP 5.3+,等同 dirname(__FILE__)
__FUNCTION__函式/方法名區分大小寫,PHP 5+
__CLASS__類別名稱 (含命名空間)區分大小寫,PHP 5+
__TRAIT__Trait 名稱 (含命名空間)PHP 5.4+
__METHOD__類別::方法名區分大小寫,PHP 5+
__NAMESPACE__目前命名空間PHP 5.3+,編譯期常數

實務應用場景

1. 結構化日誌自動帶入位置

function logInfo($message, array $context = []) {
    $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2)[1] ?? [];
    $location = ($trace['class'] ?? '') . '::' . ($trace['function'] ?? 'global');
    
    $log = [
        'time' => date('c'),
        'level' => 'info',
        'location' => $location, // 自動包含類別::方法
        'message' => $message,
        'context' => $context
    ];
    error_log(json_encode($log, JSON_UNESCAPED_UNICODE));
}

// 使用
class OrderController {
    public function create() {
        logInfo('建立訂單', ['user_id' => 123]);
        // 自動記錄: OrderController::create
    }
}

2. 動態路由/控制器分派記錄

class Dispatcher {
    public function dispatch($controllerClass, $method) {
        $fullMethod = "{$controllerClass}::{$method}";
        
        // 驗證方法存在
        if (!method_exists($controllerClass, $method)) {
            throw new NotFoundException("Method {$fullMethod} not found");
        }
        
        // 記錄分派資訊 (可用於審計、效能監控)
        $start = microtime(true);
        $result = (new $controllerClass)->$method();
        $duration = microtime(true) - $start;
        
        metrics()->timing('dispatch.duration', $duration, ['method' => $fullMethod]);
        return $result;
    }
}

3. 單元測試自動命名

class TestCase extends PHPUnit\Framework\TestCase {
    public function setUp(): void {
        $this->testName = __METHOD__; // 取得完整測試方法名
    }
    
    public function testUserRegistration() {
        // 測試邏輯...
    }
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved