Come iniettare istanze Java in script PHP eseguiti a livello programmatico utilizzando Quercus

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

  •  14-12-2019
  •  | 
  •  

Domanda

Ho un codice simile a questo:

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

(vedi http://wiki.caucho.com/quercus:_command_line_interface_(Cli) per maggiori informazioni)

Voglio impostare $obj come istanza Java.Qualcosa del genere:

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

Ovviamente questo è un esempio semplicistico ma il punto è che voglio essere in grado di utilizzare le istanze delle classi Java che sono già state istanziate nello script PHP.Come potrei fare questo?

È stato utile?

Soluzione

Non penso che questo sia documentato da nessuna parte, ma dopo aver visto attraverso il codice sorgente, guardando ciò che il Quercusengine stava facendo, e un piccolo processo ed errore è quello che serve:

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

Spero che questo aiuti qualcuno.Ho testato questo in Quercus 4.0.25.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top