2012-01-23 3 views
2

У меня есть preg_replace_callback, который выполняет функцию закрытия (анонимного) как 2-й параметр, и он отлично работает на локальном уровне, но когда я развертываю его в среду, error => Внутренняя ошибка сервера 500. Когда я удаляю Closure, он работает.Функция закрытия Php как параметр для preg_replace_callback приводит к ошибке внутреннего сервера 500

$regExPattern = '/\<%(?<content>.*?)%\>/'; 
$template = preg_replace_callback($regExPattern, function ($matches) use ($dataItem) { 
    if(isset($dataItem[trim($matches['content'])])) { 
     return $dataItem[trim($matches['content'])]; 
    } 
    else { 
     return ''; 
    } 
}, $template); 

Любые предложения, как я могу справиться с этой проблемой. Мне нужно использовать $ dataItem внутри моей функции обратного вызова и передать его preg_replace_callback. Моя среда разработки - это код воспламенителя.

+3

Ваш производственный сервер не выводит ошибку, которая является хорошим дизайном. Вы можете проверить журнал ошибок и сообщить нам, что такое фактическая ошибка? –

+1

любой шанс, что у вас нет php 5.3 в вашей среде разработки? – boobiq

+0

Как @boobiq Я предполагаю, что существует высокая вероятность того, что ваш сервер не использует PHP 5.3 – rdlowrey

ответ

1

Анонимные функции работают только в PHP 5.3 и выше. Вы можете использовать вместо create_function():

$regExPattern = '/\<%(?<content>.*?)%\>/'; 
$template = preg_replace_callback($regExPattern, create_function(
     '$matches' 
    , 'if(isset($dataItem[trim($matches[\'content\'])])) { 
      return $dataItem[trim($matches[\'content\'])]; 
     } 
     else { 
      return ""; 
     }' 
    ) 
); 

Непроверено, конечно.

+1

Спасибо. Но мне не нравится писать код в виде строки. Поэтому я передал функцию типа array ($ this, 'functionName') и объявил ее в теле класса: private function functionName. Спасибо :) –

+0

Да, это была бы другая альтернатива. Я не уверен, что он работает с частными функциями, но я предполагаю, что вы протестировали. – Arjan