0

次のようなコードがあります。

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)を参照してください)

$objJavaインスタンスとして設定したい。このようなもの:

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

明らかにこれは単純な例ですが、ポイントは、php スクリプトで既にインスタンス化されているJava クラスのインスタンスを使用できるようにしたいということです。どうすればこれを行うことができますか?

4

1 に答える 1

0

これはどこにも文書化されていないと思いますが、ソースコードを調べ、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 でテストしました。

于 2012-03-15T01:13:23.807 に答える