Когда я использую анонимную функцию (но см. Также примечание ниже), например:
$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; };