Взгляните на библиотеку утверждений типа , созданную разработчиками HHVM, в частности реализацию VectorSpe c . На момент написания статьи, особенно для примитивов, нет ничего особенного: сначала проверка типа контейнера Traversable, затем итерация по массиву и утверждение содержимого в желаемом типе. Вы можете вырезать только соответствующий бит, используя is
для обобщенных c типов для> = 3.28 (или is_vec
для более старых версий, если вы не против точно vec
):
function acceptHackArray(mixed $x): someType {
invariant($x is Traversable<_>, '$x is not Traversable');
$tmp = vec[];
foreach($x as $v) {
invariant($v is int, '$v is not int');
$tmp[] = $v;
}
// $tmp is now vec<int>
// ...
}