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.

Cheers,

Ben

-- 

Benjamin Coutu
ben.co...@zeyos.com

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to