PHP7でバックトレースが少し変わっていた

PHP7への移行時にここでハマる人はほとんどいないと思いますが、バックトレースの出力がPHP7では少々変更されていることがあります。

これは、PHP7では内部が色々と変更されているため、その影響です。

関数の引数値

1つは、PHP 7.0 UPGRADE NOTESに載っている「関数の引数値」です。

<?php

function foo($x)
{
    $x = 42;

    debug_print_backtrace();
}

foo("string");

この実行結果は、PHP7では以下のようになります。引数は関数内で変更された後の42になっています。

#0  foo(42) called at [/vagrant/debug_backtrace/param_value.php:10]

PHP 5.6までは、以下のように引数はstringになっていました。

#0  foo(string) called at [/vagrant/debug_backtrace/param_value.php:10]

ちょっと直感に反しますが、PHP7ではそうなっているということです。

__callStatic()

__callStatic()の場合も出力に変更があります。

<?php

class Proxy
{
    public static function __callStatic($function, array $arguments)
    {
        if (self::checkCalledMethod($function))
        {
        }
    }

    public static function checkCalledMethod($function)
    {
        debug_print_backtrace();
    }
}

class Test
{
    public function run()
    {
        Proxy::bar();
    }
}

$test = new Test();
$test->run();

PHP 5.6までは、以下のようになっていました。

#0  Proxy::checkCalledMethod(bar) called at [/vagrant/debug_backtrace/callstatic.php:7]
#1  Proxy::__callStatic(bar, Array ())
#2  Proxy::bar() called at [/vagrant/debug_backtrace/callstatic.php:22]
#3  Test->run() called at [/vagrant/debug_backtrace/callstatic.php:27]

PHP7では最適化により、Proxy::bar()の行がなくなり以下のようになっています。

#0  Proxy::checkCalledMethod(bar) called at [/vagrant/debug_backtrace/callstatic.php:7]
#1  Proxy::__callStatic(bar, Array ()) called at [/vagrant/debug_backtrace/callstatic.php:22]
#2  Test->run() called at [/vagrant/debug_backtrace/callstatic.php:27]

他にもあるかも知れませんが。

当然ですが、debug_backtrace()関数の結果も同じように変更されています。

関連

Date: 2015/10/09

Tags: php, php7