2013-04-12 104 views
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 class

+0

反射会检索到这一点,如可能使用PHP记号器 –

+0

我不认为有可能通过它的值得到常量的名称 - 例如,如果许多常量共享相同的值该怎么办?当然,你可以走很长的路:首先调用[get_defined_constants](http://php.net/manual/en/function.get-defined-constants.php),然后翻转结果数组。真正的问题是,你为什么需要这个? – raina77ow

+0

@MarkBaker请举个例子吗? @ raina77ow我不想通过它的值来获取常量的名称,我想将常量名为'CURLOPT_CONNECTTIMEOUT'作为一个字符串''CURLOPT_CONNECTTIMEOUT''。 – BadHorsie

回答

1

那么,在技术上有准备与curl常量名作为字符串和作为,以及价值观,价值观的数组的方式:你似乎只与CURLOPT常数应对

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

,可以完善它:

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

问题是,这些阵列中的几个常数仍然具有相同的值(CURLOPT_SSLCERTPASSWDCURLOPT_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更快。

+0

那么由于不同的常量具有相同的值,所以没有真正的方法来做到这一点?你知道他们为什么有相同的价值吗?这些数字对应什么?我认为他们会是独一无二的。 – BadHorsie