|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2009-12-04 11:32 UTC] RQuadling at GMail dot com
Description:
------------
An exception thrown in a __callStatic() method does not store the file name or the line number in the trace.
Reproduce code:
---------------
<?php
class myClass {
public static function __callStatic($method, $args) {
throw new Exception("Missing static method '$method'.");
}
}
function thrower() {
myClass::ThrowException();
}
try {
thrower();
} catch(Exception $e) {
print_r($e->getTrace());
}
Expected result:
----------------
Array
(
[0] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 4
[function] => __callStatic
[class] => myClass
[type] => ::
[args] => Array
(
[0] => ThrowException
[1] => Array
(
)
)
)
[1] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 9
[function] => ThrowException
[class] => myClass
[type] => ::
[args] => Array
(
)
)
[2] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 13
[function] => thrower
[args] => Array
(
)
)
)
Actual result:
--------------
Array
(
[0] => Array
(
[function] => __callStatic
[class] => myClass
[type] => ::
[args] => Array
(
[0] => ThrowException
[1] => Array
(
)
)
)
[1] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 9
[function] => ThrowException
[class] => myClass
[type] => ::
[args] => Array
(
)
)
[2] => Array
(
[file] => Z:\missingstatictrace.php
[line] => 13
[function] => thrower
[args] => Array
(
)
)
)
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Thu Nov 20 16:00:01 2025 UTC |
It seems that __call exhibits the same issue. Further, for sub-classes which allow cascading of __call/__callStatic, the stack doesn't show the file/line for those. <?php // myClass.php class myClass { public static function __callStatic($method, $args) { throw new Exception("Missing static method '$method'."); } } ?> <?php // mySubClass.php require_once 'myClass.php'; class mySubClass extends myClass { public static function __callStatic($method, $args) { parent::__callStatic($method, $args); } } ?> <?php // missingTrace.php require 'mySubClass.php'; function staticThrower() { mySubClass::StaticThrowException(); } try { staticThrower(); } catch(Exception $e) { print_r($e); } ?> Outputs ... Exception Object ( [message:protected] => Missing static method 'StaticThrowException'. [string:Exception:private] => [code:protected] => 0 [file:protected] => Z:\myClass.php [line:protected] => 4 [trace:Exception:private] => Array ( [0] => Array ( [file] => Z:\mySubClass.php [line] => 6 [function] => __callStatic [class] => myClass [type] => :: [args] => Array ( [0] => StaticThrowException [1] => Array ( ) ) ) [1] => Array ( [function] => __callStatic [class] => mySubClass [type] => :: [args] => Array ( [0] => StaticThrowException [1] => Array ( ) ) ) [2] => Array ( [file] => Z:\missingstatictrace3.php [line] => 5 [function] => StaticThrowException [class] => mySubClass [type] => :: [args] => Array ( ) ) [3] => Array ( [file] => Z:\missingstatictrace3.php [line] => 9 [function] => staticThrower [args] => Array ( ) ) ) [previous:Exception:private] => )Simple test that works in all branches: <?php class myClass { function __call($method, $args) { throw new Exception("Missing static method '$method'."); } } function thrower() { $foo = new myClass; $foo->ThrowException(); } try { thrower(); } catch(Exception $e) { var_dump($e->getTrace()); } ?>