2024년 3월 30일 (토) 오전 1:21, Larry Garfield <la...@garfieldtech.com>님이 작성:

> 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
>

Hi.

> It would be more accurate to say "calling non-static methods in a
static-like manner is common *in Laravel*

It might be correct to say that this is specific to Laravel. The problem,
however, is that Laravel is used so extensively that it cannot be ignored.

There's a point of embarrassing me. It's as if my proposal, if accepted,
would create problems that did not previously exist. Yet, the existence of
`__callStatic` already allows for the issues you've pointed out to occur.
You can already write code like `foo::bar()::baz()` with the current PHP.
The possibility of more problems arising could indeed be true. In that
sense, I understand your point.

And unless `__callStatic` is intentionally used, calling non-static methods
statically will still result in an error, just as it does now.
I am simply proposing to give users the choice when they intentionally use
`__callStatic`.

Daddyofsky

Reply via email to