PHP – Как избежать ошибок Parse на старых серверах при использовании новых функций

Когда я использую анонимную функцию (но см. Также примечание ниже), например:

$f = function() use ($out) { echo $out; }; 

Он создает ошибку синтаксического анализа на серверах, где PHP старше 5.3.0 . Мое программное обеспечение должно быть совместимо с неизвестными серверами, но в то же время я хочу также использовать новые функции, поэтому я решил добавить некоторую проверку версии,

 if (o99_php_good() != true){ $f = function() use ($out) { echo $out; }; } 

где o99_php_good() просто

 function o99_php_good(){ // $ver= ( strnatcmp( phpversion(),'5.3.0' ) >= 0 )? true:false; $ver= ( version_compare(PHP_VERSION, '5.3.0') >= 0 )? true:false; return $ver; } , function o99_php_good(){ // $ver= ( strnatcmp( phpversion(),'5.3.0' ) >= 0 )? true:false; $ver= ( version_compare(PHP_VERSION, '5.3.0') >= 0 )? true:false; return $ver; } , function o99_php_good(){ // $ver= ( strnatcmp( phpversion(),'5.3.0' ) >= 0 )? true:false; $ver= ( version_compare(PHP_VERSION, '5.3.0') >= 0 )? true:false; return $ver; } 

Но все же возникает ошибка.

Есть ли способ каким-то образом «изолировать» эту часть кода?

Я думал о выполнении условного include() на основе проверки версии, которая, вероятно, будет работать, но будет абсурдно делать отдельный файл каждый раз, когда мне нужно использовать функцию …

Любое творческое (или тривиальное) решение для этого?

Примечание. Пример здесь – это просто функция Lambda, но проблема может возникать в каждой другой функции, которая является новой функцией и / или может не поддерживаться на некоторых серверах.

Отредактируйте меня после комментария.

Добавление списка «минимальных требований» всегда хорошо, но это не решает проблему.

Если кто-то не хочет потерять пользователей (не все клиенты довольны или могут обновлять свои серверы каждый раз, когда я обновляю новую функцию), это просто заставит меня «размотать» мое программное обеспечение на 2 (или, возможно, больше) неуправляемых версиях.

У меня была точно такая же проблема и она была решена с использованием функции eval:

 if (version_compare(PHP_VERSION, '5.3.0') >= 0) { eval(' function osort(&$array, $prop) { usort($array, function($a, $b) use ($prop) { return $a->$prop > $b->$prop ? 1 : -1; }); } '); } else { // something else... } 

Единственное, что я могу придумать, это создать скрипт сборки, который люди должны будут запускать, чтобы сделать его совместимым с более низкими версиями.

Поэтому в случае анонимных методов скрипт будет проходить через все файлы PHP, ища анонимные методы:

 $f = function($a) use($out) { echo $a . $out; }; 

и замените их на create_function для <5.3:

 $f = create_function('$a', ' global $out; echo $a . $out; '); 

Анонимные функции появились с PHP 5.3.0 .
Мое первое, что нужно сделать, это заменить одним из следующих:

 $my_print_r = "my_print_r"; $my_print_r(); 

или

 $my_print_r = create_function('$a','print_r($a);'); 

ОБНОВИТЬ:

я бы пошел первым методом … Это дало бы мне достаточно средств для создания моих собственных версий функций и в гораздо более простой процедуре, чем create_function , независимо от версии PHP . У меня никогда не было проблем с этим подходом. На самом деле я когда-то построил целый многомерный массив функций , который был легко управляемым и способным добавлять / удалять функции, подумайте об этом. Эта система также использовалась другими пользователями, они также смогли добавить свои функции.

использование

 if (o99_php_good() != true){ include 'new_func.php'; } 

new_func.php:

  $f = function() use ($out) { echo $out; };