由于公司项目的需要,最经在研究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)这个接口,因为这个参数类型最接近。尽量少用函数重载。
本文介绍Quercus引擎支持下PHP与Java的集成方法,包括通过Resin框架获取服务实例、使用newJava()创建Java对象、导入Java类及调用其方法等内容,并讨论了方法重载的问题。
3156

被折叠的 条评论
为什么被折叠?



