PHP中如何实现Lua FFI的ffi.typeof('uint64_t[?]')功能?
PHP FFI 实现 LuaJIT
ffi.typeof("uint64_t[?]") 的对应功能 LuaJIT 里的 local qwords = ffi.typeof("uint64_t[?]") 是用来定义一个可动态指定长度的uint64_t数组类型,后续可以用这个类型创建任意长度的数组实例。PHP FFI 的 API 和 LuaJIT 不同,你之前的写法错误是因为对 PHP FFI 的 API 理解偏差:
FFI::typeof()是用来获取已存在的FFI\CData对象的类型,不是从字符串创建新类型,所以传字符串会报错。FFI\CData不能直接实例化,必须通过FFI::new()或FFI::cast()创建。
正确实现方式
方式一:先创建动态数组类型(对应LuaJIT的typeof用法)
先定义可变长度的uint64_t数组类型,再用这个类型创建指定长度的数组实例:
// 获取uint64_t的基础类型 $uint64_type = FFI::type('uint64_t'); // 创建动态长度的uint64_t数组类型(FFI::VAR表示可变长度) $qwords_type = FFI::arrayType($uint64_type, [FFI::VAR]); // 用该类型创建一个长度为5的uint64_t数组实例 $qwords = FFI::new($qwords_type, 5);
方式二:直接创建指定长度的数组(更简洁)
如果不需要复用动态类型,直接实例化时指定数组长度即可:
// 直接创建长度为5的uint64_t数组 $qwords = FFI::new('uint64_t[5]');
验证用法
创建后可以像操作普通数组一样访问元素:
$qwords[0] = 1234567890123456789; echo $qwords[0]; // 输出 1234567890123456789
内容的提问来源于stack exchange,提问作者neubert
相关产品推荐
相关产品推荐

