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 常量的实际名称?这可能使用反射类吗?

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_SSLCERTPASSWD,CURLOPT_SSLKEYPASSWDCURLOPT_KEYPASSWD=> 10026;CURLOPT_READDATACURLOPT_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 回答