Hprose for PHPサーバー(一)

3978 ワード

公開サービス
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に内蔵された関数である3つの方法を発表した.メソッド名を配列に入れてaddFunctionsで1回に複数追加したり、文字列をaddFunctionメソッドのパラメータとして1つずつ追加したりすることができます.
公開方法
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は静的メソッドであるため,追加時の2番目のパラメータはクラス名である.barはインスタンスメソッドなので、追加時はExample 1のインスタンスオブジェクトです.
2つの異なるクラスの同じ名前の方法を同時に発表すると、衝突するのではないかという疑問があるかもしれません.衝突を避けるにはどうすればいいですか?
エイリアスメカニズム
パブリッシュされたメソッドが同じ名前の場合、後で追加されたメソッドは前にメソッドに追加されて上書きされ、呼び出された場合、先に追加された同じ名前のメソッドに呼び出すことはできません.しかし、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();
?>

上記の例から,関数でもメソッドでも別名でパブリッシュでき,最後に別名パラメータを追加するだけでよいことが分かった.複数のメソッド(または関数)を同時に追加する場合、別名も複数であるべきであり、メソッド(または関数)名の個数と同じ個数で、一つ一つ対応します.
最後に注意したいのは、別名でパブリッシュされたメソッド(または関数)が呼び出し時に元のメソッド(または関数)名で呼び出されても呼び出せない場合、つまり別名でしか呼び出せないことです.
パブリッシュオブジェクト
Hproseは、addMethodとaddMethodsを使用してパブリッシュする方法に加えて、addInstanceMethods、addInstanceMethodsを使用して、指定したオブジェクト上の指定したクラス階層で宣言されたすべてのpublicインスタンスメソッドをパブリッシュする方法をより簡単にパブリッシュできます.3つのパラメータがあり、次の2つはオプションのパラメータです.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();
?>

効果は、前述のエイリアスメカニズムの例とex 2_をパブリッシュすることです.fooとex 2_barの方法は同じです.
クラスのパブリッシュ
addInstanceMethodsメソッドと同様に、addClassMethodsを使用すると、クラス上のメソッドをより簡単にパブリッシュできます.3つのパラメータがあり、次の2つはオプションのパラメータです.最初のパラメータはメソッドのパブリッシュクラスで、2番目のパラメータはメソッドの実行クラスで、3番目のパラメータは名前空間(別名接頭辞)です.