Thanks Driven Life

日々是感謝

PHP で未定義変数を call した時に実行されて欲しい関数を登録するには

なんでこんな技が必要になるのか、とかそういうのを考えない世界にしたい(決意)

方法

みんな大好き set_error_handler()

PHP: set_error_handler - Manual

<?php
// 本命の関数
function after_call_undefined_varibale($name, $file, $line)
{
    var_dump("\${$name} at {$file}:{$line}");
}

// 本命の関数を実行するための handler
function after_call_undefined_varibale_callback($errno, $errstr, $errfile, $errline)
{
    // set_error_handler() の第二引数で指定してるなら要らないかも
    if ($errno !== E_NOTICE) {
        return false;
    }
 
    $pattern = '/^Undefined variable: (.*)$/';
    $matches = array();
 
    if (!preg_match($pattern, $errstr, $matches)) {
        return false;
    }
 
    after_call_undefined_varibale($matches[1], $errfile, $errline);
 
    return false;
}
 
set_error_handler("after_call_undefined_varibale_callback", E_NOTICE);
 
/**
 * Example Output:
 *
 * string '$usernmae at /path/to/user.php:3' (length=32)
 */

まとめ

__get() のグローバルスコープ版みたいなの、探せばありそうな気もするけど触れてはいけない領域だと思う。