You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
<?php
class ThrowableParam {
public function __construct() {
// this will be line #7 for definitions.php:
throw new Exception(sprintf('I expect to indicate file %s on line %s but it throws', basename(__FILE__), __LINE__));
}
}
trait TraitInASeparateFile {
// but this will be line #16 for definitions.php:
public function execute(ThrowableParam $param=new ThrowableParam): void {}
}
?>
main.php
<?php
include './definitions.php';
class Foo {
use TraitInASeparateFile;
}
$bar=new Foo;
$bar->execute(); // line #11 for main.php
// So, there is no line #16 for main.php
?>
RESULT :
Fatal error: Uncaught Exception: I expect to indicate file definitions.php on line 7 but it throws in ./main.php:16
Stack trace:
#0 ./definitions.php(7): constant expression #1 ./definitions.php(16): ThrowableParam->__construct() #2 ./main/php(11): Foo->execute() #3 {main}
thrown in /var/www/html/nbcloud/_tests/bugPHP.php on line 16
BUT EXPECT :
Fatal error: Uncaught Exception: I expect to indicate file definitions.php on line 7 but it throws in ./definitions.php:7
Stack trace:
#0 ./definitions.php(7): constant expression #1 ./definitions.php(16): ThrowableParam->__construct() #2 ./main/php(11): Foo->execute() #3 {main}
thrown in /var/www/html/nbcloud/_tests/bugPHP.php on line 16
PHP Version
8.4.5
Operating System
Debian 11
The text was updated successfully, but these errors were encountered:
The line number comes from the trait as that is stored by the compiler in the AST.
The filename comes from the zend_default_exception_new function that sets the file property. The TraitInASeparateFile::execute op_array when ZEND_RECV_INIT evalutes the constant expression, which has the filename definitions.php. zend_ast_evaluate_inner causes a VM re-entry and so the top stack frame now is the ThrowableParam::__construct and now somehow EG(filename_override) is set??
Okay I see. zval_update_constant_with_ctx is called with scope set to EX(func)->op_array.scope which is the scope for the trait clone in main.php. Then later on zend_ast_evaluate_ex overrides the filename and line number. Then when the exception is created the overridden filename (which is now main.php due to the passed scope) gets used...
Description
definitions.php
main.php
RESULT :
Fatal error: Uncaught Exception: I expect to indicate file definitions.php on line 7 but it throws in ./main.php:16
Stack trace:
#0 ./definitions.php(7): constant expression
#1 ./definitions.php(16): ThrowableParam->__construct()
#2 ./main/php(11): Foo->execute()
#3 {main}
thrown in /var/www/html/nbcloud/_tests/bugPHP.php on line 16
BUT EXPECT :
Fatal error: Uncaught Exception: I expect to indicate file definitions.php on line 7 but it throws in ./definitions.php:7
Stack trace:
#0 ./definitions.php(7): constant expression
#1 ./definitions.php(16): ThrowableParam->__construct()
#2 ./main/php(11): Foo->execute()
#3 {main}
thrown in /var/www/html/nbcloud/_tests/bugPHP.php on line 16
PHP Version
8.4.5
Operating System
Debian 11
The text was updated successfully, but these errors were encountered: