timetoogo/php-generics

此包已被弃用且不再维护。没有建议的替代包。

PHP 的泛型类型

0.2.4 2014-02-12 12:02 UTC

This package is auto-updated.

Last update: 2022-12-25 03:46:22 UTC


README

无聊的一天:PHP 的简单泛型

什么是泛型?

泛型允许你针对多种类型编写类型安全的代码。

安装

要使用 composer 安装,请将以下内容添加到您的 composer.json

{
    "require": {
      "timetoogo/php-generics": "0.2.4"
    }
}

实现

这个库利用了 PHP 的命名空间和自动加载功能来模拟泛型类型。泛型类将被解析,然后转换为所需的实际类型,并存储在配置的目录中。

入门

要开始使用 PHP-Generics,必须首先设置以下配置

  • DevelopmentMode - 如果将开发模式设置为 true,则将忽略缓存的实际类型并覆盖它们。
  • RootPath - 您项目的根目录,命名空间和类名必须与目录和文件路径相对应。
  • CachePath - 用于存储泛型类型实际实现的路径。
$Configuration = new \Generics\Configuration();
$Configuration->SetIsDevelopmentMode(true);
$Configuration->SetRootPath(__DIR__);
$Configuration->SetCachePath(__DIR__ . '/Cache');
//Register the generic auto loader
\Generics\Loader::Register($Configuration);

所有泛型类文件必须以 .generic.php 结尾

泛型示例

以下代码演示了一个简单的泛型类型

class Maybe {
    private $MaybeValue;
    
    public function __construct(__TYPE__ $Value = null) {
        $this->MaybeValue = $Value;
    }
    
    public function HasValue() {
        return $this->MaybeValue !== null;
    }
    
    public function GetValue() {
        return $this->MaybeValue;
    }
    
    public function SetValue(__TYPE__ $Value = null) {
        $this->MaybeValue = $Value;
    }
}

注意使用了 __TYPE__ 魔术常量,这些被用作类型参数。常量将根据需要替换为具体的类类型。您还可以使用多个类型参数,形式为 __TYPE1____TYPE2__ 等。您可以在任何上下文中使用类型参数:$Var instanceof __TYPE__func(__TYPE__)__TYPE__::Foo() 等。

注意,__TYPE____TYPE1__ 的别名。

使用泛型类型

类的类型参数定义为子命名空间,并由一个特殊的命名空间 _ 分隔

可以通过以下方式创建上述泛型的具体实现

$Maybe = new Maybe\stdClass();
$Maybe->HasValue(); //false
$Maybe->SetValue(new stdClass());
$Maybe->HasValue(); //true
$Maybe->SetValue(new DateTime()); //ERROR

以下创建了一个元组,其中 __TYPE1__stdClass__TYPE2__DateTime

$Tuple = new TupleOf\stdClass\_\DateTime();

限制:所有类型参数必须是完全限定名

如果您有一个命名空间类 Foo\Bar\SomeClass,则必须在泛型类型参数中指定此名称

$Tuple = new TupleOf\Foo\Bar\SomeClass\_\DateTime();

这创建了一个元组,其中 __TYPE1__Foo\Bar\SomeClass__TYPE2__DateTime

其他用途

泛型可以与继承一起使用

class TupleOfBarAndBaz extends TupleOf\Bar\_\Baz {
    //...
}

还支持泛型接口和特性

interface IHaveOne {
    public function GetOne();
    public function SetOne(__TYPE__ $One);
}

class User implements IHaveOne\Account {
    private $One;
    
    public function GetOne(){
        return $this->One;
    }
    public function SetOne(Account $One) {
        $this->One = $One;
    }
}

泛型可以嵌套

$ArrayOfArrayOfStandardClasses = new ArrayOf\ArrayOf\stdClass();

您甚至可以扩展/实现/使用泛型类型参数

class Example extends __TYPE1__ implements __TYPE2__, __TYPE3__ {
    use __TYPE4__, __TYPE5__;
}