由于公司项目的需要,最经在研究Quercus一个纯java的php引擎。项目这两个需要做的就是将该引擎裁剪,做一个相对安全的版本,提供给ISV使用,同时,在引擎中提供默认的接口供调用。所以先研究了一下,在Quercus引擎的支持下,PHP如何与java集成。
以下是学习到的几点:
1、如果使用 Resin-IoC/WebBeans来组织应用的服务到脚本中,那么脚本中就可以直接获取到配置的服务的单例实例的引用,使用方式如下
<?php $demo_manager = java_bean("DemoeManager"); $demo = $demo_manager->findData("demoId"); foreach ($demo->getDatas() as $data) { echo $data . "/n"; } ?>
2、另外一种可以通过new Java()方式,以class完整名称以及构造函数参数作为参数来生成对应的java 对象,例如
<?php $a = new Java("java.util.Date", 123); echo $a->time; ?>3、Quercus还支持,类似于java 的引用方式,即,在PHP中使用import语句引入class,使用new关键字来创建对象。<?php import java.util.Date; $a = new Date(123); echo $a->time; ?>如果是使用Resin框架,会自动加载 WEB-INF/classes/classname.php中配置的的class。4、在Quercus中,PHP的语法用于激活java对象的方法,下面说明一下通常的方法调用和属性的get和set<?php import java.util.Date; $a = new Date(123); echo $a->getTime(); # calls getTime() echo $a->setTime(456); # calls setTime(456) echo $a->time; # calls getTime() $a->time = 456; # calls setTime(456) ?>5、在Quercus中,java类被引入了,静态方式和静态属性是可以访问的<?php import java.util.Calendar; $calendar = Calendar::getInstance(); var_dump($calendar); ?>或者使用new java_class()方式获得class对象<?php $class = java_class("java.lang.System"); # System.in $in = $class->in; # System.currentTimeInMillis(); $time = $class->currentTimeInMillis(); ?>
6、关于java对象中的方法重载问题,PHP本身是不支持函数重载的,对参数个数的重载支持得还不错,但是参数个数相同,参数类型不同的重载
支持得就不太好了。我觉得是由于PHP本身所类型有关。比如下面的定义的java类
import com.caucho.quercus.module.AbstractQuercusModule; public class MyModule extends AbstractQuercusModule { public static void foo(String a, boolean b) { } public static void foo(String a, String b) { } }
在PHP中调用
<?php foo('abc', false); ?>就比较含糊,但是还是会调用foo(String a, boolean b)这个接口,因为这个参数类型最接近。尽量少用函数重载。