2013-04-12 3 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

Reflection хотел бы получить это, как может, используя PHP tokeniser –

+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 имен констант как строки и их значения, как, ну, ценности:

$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_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 на массиве.

+0

Итак, нет никакого реального способа сделать это из-за разных констант, имеющих одинаковое значение? Вы знаете, почему они имеют одинаковое значение? Что соответствуют номерам? Я думал, что они будут уникальными. – BadHorsie

Смежные вопросы