On Tue, Feb 18, 2025, at 2:00 AM, Rowan Tommins [IMSoP] wrote: > On 17 February 2025 14:39:42 GMT, Viktor Khramov > <dev.999.vic...@gmail.com> wrote: >>Hi! >> >>The point is here: >>https://gist.github.com/vhood/665418835e65be26d5a818fded92ab75 > > >>Static functions look awful and break the object's API. > > Personally, I think quite the opposite: named constructors make a lot > more sense than type-based overloads. For instance, you might have both > createFromJson and createFromYaml; their inputs are both going to be > "string" as far as the type system is concerned, so overloading would > be useless. > > Swift gets around this using "argument labels" which is sort of like > requiring named arguments and despatching based on those names, but I > believe is actually derived from SmallTalk's multipart method names. > > Delphi is more explicit: a constructor is any class method marked with > "constructor" in its declaration, and the name "Create" is just a > convention. It does also support overloading on types, so other names > are rarely used, which is a shame. > > In your example, instead of this meaning different things based on what > $a happens to hold: > > $decision = new Decision($a, $b); > > You could write one of these to be clear: > > $decision = Decision::createFromId($a, $b); > $decision = Decision::createFromMail($a, $b); > > > Even if someone were to come up with a working implementation of > overloading in PHP's type system, I would probably oppose it, because I > think it makes code harder to read and reason about.
I largely agree. I am open to method overloading as a general feature (which is probably the minority view around here), as I do see places it would be helpful. (Enum methods, operator overloads if those ever happen, etc.) But constructors feel like the least applicable place for them, and named static methods works just fine in my experience. --Larry Garfield