COM および .Net (Windows)

目次

com クラス

はじめに

com クラスにより、OLE 互換の COM オブジェクトのインスタンスを作成し、 そのメソッドをコールしたりそのプロパティにアクセスしたりすることが 可能となります。

クラス概要

com
extends variant
/* メソッド */
public com::__construct(
    string $module_name,
    arraystringnull $server_name = null,
    int $codepage = CP_ACP,
    string $typelib = ""
)

Overloaded Methods

返されるオブジェクトは、オーバーロードされたものです。つまり、 PHP 側では通常のクラスのメソッドは見えないということです。 その代わりに、プロパティやメソッドへのアクセスは COM を通じて行います。

参照渡しのパラメータを受け付けるメソッドを PHP が 自動検出するようになりました。それらのメソッドについては、PHP が自動的に 変数を参照渡し形式に変換します。つまり、メソッドのコールをより自然に 行えるということです。コードの中で特別な処理をする必要はありません。

com の例

例1 com の例 (1)

<?php
// word を起動します
$word = new com("word.application") or die("Unable to instantiate Word");
echo 
"Loaded Word, version {$word->Version}\n";

// 前面に移動させます
$word->Visible 1;

// 空のドキュメントを開きます
$word->Documents->Add();

// 何か複雑なことを行います
$word->Selection->TypeText("This is a test...");
$word->Documents[1]->SaveAs("Useless test.doc");

// word を閉じます
$word->Quit();

// オブジェクトを開放します
$word null;

?>

例2 com の例 (2)

<?php

$conn 
= new com("ADODB.Connection") or die("Cannot start ADO");
$conn->Open("Provider=SQLOLEDB; Data Source=localhost;
Initial Catalog=database; User ID=user; Password=password"
);

$rs $conn->Execute("SELECT * FROM sometable");    // Recordset

$num_columns $rs->Fields->Count();
echo 
$num_columns "\n";

for (
$i=0$i $num_columns$i++) {
    
$fld[$i] = $rs->Fields($i);
}

$rowcount 0;
while (!
$rs->EOF) {
    for (
$i=0$i $num_columns$i++) {
        echo 
$fld[$i]->value "\t";
    }
    echo 
"\n";
    
$rowcount++;            // increments rowcount
    
$rs->MoveNext();
}

$rs->Close();
$conn->Close();

$rs null;
$conn null;

?>

dotnet クラス

はじめに

dotnet クラスにより、 クラスやメソッドが » COM に見えている場合、 .Net アセンブリからクラスを生成して そのメソッドをコールしたりプロパティにアクセスしたりできるようになります。

staticクラス をインスタンス化したり、staticメソッド を呼び出すことはサポートされていません。 System.Collections.Generic.List のようなジェネリッククラスをインスタンス化することもサポートしていません。

.Net クラスによっては、IDispatch を実装していないものがあります。 それらはインスタンス化はできるものの、メソッドをコールしたり プロパティへアクセスすることをサポートしていません。

注意:

この機能を利用するには、Webサーバーに .Netランタイムをインストールする必要があります。

注意:

PHP 8.0.0 より前のバージョンでは、 dotnet クラスは.Net framework 4.0 以降をサポートしていませんでした。 アセンブリが regasm.exe によって登録されている場合は、 それらのクラスは com オブジェクトを通じてインスタンス化できます。 PHP 8.0.0 以降では、php.inicom.dotnet_version を指定することで .Net framework 4.0 以降をサポートします。

クラス概要

dotnet
extends variant
/* メソッド */
public dotnet::__construct(string $assembly_name, string $datatype_name, int $codepage = CP_ACP)

オーバーロードされたメソッド

返されるオブジェクトはオーバーロードされています。つまり、通常の クラスのような固定されたメソッドは存在しないということです。 そのかわりに、プロパティやメソッドへのアクセスは COM を通じて DOTNET に渡されます。言い換えれば、.Net ランタイムが提供する COM相互運用レイヤによって .Net オブジェクトが COM 連携用にマップされているという ことです。

dotnet オブジェクトが作成されると、PHP はそれを他の COM オブジェクトと同等のものとして扱い、同様の規則が適用されます。

dotnet の例

例1 dotnet の例

<?php
$stack 
= new dotnet("mscorlib""System.Collections.Stack");
$stack->Push(".Net");
$stack->Push("Hello ");
echo 
$stack->Pop() . $stack->Pop();
?>

variant クラス

はじめに

VARIANT は、PHP の zval と同等の COM の値です。構造体形式になっており、 異なる型の値を含めることが可能です。COM 拡張モジュールが提供する variant クラスによって、PHP と COM の間のデータの受け渡しを制御できるように なります。

クラス概要

variant
/* メソッド */
public __construct(mixed $value = null, int $type = VT_EMPTY, int $codepage = CP_ACP)

variant の例

例1 variant の例

<?php
$v 
= new variant(42);
print 
"The type is " variant_get_type($v) . "<br/>";
print 
"The value is " $v "<br/>";
?>

注意:

値を返したり variant プロパティを取得したりする際に variant が PHP の値に変換されるのは、情報を失うことなく型変換ができる型が 存在する場合に限られます。それ以外の場合は、結果は variant クラスの インスタンスとして返されます。明示的にキャスト演算子を指定することで variant を PHP のネイティブ型として扱うことが可能です。また、 print を使用すると、暗黙のうちに値が文字列に 変換されます。variant に対する計算のためのさまざまな関数が用意されており、 型変換でデータを失うリスクを犯さなくてもそのままの形式で計算を 行うことが可能です。

variant_get_type も参照ください。

COMPersistHelper クラス

はじめに

COMPersistHelper クラスは、 php.iniopen_basedir ディレクティブと ストリーム リソース を考慮して COMPHP の相互運用性を高めます。

クラス概要

final COMPersistHelper
/* メソッド */
public __construct(variantnull $variant = null)
public stringfalse GetCurFileName()
public int GetMaxStreamSize()
public bool InitNew()
public bool LoadFromFile(string $filename, int $flags = 0)
public bool LoadFromStream(resource $stream)
public bool SaveToFile(stringnull $filename, bool $remember = true)
public bool SaveToStream(resource $stream)

com_exception クラス

はじめに

クラス概要

final com_exception
extends Exception
/* 継承したプロパティ */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private Throwablenull $previous = null;
/* 継承したメソッド */
public __construct(string $message = "", int $code = 0, Throwablenull $previous = null)
final public string getMessage()
final public Throwablenull getPrevious()
final public int getCode()
final public string getFile()
final public int getLine()
final public array getTrace()
final public string getTraceAsString()
public string __toString()
private void __clone()

com_safearray_proxy クラス

はじめに

com_safearray_proxy は、 SafeArray 型上での多次元配列へのアクセスを解決するのに使われる内部クラスです。

クラス概要

final com_safearray_proxy