web-dev-qa-db-ja.com

PHP 7および厳密な「リソース」タイプ

PHP 7は、リソースの厳密な型指定をサポートしていますか?サポートしている場合、どのようにですか?

例えば:

_    declare (strict_types=1);

    $ch = curl_init ();
    test ($ch);

    function test (resource $ch)
    {

    }
_

上記はエラーになります:

致命的なエラー:キャッチされないTypeError:test()に渡される引数1はリソースのインスタンスでなければなりません。リソースは指定されています

_$ch_のvar_dumpは、それがresource(4、curl)であることを明らかにし、マニュアルではcurl_init ()がリソースを返すと述べています。

_$ch variable_をサポートするために、厳密にtest()関数を入力することは可能ですか?

34
Phil

PHPには リソースのタイプヒント がないため、

リソースのタイプヒントは追加されていません。これにより、リソースから既存の拡張機能のオブジェクトに移動できなくなります。これは、一部のユーザーが既に行っていることです(GMPなど)。

ただし、関数/メソッド本体内で is_resource() を使用して、渡された引数を確認し、必要に応じて処理することができます。再利用可能なバージョンは、次のようなアサーションになります。

function assert_resource($resource)
{
    if (false === is_resource($resource)) {
        throw new InvalidArgumentException(
            sprintf(
                'Argument must be a valid resource type. %s given.',
                gettype($resource)
            )
        );
    }
}

あなたはそれからあなたはそのようなあなたのコード内で使うことができます:

function test($ch)
{
    assert_resource($ch);
    // do something with resource
}
48
Gordon

resource有効なタイプ ではないため、古き良きPHP/5タイプのヒントに従って、クラス名と見なされます。ただし、curl_init()はオブジェクトインスタンスを返しません。

私が知る限り、リソースを指定する方法はありません。すべてのリソースが同一であるとは限らないため、おそらくそれほど役に立ちません。fopen()によって生成されたリソースは、oci_parse()には役に立たないでしょう。

9