1

オプションを設定すると、設定されているオプションを管理できるように、オプション名を配列に保存するcURLのラッパークラスを作成しています。

問題は、cURL オプション名が定数であり、実際には整数であるため、どのオプションが設定されているかを実際に判断できないことです。

クラスからの抜粋:

class Curl {

    protected $_options;

    public function setOption($name, $value) {
        $result = curl_setopt($this->_handle, $name, $value);
        if ($result) {
            $this->_options[$name] = $value;
        }
        return $result;
    }

}

次のオプションを設定したとしましょう。

array(
    CURLOPT_CONNECTTIMEOUT => 10,
    CURLOPT_HEADER => 0,
    CURLOPT_POST => 1,
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_TIMEOUT => 30
)

は次のCurl::_optionsようになります。

array(
    (int) 78 => (int) 10,
    (int) 42 => (int) 0,
    (int) 47 => (int) 1,
    (int) 19913 => (int) 1,
    (int) 13 => (int) 30
)

cURL 定数の実際の名前を取得するにはどうすればよいですか? これはReflection クラスを使用して可能ですか?

4

1 に答える 1

1

技術的には、curl定数名を文字列として、その値を値として配列を準備する方法があります。

$curl_constants = get_defined_constants(true)['curl'];

CURLOPT定数のみを扱っているように見えるので、それを改良することができます:

$curlopt_constants = [];
foreach ($curl_constants as $constant_name => $constant_value) {
  if (strpos($constant_name, 'CURLOPT') === 0) {
    $curlopt_constants[$constant_name] = $constant_value;
  }
}

問題は、これらの配列内のいくつかの定数がまだ同じ値 ( CURLOPT_SSLCERTPASSWDCURLOPT_SSLKEYPASSWDおよびCURLOPT_KEYPASSWD=> 10026;CURLOPT_READDATAおよびCURLOPT_INFILE=> 10009) を持っていることです。このあいまいさが問題ない場合は、この配列を反転してハッシュに変換できます。

$curlopt_constants_hash = array_flip($curlopt_constants);

次に、このハッシュを調べるだけで文字列リテラルを取得できます。

$curlopt_constant_name = 
    isset($curlopt_constants_hash[$constant_value])
        ? $curlopt_constants_hash[$constant_value]
        : null
;

それ(ハッシュのチェック)はarray_search、アレイで使用するよりも高速です。

于 2013-04-12T12:32:27.447 に答える