Como injetar instâncias java em scripts PHP executados programaticamente usando Quercus

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

  •  14-12-2019
  •  | 
  •  

Pergunta

Eu tenho um código semelhante a este:

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

(Ver http://wiki.caucho.com/Quercus:_Command_Line_Interface_(CLI) para mais informações)

eu quero definir $obj como uma instância java.Algo assim:

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

Obviamente, este é um exemplo simplista, mas a questão é que eu quero poder usar instâncias de classes java que já foram instanciados no script php.Como eu poderia fazer isso?

Foi útil?

Solução

Não acho que isso esteja documentado em lugar nenhum, mas depois de examinar o código-fonte, ver o que o QuercusEngine estava fazendo e um pouco de tentativa e erro, é isso que é necessário:

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);

Espero que isso ajude alguém.Eu testei isso no Quercus 4.0.25.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top