php.net |  support |  documentation |  report a bug |  advanced search |  search howto |  statistics |  random bug |  login
Bug #70457 Wrong line number for E_NOTICE - undefined constant in class
Submitted: 2015-09-08 08:46 UTC Modified: 2018-03-26 13:50 UTC
Votes:4
Avg. Score:3.5 ± 0.5
Reproduced:4 of 4 (100.0%)
Same Version:2 (50.0%)
Same OS:3 (75.0%)
From: daniel dot jaenecke at sedo dot com Assigned:
Status: Verified Package: Scripting Engine problem
PHP Version: Any OS: Any
Private report: No CVE-ID: None
 [2015-09-08 08:46 UTC] daniel dot jaenecke at sedo dot com
Description:
------------
A notice complaining about an undefined constant assigned to a class property is reported for the wrong line number.

I could reproduce this with the provided snippet for versions 5.3, 5.5 and 5.6

Test script:
---------------
<?php

class MyClass
{

    private $var1 = ANOTHER_NONE_EXISTING_CONSTANT;
    private $var2 = 1;

}

$obj = new MyClass(); 

Expected result:
----------------
A notice for the line where the undefined constant is being used, in this case Notice: Use of undefined constant NONE_EXISTING_GLOBAL_CONSTANT […] in line 6

Actual result:
--------------
Notice: Use of undefined constant ANOTHER_NONE_EXISTING_CONSTANT - assumed 'ANOTHER_NONE_EXISTING_CONSTANT' in /home/daniel/tmp/php-linenumber-bug/code.php on line 11

Patches

Pull Requests

History

AllCommentsChangesGit/SVN commitsRelated reports
 [2015-09-08 09:20 UTC] yohgaki@php.net
-Summary: Wrong line number for E_NOTICE +Summary: Wrong line number for E_NOTICE - undefined constant in class -Package: *General Issues +Package: Scripting Engine problem -Operating System: Linux +Operating System: Any -PHP Version: 5.6.13 +PHP Version: Any
 [2015-09-08 09:20 UTC] yohgaki@php.net
https://3v4l.org/DpCPp

PHP has been emitting the error like this for a long time.
 [2015-09-08 13:54 UTC] bwoebi@php.net
We currently aren't storing any line number information for class variables/constants. And as these are only evaluated upon first use, the constant message will only appear on instantiation here.
 [2017-05-19 10:58 UTC] requinix@php.net
-Status: Open +Status: Verified
 [2018-03-26 09:41 UTC] yohgaki@php.net
https://3v4l.org/ULp0K

It happens with static var.
Error line is meaningless, since "undefined constant error" is raised for "other" static var.
It can hide "undefined constant error" with static class until code access to static var.

See 3v4l result for details.
 [2018-03-26 10:07 UTC] nikic@php.net
Nowadays delayed constants store an AST, which contains the necessary line number information. This is still not entirely simple, as we also need a) the file name (which is available on the parent class / function, but not inside update_constant) and b) an ability to override the source of an error (something like CG(zend_lineno), but for runtime use).
 [2018-03-26 13:47 UTC] yohgaki@php.net
That's what I guessed, thanks.
Anway, since we are going to raise ERROR for undefined constants (Correct?), this delayed "undefined constant error" could be serious problem. It may be better to document this behavior explicitly. define() is nasty in many ways due to its dynamic nature. 

http://php.net/manual/en/function.define.php

"const" works fine.

https://3v4l.org/cN5n4
 [2018-03-26 13:50 UTC] yohgaki@php.net
Oops. I thought I commented out var_dump().
const has the same issue as well.

https://3v4l.org/Gi3CO
 [2020-11-06 16:56 UTC] php4fan at gmail dot com
Congratulation guys, it's been 5 years and this is still an issue.
 
PHP Copyright © 2001-2024 The PHP Group
All rights reserved.
Last updated: Sat Dec 14 14:01:26 2024 UTC