COM オブジェクトのイベントを PHP オブジェクトに接続する

# com_event_sink

(PHP 4 >= 4.2.0, PHP 5, PHP 7, PHP 8)

com_event_sink — COM オブジェクトのイベントを PHP オブジェクトに接続する

### 説明

function com_event_sink(variant `$variant`, object `$sink_object`, array|string|null `$sink_interface` = `null`): bool

`variant` が生成したイベントを PHP オブジェクト `sink_object` に通知するよう、COM に指示します。

この機能を利用する際には注意しましょう。もし以下の例のようなことを 行いたいのであれば、Web サーバー上でそれを行うことには まったく意味がありません。

### パラメータ

`variant`

`sink_object`

  `sink_object` には、要求されるディスパッチ インターフェイスと同じ名前のメソッドを持つクラスのインスタンスを 指定する必要があります。この要求を満たすクラスを作成するために、 com_print_typeinfo() を使用することができます。

`sink_interface`

  PHP は `variant` に関連するタイプライブラリで 指定されたデフォルトのディスパッチインターフェイスを使用しようと しますが、使用させたいインターフェイス名を `sink_interface` に指定することで、それを 上書きすることが可能です。

### 戻り値

成功した場合に `true` を、失敗した場合に `false` を返します。

### 変更履歴

バージョン | 説明
--- | ---
8.0.0 | `sink_interface` は、nullable になりました。

### 例

例1 COM イベントシンクの例

    <?php
    class IEEventSinker {
        var $terminated = false;

       function ProgressChange($progress, $progressmax) {
          echo "ダウンロードの進行状況: $progress / $progressmax\n";
        }

        function DocumentComplete(&$dom, $url) {
          echo "ドキュメント $url 完了\n";
        }

        function OnQuit() {
          echo "終了!\n";
          $this->terminated = true;
        }
    }
    $ie = new COM("InternetExplorer.Application");
    $sink = new IEEventSinker();
    com_event_sink($ie, $sink, "DWebBrowserEvents2");
    $ie->Visible = true;
    $ie->Navigate("http://www.example.org");
    while(!$sink->terminated) {
      com_message_pump(4000);
    }
    $ie = null;
    ?>

### 注意

警告

PHP 8.0.0 より前のバージョンでは、 イベントハンドラから exit() を呼ぶことはサポートされていませんでした。 そうしてしまうと、PHP がハングする可能性もありました。 この事象は、イベントハンドラから例外をスローしてメインのコードでキャッチし、 exit() を呼び出すことで回避できます。

### 参考

- com_print_typeinfo() - ディスパッチインターフェイスのために、PHP のクラス定義を出力する
- com_message_pump() - COM メッセージを処理し、timeoutms ミリ秒の間待つ

`↑` and `↓` to navigate • `Enter` to select • `Esc` to close • `/` to open