On Fri, Aug 23, 2024, at 11:27, Nick Lockheart wrote: > On Fri, 2024-08-23 at 09:16 +0100, Rowan Tommins [IMSoP] wrote: > > > > > > On 23 August 2024 01:42:38 BST, Nick Lockheart <li...@ageofdream.com> > > wrote: > > > > > > > > > > > BUT, if people already complain about "\" being ugly, having to > > > > write > > > > "namespace\" is going to make them REALLY grumpy... > > > > So maybe at the same time (or, probably, in advance) we need to > > > > come > > > > up with a nicer syntax for explicitly referencing the current > > > > namespace. > > > > > > namespace foo using global functions; > > > > > > - or - > > > > > > namespace foo using local functions; > > > > > > > > > Tell PHP what you want at the per-file level. > > > > > > This doesn't seem mutually exclusive to me. If you have a file where > > you've opted for "using global functions", you might want a way to > > reference a function in the current namespace. > > Correct, so if you use the example: > > namespace foo using global functions; > > you can write: > > array_key_exists(); > > and it will be resolved as global without a namespace lookup and will > use the dedicated opcode. > > But if you need to use a local function you can do: > > \foo\sort(); > > > The proposed global/local declaration as part of the namespace > declaration just turns off namespace lookups and sets the default > resolution for **unqualified** names. > > Fully qualified names are not affected. > > > > It also doesn't address my other point, that having global as the > > default mode (even if we provide an option for local) is much less > > disruptive to existing code. > > > They are compatible, but related decisions. > > I think it would be easier for people to accept a new PHP version where > unqualified names were always global, if we also had an option to make > local/namespaced the default resolution for *unqualified* names, on a > per-file basis, for those who need that. > > > Thus, there are multiple decision points: > > 1. Should we do namespace lookups on unqualified function calls at all? > > 2. If yes to 1, should we lookup in global first or local first? > > 3. Regardless of 1 or 2, should we let developers explicitly specify a > behavior for unqualified calls in the namespace declaration? > > 4. If yes to 1, should the behavior of namespace lookups change for > user-defined functions vs PHP built-in function names? > > > These aren't mutually exclusive, but they all work together to create a > complete behavior. > > There are several ways that the above options could be combined: > > > > ### OPTION ONE ### > > Using a regular namespace declaration still does an NS lookup, in the > same order, just like it normally works now. > > That means that code that uses: > > namespace foo; > > will behave exactly the same as today, with no BC breaks. > > Developers using the new PHP version could opt-in to explicit namespace > behavior with: > > namespace foo using global functions; > > or > > namespace foo using local functions; > > In both cases, *fully-qualified* names still work the same. > > Only *unqualified* names are affected by this directive, and they use > local only or global only, depending on the declaration. > > > > ### OPTION TWO ### > > Namespace lookup is removed from a future version of PHP. > > Code that uses the current namespace declaration: > > namespace foo; > > will assume that all unqualified function calls are global scope. > > To use a function in the local namespace, it can be fully qualified > with: > > \foo\MyFunction(); > > > But, developers could also write: > > namespace foo using local functions; > > And all unqualified function names would be resolved to local at > compile time. Global functions could still be accessed with a `\` if > this directive was used: > > \array_key_exists(); > > > > ### OPTION THREE ### > > Namespace lookup is removed from a future version of PHP. > > Code that uses the current namespace declaration: > > namespace foo; > > ...will assume that an *unqualified* function name is a global function > *IF* it is a PHP built-in function. > > Otherwise, *unqualified* function names that are *not* PHP built-in > functions will be presumed to be local to the namespace. > > With Option Three, developers can still fully-qualify their functions: > > \foo\array_key_exists(); > > ...to override a built-in name with a user function in the current > namespace. > > Likewise, a fully-qualified: > > \MyFunction(); > > called from inside a namespace will still call the global function. > > Only unqualified names are affected. > > As an additional optional feature of Option Three, developers can > change this behavior with: > > namespace foo using global functions; > > or > > namespace foo using local functions; > > > Only *unqualified* names are affected by this directive, and they use > local only or global only, depending on the namespace declaration. > > In both cases, *fully-qualified* names still work the same. > > > > Of course, there are many other possibilities that can be mixed-and- > matched. >
I personally would find option 3 to be the best of both worlds, and you don't even need the `namespace ... using ... functions` stuff. — Rob