On Wed, Jun 26, 2024 at 3:27 PM Rob Landers <rob@bottled.codes> wrote: > > > > On Wed, Jun 26, 2024, at 22:56, Casper Langemeijer wrote: > > > On Wed, Jun 26, 2024, at 21:59, Richard Miles wrote: > > I think we should have typed arrays in PHP. > > > Yes! I cannot stand sitting through conference talks on 'generics' that only > talk about 'collections'. This could be solved if we had typed arrays. If > anything we would get better talks on Generics. :-) > > Arrays of a type is one of the last cases where I need docblocks to tell my > editor about the types. > > In my opinion, even if we would have some implementation of generics, having > typed arrays with a simple syntax would be awesome. > > A syntax suggestion: > > $array = stdClass[]; > class A { > public stdClass[] $array; > } > > Adding an invalid array member should throw TypeError. > > I know there are way more edge-case situations to think of (for example: if > class B extends A, $b is of type B[], but holds only A's, can $b be assigned > as value of public A[] $a ?) > > Generics or bust. > > > I do not understand the reasoning behind that. Is it because we really want > generics, but when the 95% use-case is solved we fear that there would not be > enough momentum to get that? I'd love to have generics too, but a very simple > array syntax would in my opinion still add a lot of value, even if we already > had generics. > > > You actually just gave me an evil idea on how to get generics in userland… > unfortunately it is bed time as I have an early train to catch in the > morning. I will stew on it, but here is the gist: > > Create a class that generates a typed collection when accessed via array, > such that (new InternalTypedArray)['int'] produces a class that acts like an > array but only accepts ints. > > Using the composer file loading key, load a file that contains: > > define('TypedArray', new InternalTypedArray); > > You can now use $arr = TypedArray['MyType'] > > Could be interesting and I wouldn’t be surprised if it hasn’t been done > before. > > — Rob
I have seen variants of this several times. Many will hook into the autoloader and generate a class/interface definition on-the-fly to make it work.