thakladd / phenerics
一个用于在PHP中创建某些类型泛型的包。
dev-master
2023-03-07 11:01 UTC
Requires
- php: >=8.1
This package is auto-updated.
Last update: 2024-09-07 14:05:06 UTC
README
我尝试通过这个小实验做的是创建一个类似泛型的东西,但它是PHP的,不使用docblocks,也不使用单态化。它使用eval()来创建一个新的命名类,该类扩展了核心Collection对象,但这与任何IDE都不太兼容。但如果这不会阻止你,那么可以试试看。这个包更像是概念测试的乐趣,而不是一个真正的生产包。
安装
需求
- PHP >= 8.1
- Composer
composer require thakladd/phenerics
用法
对于所有类型,将从 gettype 获取的值将用于,除非类型是对象,那么将使用 get_class 的结果(除非您想要的集合中的类型是 "object")。
返回的集合对象是数组的包装器,但因为它实现了 Iterator, ArrayAccess,和 Countable,所以它作为数组工作。
构建集合时,必须使用名为 arrayOf 的函数,其中参数是类型。该函数返回一个空集合,称为 ArrayOfType,您可以调用该对象以填充该类型的一个数组,集合将进行检查,并在类型不匹配时抛出异常。
顺便说一下,我对将其称为 ArrayOfType 有些犹豫,但确实没有很好的替代方案,因为我想要的方式(Array
示例
这里有一个简单的整数数组的示例。
//Note the type hint here function printIntList(ArrayOfInteger $list) { print_r($list->getList()); } //Type hint comes from here $array = arrayOf('integer')([1, 2, 3, 4, 5]); printIntList($array); //Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) print_r($array[1]); //2 $array[] = 6; print_r($array[5]); //6 print_r($array->get(2)); //3 foreach ($array as $key => $value) { echo $key . ': ' . $value . ', '; //0: 1, 1: 2, 2: 3, 3: 4, 4: 5, 5: 6, }
这里有一个对象的示例。
class Test { public function __construct(public string $x = '') {} } function printTestList(ArrayOfTest $list) { print_r($list->getList()); } $arrayOfTest = arrayOf('Test')([new Test('Hello'), new Test('On'), new Test('You')]); $arrayOfTest->add(3, new Test('You')); $arrayOfTest[] = new Test('Old'); $arrayOfTest['assoc'] = new Test('Glue'); printTestList($arrayOfTest); //Array ( [0] => Test Object ( [x] => Hello ) [1] => Test Object ( [x] => On ) [2] => Test Object ( [x] => You ) [3] => Test Object ( [x] => You ) [4] => Test Object ( [x] => Old ) [assoc] => Test Object ( [x] => Glue ) )