Re: [RFC] Add Directive to Make All Namespaced Function Calls Global

From: Date: Mon, 05 Aug 2024 13:07:56 +0000
Subject: Re: [RFC] Add Directive to Make All Namespaced Function Calls Global
References: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  Groups: php.internals 
Request: Send a blank email to internals+get-124765@lists.php.net to get a copy of this message
On Mon, Aug 5, 2024 at 2:27 PM Nick Lockheart <lists@ageofdream.com> wrote: > > > > I'm not sure your proposal solves the mocking problem. If the engine > > is to interpret all non-fq calls as global or local, how would a > > library include your file while switching this configuration, when it > > is implemented as some directive in the file? > > I'm not sure I understand this question. Consider this example: <?php namespace Foo; echo time(); With my proposal, this would now always call the global time() function. You were suggesting that "using local functions" would help mitigate this, but I don't think it does. * The user can't add "using local functions" to this file, because in a production environment where ClockMock isn't used, there is no local time() function. With "using local functions" having no fallback, the global function would not be called, and hence the code would error. Your proposal would only help if the semantics were "use local function if available, or global function otherwise", which is what we have currently. * Symfony can't enable the "using local functions" option either when including your file, because it would require modifying the source code. That leaves eval(), which would really already solve this problem if you replace calls to time() with something else. > > Also, how would only singular functions be mocked when there is no > > fallback to the global scope for the rest of the functions used > > within the file? That would necessitate mocking all functions, even > > the unmodified ones. > > If a developer needed to override built-in functions (in a specific > file) with local ones, and still use some built-in functions, they > would then need to use the fully-qualified \function(); to call > the > built-in. Well, ok. But then we're back to prefixing global calls, which defeats the purpose of the proposal. I think it's much preferable to look for a different, more robust mocking solution that also works for unnamespaced code and fully qualified calls. Ilija

« previous php.internals (#124765) next »