如何将 java 实例注入到使用 Quercus 以编程方式执行的 PHP 脚本中

StackOverflow https://stackoverflow.com//questions/9706430

  •  14-12-2019
  •  | 
  •  

我有一些与此类似的代码:

QuercusEngine engine = new QuercusEngine();
Value value = engine.execute("<?php return $obj->getName(); ?>");
System.out.println(value);

(看 http://wiki.caucho.com/Quercus:_Command_Line_Interface_(CLI) 了解更多信息)

我想设置 $obj 作为一个java实例。像这样的东西:

SomeObject someObject = new SomeObject();
engine.setParam("obj", someObject);

显然这是一个简单的例子,但重点是我希望能够使用 java 类的实例 已经实例化的 在 PHP 脚本中。我怎么能这样做呢?

有帮助吗?

解决方案

我不认为这在任何地方都有记录,但是在查看了源代码、查看了 QuercusEngine 正在做什么以及进行了一些试验和错误之后,这就是它所需要的:

Path path = new StringPath("<?php return $obj->getName(); ?>");
QuercusContext quercusContext = new QuercusContext();
ReadStream reader = path.openRead();
QuercusProgram program = QuercusParser.parse(quercusContext, null, reader);
WriteStream out = new WriteStream(StdoutStream.create());
QuercusPage page = new InterpretedPage(program);

Env env = new Env(quercusContext, page, out, null, null);

SomeObject someObj = new SomeObject();

JavaClassDef classDef = env.getJavaClassDefinition(someObject.getClass());
env.setGlobalValue("obj", new JavaValue(env, someObject, classDef));

Value value = NullValue.NULL;

try {
  value = program.execute(env);
}
catch (QuercusExitException e) {
}

out.flushBuffer();
out.free();

System.out.println(value);

希望这对某人有帮助。我在 Quercus 4.0.25 中对此进行了测试。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top