Как внедрить экземпляры Java в PHP-скрипты, программно выполняемые с помощью Quercus

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