com_event_sink

Connect events from a COM object to a PHP object

&reftitle.description; `bool` `com_event_sink` `variant` `variant` `object` `sink_object` ``array``string``null```sink_interface`&null;

Instructs COM to sink events generated by `variant` into the PHP object `sink_object`.

Be careful how you use this feature; if you are doing something similar to the example below, then it doesn't really make sense to run it in a web server context.

&reftitle.parameters;

`variant`

`sink_object`

- `sink_object` should be an instance of a class with methods named after those of the desired dispinterface; you may use `com_print_typeinfo` to help generate a template class for this purpose.

`sink_interface`

- PHP will attempt to use the default dispinterface type specified by the typelibrary associated with `variant`, but you may override this choice by setting `sink_interface` to the name of the dispinterface that you want to use.

&reftitle.returnvalues;

&return.success;

&reftitle.changelog;

&Version; | &Description;
8.0.0 | `sink_interface` is nullable now.

&reftitle.examples;

### COM event sink example

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

       function ProgressChange($progress, $progressmax) {
          echo "Download progress: $progress / $progressmax\n";
        }

        function DocumentComplete(&$dom, $url) {
          echo "Document $url complete\n";
        }

        function OnQuit() {
          echo "Quit!\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;
    ?>

&reftitle.notes;

Prior to PHP 8.0.0, calling `exit` from any of the event handlers is not supported, and may cause PHP to hang. This can be worked around by throwing an exception from the event handler, catching the exception in the main code, and calling `exit` from there.

&reftitle.seealso;

- `com_print_typeinfo`
- `com_message_pump`