thakladd/phenerics

一个用于在PHP中创建某些类型泛型的包。

dev-master 2023-03-07 11:01 UTC

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")。

返回的集合对象是数组的包装器,但因为它实现了 IteratorArrayAccess,和 Countable,所以它作为数组工作。

构建集合时,必须使用名为 arrayOf 的函数,其中参数是类型。该函数返回一个空集合,称为 ArrayOfType,您可以调用该对象以填充该类型的一个数组,集合将进行检查,并在类型不匹配时抛出异常。

顺便说一下,我对将其称为 ArrayOfType 有些犹豫,但确实没有很好的替代方案,因为我想要的方式(Array)是不可能的。我曾考虑过 Array«Type」,但那些字符在键盘上不太容易访问。另一个选择可能是 Array_Type,但我不喜欢它的蛇形-驼峰命名法。简单的 ArrayType 也可以工作,即使它与PHP中的标量类型(如 Arrayinteger)看起来不太搭配,即使 类名不区分大小写,在这里混合小写 i 和大写 I 并不是理想的做法。

示例

这里有一个简单的整数数组的示例。

//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 ) ) 

许可证

MIT