timetoogo / php-generics
此包已被弃用且不再维护。没有建议的替代包。
PHP 的泛型类型
0.2.4
2014-02-12 12:02 UTC
Requires
- php: >=5.4.0
- nikic/php-parser: 0.9.4
Requires (Dev)
- phpunit/phpunit: 3.7.*
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__; }