Я пишу класс оболочки для 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 ?
Ну, технически есть способ подготовить массив с именами констант 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
в массиве.