On Wed, Mar 3, 2021 at 5:49 PM Nikita Popov <nikita....@gmail.com> wrote:
> On Wed, Mar 3, 2021 at 4:28 PM Alexandru Pătrănescu <dreal...@gmail.com> > wrote: > >> Hi, >> >> This looks very nice and I'm interested in further steps where not only >> new can be used :). >> >> The only thing I think it would be good to improve is to have a >> deterministic order for running initialization. >> Yes, this can be done at a later point, I guess. But maybe there is >> already an order of initialization right now and people would start >> replying on it and it would be good to mention it. >> Or maybe I didn't understand what this refers to: "this is not guaranteed >> behavior, and code should not rely on a specific point of evaluation." >> > > Which particular cases would you like to see specified? There are five > cases that have clearly defined behavior, and that I could explicitly > specify if desired: > > * Non-class constants: Are evaluated immediately when declared (i.e. when > control flow reaches the declaration). > * Attribute arguments: Are evaluated in the order of the arguments. > * Parameter defaults: Are evaluated in the order of the parameters. > * Non-static property defaults: Are evaluated in order of declaration, > with parent properties first. The constructor is run after defaults are > evaluated. > * Static variables: Are evaluated immediately when declared (i.e. when > control flow reaches the declaration). > > And then there are the two problematic cases: Class constants and static > properties. Currently, PHP evaluates these semi-lazily. All class constants > and static properties are evaluated at the same time, on first "use" of the > class. I would consider this to be something of an implementation detail. > That's what I meant by that sentence. > > Now, if we allow "new" expressions, then I could see an argument in favor > of requiring class constant and static property initializers to be > evaluated eagerly, i.e. directly after the class has been declared. This > would be a (minor) backwards-compatibility break, because invalid > constant/property declarations would error out immediately, even if they > don't get used. However, I do think that this would be the most predictable > behavior once potentially side-effecting expressions are involved (we > already support side-effecting expressions right now, but less explicitly). > > Yes, this is what I was thinking about, to have a clear stated order of initialization. Yes, I agree that class constants and static properties should be eagerly declared when class is declared. So the order would be: - constants and static variables, when reaching the statement that does the declaration - class constants and static property, when class is declared, in order of their declaration in the class - instance property, when class is instantiated, in order of their declaration in the class, before construct - parameter defaults and attribute arguments defaults, when function/method/attribute construct is called, in order of the declared parameter/arguments. That sounds good to me. Thanks! Alex