设为首页 收藏本站
查看: 567|回复: 0

[经验分享] Hprose for PHP 服务器(一)

[复制链接]

尚未签到

发表于 2017-3-30 13:07:58 | 显示全部楼层 |阅读模式
发布服务
Hprose提供了多种方法发布服务,除了提供了跟PHPRPC中相同的add方法以外,还提供了更多方便的方法。
发布函数
在快速入门一章中,我们已经在Hello服务器的例子中看到过如何发布一个函数了,这里我们主要谈一下哪些函数可以作为Hprose服务发布。
实际上大部分函数都是可以作为Hprose服务发布的,甚至包括PHP中的内置的函数。但如果参数或结果中包含有资源类型(比如mysql_connect,mysql_query等),那么这种函数就不能够发布。
你可以同时发布多个函数,不论是你自定义的,还是PHP内置的都可以。例如:
<?php
include("hprose/hproseHttpServer.php");
$server = new HproseHttpServer();
$server->addFunction("trim");
$server->addFunctions(array('md5', 'sha1'));
$server->handle();
?>

在上面这个例子中我们发布了三个方法,这三个都是PHP内置的函数。我们可以把方法名放到数组中,用addFunctions一次添加多个,也可以以字符串作为addFunction方法的参数一个一个的添加。
发布方法
Hprose for PHP 也支持发布类的静态方法和对象的实例方法,如下例:
<?php
include("hprose/hproseHttpServer.php");
class Example1 {
static function foo() {
return 'foo';
}
function bar() {
return 'bar';
}
}
$server = new HproseHttpServer();
$server->addMethod('foo', 'Example1');
$server->addMethod('bar', new Example1());
$server->handle();
?>

这里foo是一个静态方法,所以添加时第二个参数是类名。而bar是一个实例方法,所以添加时是一个Example1的实例对象。
现在你可能会有这样的疑问,如果要同时发布两个不同类中的同名方法的话,会不会有冲突呢?如何来避免冲突呢?
别名机制
确实会遇到这种情况,就是当发布的方法同名时,后添加的方法会将前面添加到方法给覆盖掉,在调用时,你永远不可能调用到先添加的同名方法。不过Hprose提供了一种别名机制,可以解决这个问题。要用自然语言来解释这个别名机制的话,不如直接看代码示例更直接一些:
<?php
include("hprose/hproseHttpServer.php");
function hello($name) {
return 'Hello ' . $name;
}
class Example1 {
static function foo() {
return 'foo';
}
function bar() {
return 'bar';
}
}
class Example2 {
function foo() {
return 'foo, too';
}
function bar() {
return 'bar, too';
}
}
$server = new HproseHttpServer();
$server->addFunction('hello', 'hi');
$server->addMethod('foo', 'Example1', 'ex1_foo');
$server->addMethod('bar', new Example1(), 'ex1_bar');
$server->addMethods(array('foo', 'bar'), new Example2(), array('ex2_foo', 'ex2_bar'));
$server->handle();
?>


从上面这个例子,我们就会发现不论是函数还是方法都可以通过别名来发布,只需要在最后再加一个别名参数就可以了。同时添加多个方法(或函数)时,别名也应该是多个,并且个数要跟方法(或函数)名个数相同,且一一对应。
最后要注意的一点是,通过别名发布的方法(或函数)在调用时如果用原方法(或函数)名调用是调用不到的,也就是说只能用别名来调用。
发布对象
除了向上面通过addMethod和addMethods发布方法以外,Hprose可以让您更方便的发布一个对象上的方法,那就是使用addInstanceMethods,addInstanceMethods用来发布指定对象上的指定类层次上声明的所有public实例方法。它有三个参数,其中后两个是可选参数。如果您在使用addInstanceMethods方法时,不指定类层次(或者指定为NULL),则发布这个对象所在类上声明的所有public实例方法。这个方法也支持指定名称空间(别名前缀)。
例如:
<?php
include("hprose/hproseHttpServer.php");
class Example2 {
function foo() {
return 'foo, too';
}
function bar() {
return 'bar, too';
}
}
$server = new HproseHttpServer();
$server->addInstanceMethods(new Example2(), NULL, 'ex2');
$server->handle();
?>

效果是跟上面别名机制例子中发布ex2_foo和ex2_bar方法一样的。
发布类
跟addInstanceMethods方法类似,使用addClassMethods可以让您更方便的发布一个类上的方法。它有三个参数,其中后两个是可选参数。第一个参数是方法的发布类,第二个参数为方法的执行类,第三个参数为名称空间(别名前缀)。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-357703-1-1.html 上篇帖子: PHP Fetion 类 可以用 下篇帖子: php加密 md5 sha1 crc32 mcrypt des
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表