iggyvolz/generics

dev-main 2021-08-18 04:32 UTC

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 类名称中是有效的。