On Sun, Oct 29, 2023, at 9:52 PM, Jorg Sowa wrote: > I really like the idea and I would love to see it in PHP. I'm wondering > however, what would be the scope of the feature and how complex would be > designed type system. Examples I saw in this thread could be easily > replaced with union and intersection types (i.e. numeric as int|float). In > my opinion, there is a little benefit implementing in this shape making the > PHP core more complex. > > The two use cases of user defined types in PHP which would benefit a lot > IMO, would be: > 1. Typed arrays similar to Typescript. > 2. Semantic types which would increase the security of systems. Example: > type UserId = int; > > function setUserId_1(int $userId){} > > function setUserId_2(UserId $userId){} > > setUserId_1(5); // OK > setUserId_2(5); // TypeError > > setUserId_1(UserId(5)); // OK > setUserId_2(UserId(5)); // OK > > Kind regards, > Jorg
Simple unions are the easiest to talk about in quick examples, but the real benefit of type aliases is in other cases, some of which they would enable. Example: I have a real parameter defined in my attributes library like this: \ReflectionProperty|\ReflectionMethod|\ReflectionClassConstant $subject And it appears several times, I believe. That would definitely be nicer if simplified to an alias. Example: There's general consensus that callable types would be beneficial: callable(RequestInterface, string): string or similar. But inline, that gets long and complicated fast. Type aliases would allow simplifying that to type callable(RequestInterface, string): string as PropertyRetriever function foo(PropertyRetriever $c) { ... } Example: As in the above example, type aliases serve as documentation for callables or complex types, explaining what that complex ruleset actually means, semantically. Example: If generics or typed arrays ever happen, they'd probably be useful here, too. Note that using type aliases in a required-fashion is a different matter, and potentially not feasible. Free standing variables are untyped, which means setUserId(UserId $id) could not require a UserId, because there's no way to define a variable as being a UserId, not an int. While I can definitely see a value in that kind of restriction, in practice I don't think PHP is capable of it without vastly larger changes. --Larry Garfield -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: https://www.php.net/unsub.php