On 29/03/2024 02:39, 하늘아부지 wrote:
I created a wiki for __callStatic related issues.
Please see:
https://wiki.php.net/rfc/complete_callstatc_magic


Hi,

Several times in the discussion you have said (in different words) "__callStatic is called for instance methods which are private or protected", but that is not how it is generally interpreted.

If you are calling a method from outside the class, as far as you're concerned only public methods exist; private methods are, by definition, hidden implementation details. This is more obvious in languages with static typing, where if you have an instance of some interface, only the methods on that interface exist; the concrete object might actually have other methods, but you can't access them.

That is what is meant by "inaccessible": __call and __callStatic are called for methods which, as seen from the current scope, *do not exist*.


You could still argue that static context is like a different scope, or a different statically typed interface - as far as that context is concerned, only static methods exist. But that's also not a common interpretation, for (at least) two reasons:

Firstly, there is no syntax in PHP which specifically marks a static call - Foo::bar() is used for both static calls, and for forwarding instance calls, most obviously in the case of parent::foo().

Secondly, until PHP 8, marking a method as static was optional; an error was only raised once you tried to access $this in a context where it wasn't defined. In PHP 4, this was correct code; in PHP 5 and 7, it raised diagnostics (first E_STRICT, later E_DEPRECATED) but still ran the method:

class Foo {
    function bar() {
        echo 'Hello, World!';
    }
}
Foo::bar();


I think that's part of the reason you're getting negative feedback: to you, the feature seems like an obvious extension, even a bug fix; but to others, it seems like a complete change to how static calls are interpreted.

Regards,

--
Rowan Tommins
[IMSoP]

Reply via email to