iggyvolz / generics
dev-main
2021-08-18 04:32 UTC
Requires
- iggyvolz/classgen: ^0.1.0
- iggyvolz/simple-attribute-reflection: dev-main
- nette/php-generator: ^3.5
- nikic/php-parser: ^4.12
Requires (Dev)
- nette/tester: ^2.3
This package is auto-updated.
Last update: 2024-09-18 11:22:26 UTC
README
使用 classgen 在 PHP 中实现泛型
<?php namespace Iggyvolz\Generics\test; use Iggyvolz\Generics\Generic; use Iggyvolz\Generics\T1; #[Generic(T1::class)] class TestGeneric { #[T1] public function foo(#[T1] $var) { return $var; } }
可以用作
$x = new TestGeneric«int»();
这会生成
<?php namespace Iggyvolz\Generics\test; #[\Iggyvolz\Generics\Generic('Iggyvolz\Generics\T1')] class TestGeneric«int» { #[\Iggyvolz\Generics\T1] public function foo(#[\Iggyvolz\Generics\T1] int $var): int { try {'Iggyvolz\\Generics\\T1'::push('int');return $var; } finally {'Iggyvolz\\Generics\\T1'::pop();} } }
可以传递多个参数
#[Generic(T1::class, T2::class)] class TestGeneric2 { public static function concat(#[T1] $var, #[T2] $var2): string { return $var . $var2; } }
生成
class TestGeneric2«int‚string» { public static function concat( #[\Iggyvolz\Generics\T1] int $var, #[\Iggyvolz\Generics\T2] string $var2, ): string { try {'Iggyvolz\\Generics\\T1'::push('int');'Iggyvolz\\Generics\\T2'::push('string');return $var . $var2; } finally {'Iggyvolz\\Generics\\T1'::pop();'Iggyvolz\\Generics\\T2'::pop();} } }
是的,"和" 以及 „ 在 PHP 类名称中是有效的。这不是逗号(0x2C),而是一个“单低9引号”(x82),这在 PHP 类名称中是有效的。