Intereting Posts
удалить все, кроме имени файла php Использование «Neoxygen / Neoclient» в качестве ServiceProvider + Facade в Laravel 5.1 Почему PHP md5 отличается от md5 OpenSSL? Разрешенный размер памяти 262144 байт исчерпан (пытался выделить 24576 байт) 2 Ячейки ввода автозаполнения / предложения с использованием jQuery или Ajax со вторым ящиком на основе первых выборок с несколькими элементами Задать настраиваемый заголовок, а затем перенаправить как получить привычные черты в php-классе? как я могу создать базу данных mysqli для первого в первый раз? построить php5.3.8 на ubuntu, получить ошибку: configure: error: Не удалось найти gmp.h PHP: объединить два массива, сохраняя ключи вместо переиндексации? Opencart: Как включить скрипт на определенные страницы? Акцентированные символы в таблице mySQL получить имя изображения при загрузке Почему putenv () необходим для уже заданной переменной среды? Как сжать или преобразовать в Mp3-файл низкого качества из PHP

Получить постоянное имя в виде строки

Я пишу класс оболочки для 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 в массиве.