ID: 50383
Updated by: [email protected]
Reported By: RQuadling at GMail dot com
Status: Verified
Bug Type: Scripting Engine problem
Operating System: *
PHP Version: 5.*, 6
New Comment:
The fatal error is new then!
Here is a straight screen capture from my terminal.
[2009/12/04 12:47:16] [Z:\] [\\richardquadling\scratch$ ] >php -v
PHP 5.3.2-dev (cli) (built: Dec 4 2009 10:57:52)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies
[2009/12/04 12:47:19] [Z:\] [\\richardquadling\scratch$ ] >php -n
<?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());
}
^Z
Array
(
[0] => Array
(
[function] => __callStatic
[class] => myClass
[type] => ::
[args] => Array
(
[0] => ThrowException
[1] => Array
(
)
)
)
[1] => Array
(
[file] => Z:\-
[line] => 9
[function] => ThrowException
[class] => myClass
[type] => ::
[args] => Array
(
)
)
[2] => Array
(
[file] => Z:\-
[line] => 13
[function] => thrower
[args] => Array
(
)
)
)
Previous Comments:
------------------------------------------------------------------------
[2009-12-04 12:47:57] [email protected]
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());
}
?>
------------------------------------------------------------------------
[2009-12-04 12:15:47] [email protected]
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] =>
)
------------------------------------------------------------------------
[2009-12-04 11:32:44] 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
(
)
)
)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=50383&edit=1