|   | 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 Group All rights reserved. | Last updated: Fri Oct 31 12: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()); } ?>