我想在PHP中制作一些涉及脚本的游戏。出于显而易见的原因,我不希望玩家/用户使用我只是include
或eval
的PHP。所以我决定和LUA一起去。
但我从来没有在PHP中尝试过LUA。所以我的问题是:
我的目标:
main()
Enemy::isNear()
或Enemy::getHP()
同样,我很久以前只是抓过LUA,因为C中的游戏允许使用LUA mods。根本没有使用PHP的LUA经验。
答案 0 :(得分:0)
如果您正在谈论this,source code表示它只是像C嵌入一样创建标准的lua实例。它似乎没有定义任何lua-to-host接口,所以,lua代码没有直接访问php状态。
要让用户致电Enemy::isNear()
,您必须先将Enemy
置于lua状态。它似乎能够半智能地将php对象转换为lua表(lua.c第386行),我不确定方法字段是否会传输良好。在最坏的情况下,你需要自己执行实现对象包装(编写一个lua“类”,其构造函数接受一个php对象并在其上打一个metatable)。似乎有一种方法可以将php函数传递给lua。
Lua不应该访问任何你没有放入的php内容。还有危险的lua函数:require
,dofile
,load
,loadstring
,在lua的环境中loadfile
和库os
和debug
。
您可以通过输入以下代码段来检查lua函数的可用内容:
for k in pairs(_ENV) do print(k) end
为了确保你也可以投入这一行:
if not (_G==_ENV) then for k in pairs(_G) do print(k) end end
从此时开始,继续进行lua manual on scoping以及有关沙盒lua的其他讨论(例如this。Google也会查找其他结果)。您也可以阅读lua closures,这样就不会意外地将不良方法加入到upvalues中。
最后,代码while true do end
中有无限循环。如果您的沙箱没有处理(很可能),您将不得不从外部处理。可能像this。