On 3 February 2018 08:27:18 GMT+00:00, Wes <netmo....@gmail.com> wrote:
>Hello PHPeople. I just published the RFC "Deprecation of fallback to
>root
>scope".
>
>https://wiki.php.net/rfc/fallback-to-root-scope-deprecation


Given the discussion so far, how about taking the "opposite" approach:
deprecate unprefixed reference to functions which *are* in the current
namespace.

Proposal:
- PHP 7.3: Add syntax to explicitly reference functions and constants in
the current namespace, such as .\foo or this\foo
- PHP 7.4: Raise E_DEPRECATED whenever an unprefixed function/constant
resolves to something in the current namespace (other than via "use" alias)
- PHP 8.0: Make all unprefixed functions/constants always refer to the root
namespace

Pros:
- Much less disruptive change, as the majority of unprefixed function calls
are to global functions, and would not need to change.
- Both cases can be made unambiguous if the author wants to.
- Apparently OpCache currently mitigates the performance hit by caching
lookups in a technically unclean way. Users hit by this can make their code
unambiguous in 7.3, and the optimisation will become clean in 8.0.
- Function / constant autoloading can be added in 7.x if we accept the
caveat that unprefixed functions will not be autoloaded; or in 8.0 if we
want to cover everything.

Cons:
- Slightly uglier syntax.
- Still a breaking change (in 8.0).
- Class names will still be resolved differently from function and constant
names.
- Code actively using the fallback system (e.g. tests masking global
functions with mocks) will need refactoring as there is no way to opt into
the old behaviour.
- The .\foo() syntax may appear in similar places to the . concatenation
operator. Even if technically unambiguous and implementable in the parser,
this may be confusing to users. A keyword approach like this\foo() would be
clearer, but more verbose.

What do people think? Is it worth expanding this out into an alternative
RFC?

Regards,
-- 
Rowan Collins [IMSoP]

Reply via email to