On Fri, Mar 29, 2024, at 3:33 PM, 하늘아부지 wrote:
> 2024년 3월 29일 (금) 오후 10:21, Larry Garfield <la...@garfieldtech.com>님이 작성:
>> On Fri, Mar 29, 2024, at 2:39 AM, 하늘아부지 wrote:
>> > Hello.
>> >
>> > I created a wiki for __callStatic related issues.
>> > Please see:
>> > https://wiki.php.net/rfc/complete_callstatc_magic
>> > I look forward to your interest and advice.
>> 
>> I am firmly against this proposal.
>> 
>> I think my objection boils down to this line in the RFC:
>> 
>> > Of course, calling non-static methods in a static-like manner can be 
>> > confusing, but in modern PHP, it has already become common practice. 
>> 
>> I would argue this statement is false.  Calling non-static methods in a 
>> static-like manner is confusing, which is why in modern PHP one should never 
>> do that, and respect that static and non-static methods exist in a separate 
>> universe.  Static methods are methods *on a type*.  Non-static methods are 
>> methods *on an instance*.  Those are not the same thing.[1]
>> 
>> It would be more accurate to say "calling non-static methods in a 
>> static-like manner is common *in Laravel*," where the badly-named "facades" 
>> system serves as a poorly designed, hard to debug, hard to test, archaic 
>> alternative to using dependency injection.  While there may have once been 
>> an argument that DI was "too hard" for simple cases a decade ago or more 
>> (though even then I think it was a bade trade-off), the combination of 
>> auto-wiring DI Containers (which Laravel pioneered in PHP) and constructor 
>> promotion (introduced in PHP 8.0, 3.5 years ago.) completely eliminates 
>> those arguments.  The level of effort to do actual DI today is trivially 
>> small, and the benefits over magic hidden globals are massive.
>> 
>> Laravel Facades are a relic of an older time best avoided, even in Laravel 
>> projects.  (I am far from the only person to argue this; many even within 
>> Laravel's inner community make this argument.)
>> 
>> Adding features to the language that seemingly exist only to make that 
>> particular buggy hack easier to do is a step backwards, and I would argue 
>> harmful for the language.  On the contrary, I would favor going the other 
>> direction: Calling a static method as though it were non-static currently 
>> works, and I would support making that an error, to further emphasize that 
>> static and non-static methods are not interchangeable.
>> 
>> [1] https://peakd.com/hive-168588/@crell/cutting-through-the-static
>> 
>> --Larry Garfield
>
> Thank you for your feedback.
> I agree that static and non-static should be distinct, which is a given.
>
> There are a few points I'd like to make.
>
> First, my proposed RFC is not about allowing non-static methods to be 
> used statically. Although all my examples use `::`, they internally 
> operate on an instance. Inside `__callStatic`, an instance is created 
> and used for operations.
>
> Second, as already possible through the `__callStatic` method, 
> non-static methods can be called as if they were static (as mentioned, 
> this does not mean they operate statically). For protected and private 
> methods, the `__callStatic` function is invoked even for non-static 
> methods. This might not be to everyone's liking, and to others, it 
> might be a favorite feature. It might operate differently from the 
> initial intention when `__callStatic` was introduced. However, I don't 
> think this is necessarily a bad thing. Isn't it developers who bring to 
> life ingenious ideas that were unforeseen?

Developers also bring to life horrible monstrosities that are an afront to all 
that is holy.  I am a developer.  It's what we do. :-)  Especially when VC 
money is involved.

Not all "innovation" is good.

> Third, as you can see from my examples, what I propose could be a 
> solution to the current issues. Since it does not work for public 
> methods while it does for protected and private ones, it has led to 
> code becoming more obscure and layered through facade-like patterns. 
> It's like taking a longer route because the road is blocked, or 
> creating a dog door because the main door is closed.

It simplifies a practice that should not be a practice in the first place.  
That's not a net-win.

> From the perspective of those who develop the PHP language itself, my 
> proposal might not be appealing. However, I believe from the user's 
> standpoint, my proposal could lead to more convenient and cleaner 
> coding practices. Didn't PHP start as a language meant to be 
> user-friendly? 

I don't actually work on the PHP engine, I just write RFC text for other 
people; I have ~25 years of experience writing user-space PHP.  And no, 
anything involving stealth globals via statics is the opposite of "more 
convenient and cleaner."

--Larry Garfield

Reply via email to