Bug #77100 [Opn]: Inconsistent behavior between constants and magic constants

From: Date: Sun, 04 Nov 2018 11:21:23 +0000
Subject: Bug #77100 [Opn]: Inconsistent behavior between constants and magic constants
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-217817@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=77100&edit=1 ID: 77100 Updated by: cmb@php.net Reported by: fabien dot villepinte at gmail dot com Summary: Inconsistent behavior between constants and magic constants Status: Open Type: Bug Package: Scripting Engine problem PHP Version: Irrelevant Block user comment: N Private report: N New Comment: > I'd suggest prepopulating the constants table with them only I > don't know how something like constant('__LINE__') could work. Prepopulating the constants table would require to update it frequently during run time to be consistent with the compile time constants. Besides being inefficient, it would also change “constant” values. It might be preferable to not allow any of the predefined magic constants (or maybe all constant names with two leading and trailing underscores) to be used with define(), defined() and constant(). Either way would break BC, though. Previous Comments: ------------------------------------------------------------------------ [2018-11-03 21:27:48] a at b dot c dot de To continue that: Which means that when run time comes around the names are free to be redefined as user constants. But the literal identifiers aren't in the code any more so the only way they can be accessed is through the constant('') construct. The compile-time evaluation of magic constants also means define('__DIR__', 0); is legal, but const __DIR__ = 0; is not, since the latter definition happens at compile time too. Maybe a check (c|sh)ould be made that users aren't trying to define() magic constants themselves? I'd suggest prepopulating the constants table with them only I don't know how something like constant('__LINE__') could work. ------------------------------------------------------------------------ [2018-11-03 16:54:34] cmb@php.net FWIW, the docs[1] say: | All these "magical" constants are resolved at compile time, | unlike regular constants, which are resolved at runtime. [1] <http://php.net/manual/en/language.constants.predefined.php> ------------------------------------------------------------------------ [2018-11-03 16:12:34] fabien dot villepinte at gmail dot com Description: ------------ The functions define(), defined() and constant() don't work the same way whether the name of the constant given as an argument is the name of an already defined constant or the name of a magic constant. For instance : define('PHP_EOL', 0); // returns false and emits a notice define('__DIR__', 0); // returns true __DIR__; // returns the path of the current directory constant('__DIR__'); // returns the value of the user-defined constant, 0 in this case There is nothing in the documentation mentioning this case, so I can't say if the current behavior is correct or not. Test script: --------------- <?php var_dump(defined('__LINE__')); var_dump(define('__LINE__', 'test')); var_dump(constant('__LINE__')); var_dump(__LINE__); Actual result: -------------- bool(false) bool(true) string(4) "test" int(5) ------------------------------------------------------------------------ -- Edit this bug report at https://bugs.php.net/bug.php?id=77100&edit=1

« previous php.bugs (#217817) next »