ID: 44396
User updated by: frase at cs dot wisc dot edu
Reported By: frase at cs dot wisc dot edu
Status: Verified
Bug Type: Class/Object related
Operating System: Ubuntu 7.10
PHP Version: 5.2.5
New Comment:
Thanks for the reply. That explains /why/ it happens, but it still is
not ideal behavior; in a very large class, it could take someone a long,
long time to track down the origin of this message, since the line
number attached to it is meaningless.
I suppose I'm not expecting a quick patch to fix this, since it is a
relatively minor problem and I imagine the constant-reference tracking
necessary to solve it would have larger performance implications. But I
thought it worth noting at least, in case some future change to PHP's
internals makes it viable to address this.
Previous Comments:
------------------------------------------------------------------------
[2008-03-10 18:58:57] [EMAIL PROTECTED]
The problem here is that the constant is evaluated just in time, which
means it will only be looked for when you instantiate the class. Your
example may be reduced to :
class A {
public $a = FOOBAR;
}
$a = new A; // Error will be triggered at this point.
Currently the line at which the constant is actually used is not
tracked.
------------------------------------------------------------------------
[2008-03-10 18:00:58] frase at cs dot wisc dot edu
Description:
------------
If a class definition generates a notice, the line number printed with
the notice corresponds to the first line in which the class is
instantiated, and NOT the line which truly gives rise to the notice.
Reproduce code:
---------------
class OtherClass {
// etc...
}
class TestClass {
static $linkedClass = OtherClass;
function __construct() {
echo "I am linked to " . self::$linkedClass;
}
}
$obj = new TestClass();
Expected result:
----------------
I am linked to OtherClass
Actual result:
--------------
Notice: Use of undefined constant OtherClass - assumed 'OtherClass' in
test.php on line 10
I am linked to OtherClass
Line 10 does not contain the phrase 'OtherClass' to begin with, as an
undefined constant or otherwise, so the notice is confusing. The line
on which the notice actually arises is line 5, where the class' static
member is incorrectly initialized (it should, in fact, have been a
string).
Disclaimer: The need to have one class refer to another by name, as in
this example, may seem odd but is irrelevant to this bug report (it
arose for me because of a more complicated class inheritance need). I
suspect any notice arising during a class' static member initialization
will have the same wrong line-number; errors other than E_NOTICE might
as well, I haven't taken the time to check exhaustively.
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=44396&edit=1