2022-09-30 17:16 GMT+02:00, Larry Garfield <la...@garfieldtech.com>:
> On Fri, Sep 30, 2022, at 4:04 AM, Olle Härstedt wrote:
>> 2022-09-29 5:08 GMT+02:00, Hamza Ahmad <office.hamzaah...@gmail.com>:
>>> Hi Olle,
>>>
>>> I appreciate your idea of introducing a similar concept of typedef.
>>> What if you write an RFC explaining that concept. I can join you
>>> however in co-authoring this request.
>>>
>>> Seriously, I have had issues with writing such type again and again.
>>> If you look at mixed type, it is indeed an alias of some union types.
>>> Adding such an option to userland would lead to introduction of
>>> various type hints. Plus, it will help devs write short hand aliases
>>> for their intersection types.
>>
>> Note that my suggestion here is NOT about a project-global type alias,
>> but an extension of the existing file-only alias, the use-statement.
>> This can also explain the lack of reaction. :) Internal devs might
>> already have consensus on the right way to proceed here, even if
>> there's no RFC yet.
>
> Background:
>
> Type aliases have been discussed several times.

Ya ok, not what I could find in externals.io ^^

> There's definitely
> interest, but like many things it runs into the problems of time and
> figuring out the details.
>
> In particular, I don't get the sense that there's much appetite for
> file-local aliases.  While that would have some benefit, it could lead to
> all kinds of confusion when then using code from another file.  Consider:
>
> A.php:
>
> use int|float as number;
>
> interface A
> {
>   public function a(number $a) {}
> }
>
> B.php:
>
> // Yeah, aliasing this is very helpful.
> use (Request&Linkable)|(ServerRequest&Linkable)|array|null as input;
>
> interface B
> {
>   public function b(input $b) {}
> }
>
> C.php:
>
> class C implements A, B
> {
>   // Which of these to use?
>   public function a(int|float $a) {}
>   public function a(number $a) {}
>   // Or do I need to repeat the definition of "number" in every file?

Yes, you would. That's the limit of my current suggestion. Same
semantics as use-statements.

>   // WTF do I do here? Do I have to repeat the entire definition either
>   // inline or in this file's "use" block?  Both suck.
>   public function b(...)

Neither suck. :) Just "normal" inheritance boilerplate in the absence
of project-global type aliasing.

Do you have similar counter-examples for non-OOP code?

> }
>
>
> This becomes even more of an issue when you start talking about function
> types, which is often mentioned as the primary use case.
>
> type fn(int $a, string $b): Request as mycallback
>
> function do(mycallback $callback) {}
>
> So I have to duplicate the type def in every file now?  This is not an
> improvement.

It's an improvement for readability, especially when repeated in one
file. But my suggestion does not include function-types, because
there's no such thing already in the system. Just to let use-statement
include more of already existing types. If function-types were added
later, they should be supported too, yes.

>
> So we have to go with app-global aliases, but then... how do you handle
> resolution?  Autoloading?  Namespacing?  Conflict resolution?  I dunno,
> that's all hard, and that's where the conversation usually peters out.

Yeah, always better to have a clear limitation, is it not? :D

> The degenerate case you mention of simple type renaming has its own
> interesting implications, which are also a factor for the broader case.
> Specifically, does that create a new type unto itself

No. Keep the same semantics of the current use-statement. But it could
be a future extension, sure. But then you need some kind of "factory"
way to produce those types. In FP they do it with "abstract types",
where the implementation of a type is hidden from outside the module.
In PHP, maybe with Foo::make() functions or such. Different
discussion.

> or does the
> difference get elided at compile time?  For instance:
>
> use int as userId;
> use int as productId;
>
> function a(userId $user) {
>   b($userId);
> }
>
> function b(productId $product) {
>   // ...
> }
>
> a(123);
>
>
> Does this work?  Is it a compile error for mismatched types (as in Go, which
> has this exact feature) or no?  If it is, how do you make it work?  Do you
> need explicit casts?  If it does work, have you gained much since it's no
> more useful than docblocks?  If it does work, how long before SA tools turn
> it into an error anyway and make everything more complicated?  (Because you
> know they will.)

Not sure I agree with you there. Obviously, static analyzers would
have to abide to the semantics of the core language, no...?

> Does the same answer apply for longer type aliases like the nutty ones in
> the earlier examples?
>
> These are the kinds of questions that need to be answered before any serious
> RFC could be attempted.

Isn't an RFC a good place to document all these cases? I was thinking
that an RFC could be a good place even for things we do NOT want to
implement. to help pave the way for features we do.

> Answers for them can certainly be found, but so far
> no one has really done the work, in particular around how to make aliases
> cleanly global.  If you're interested in tackling that, fantastic; I think
> most people would be on board with it (especially for function types).  But
> be aware it's a not-small puddle you're wading into.

I never had a need for such a feature tho. :d Although my motivation
for current concept is also dubious (transpilation to C, mainly).
Maybe generic-notation for arrays is more relevant to improve
type-hints, buuut that's another can of worms, and I didn't read up on
current discussion yet. :)

Thanks for the feedback, Larry! Can I still get karma to write it down
in the wiki? Again, not to necessarily encourage implementation, more
for documentation purpose. And I prefer to have it on the wiki, to
keep all the docs central.

Olle

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: https://www.php.net/unsub.php

Reply via email to