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