On 9/18/19 7:18 PM, Nikita Popov wrote:
> On Wed, Sep 18, 2019 at 5:10 PM Benjamin Coutu <ben.co...@zeyos.com 
> <mailto:ben.co...@zeyos.com>> wrote:
> 
>     Hello,
> 
>     During performance testing of the (awesome) PHP 7.4 preloading
>     feature I stumbled upon a lost opportunity I'd like to point out
>     (though this has nothing to do with preloading per se).
> 
>     Please consider the following snippet:
> 
>     const TEST = 14;
> 
>     function d() {
>        echo TEST;
>     }
> 
>     The function "d" yields the following opcodes:
> 
>     #0 FETCH_CONSTANT "TEST" ~0
>     #1 ECHO ~0
>     #2 RETURN<-1> null
> 
>     meaning, that the constant "TEST" does not propagate into the
>     function, though both, the constant and the function, are defined in
>     the same file.
> 
>     Same goes for this kind of snippet:
> 
>     class D {
>              const C = TEST;
> 
>              public function d() {
>                      echo self::C;
>              }
>     }
> 
>     Here the method "d" yields the following opcodes:
> 
>     #0 FETCH_CLASS_CONSTANT "C" ~0
>     #1 ECHO ~0
>     #2 RETURN<-1> null
> 
>     Interestingly enough, class constants propagate as one would expect:
> 
>     class D {
>              const C = 14;
> 
>              public function d() {
>                      echo self::C;
>              }
>     }
> 
>     #0 ECHO 14
>     #1 RETURN<-1> null
> 
>     I don't see why constants defined in the same file couldn't
>     propagate throughout the same compilation unit during compile time,
>     as they can never have a different value (locally in that particular
>     defining file) at runtime.
>     Is this just an oversight or is there some deeper reasoning behind
>     this that I'm simply missing?
> 
>     In terms of preloading this would be particularly beneficial, cause
>     one cloud then include/require files that define global constants
>     before compiling files that contain those constants, thereby
>     propagating their values throughout the code base during preloading.
>     That would eliminate a lot of the runtime cost of (not so truly
>     constant) constants.
> 
>     Please let me know your thoughts.
> 
> 
> This optimization is unsafe, because the constant may already be 
> previously defined, in which case the "const" will be ignored with a 
> notice. There is an optimization flag that enables it, try 
> opcache.optimization_level=-1.
> 
> Unfortunately I just noticed that I missed this notice during "engine 
> warning reclassification" RFC, because it occurs in zend_constants. 
> Otherwise we might have changed it to an exception. (Though given recent 
> discussions, probably not.)
> 
> Nikita

I proposed this 3 years ago (for PHP-7.1), but then delayed for PHP-8.

https://wiki.php.net/rfc/constant_redefinition

Thanks. Dmitry.

Reply via email to