Cómo inyectar instancias de Java en scripts PHP ejecutados mediante programación usando Quercus

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

  •  14-12-2019
  •  | 
  •  

Pregunta

Tengo un código similar 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 más información)

quiero establecer $obj como una instancia de Java.Algo como esto:

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

Obviamente este es un ejemplo simplista pero el punto es que quiero poder usar instancias de clases java. que ya han sido instanciados en el script php.¿Cómo podría hacer esto?

¿Fue útil?

Solución

No creo que esto esté documentado en ninguna parte, pero después de revisar el código fuente, observar lo que QuercusEngine estaba haciendo y un poco de prueba y error, esto es lo que se necesita:

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 esto ayude a alguien.Probé esto en Quercus 4.0.25.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top