Итак, да, eval()
часто ненавидят как одно из «зол» высшего порядка в php.В большинстве случаев, когда задача поддается решению с помощью eval()
или переменных-переменных (которые в основном представляют собой плохо упакованные массивы), это является признаком неправильно сохраненных / объявленных данных, и часто лучшим вариантом действий является полное переосмысление..
Чтобы решить отдельный вопрос без фундаментальной переписки пользовательской функции, я предложу меньшее «зло» (но, на мой взгляд, все еще «зло», поскольку при его использовании есть риски) - GLOBALS
& global
...
Код: ( Демо )
function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
global $pippo; // declare $pippo as a global variable
$pippo = 'Pizza';
return preg_replace_callback('/{{ \$(.*?) }}/', function($m) use ($pippo) {
echo "Global: " , $GLOBALS['pippo'];
echo "\n{$m[1]}\n";
return $GLOBALS[$m[1]] ?? $m[0]; // null coalescing operator provides fallback
},$value);
}
echo parseDbString();
Вывод:
Global: Pizza # <-- for demonstraton purposes
pippo # <-- for demonstraton purposes
Looking for a good Pizza # <-- desired output
... так почемуЯвляется ли этот обходной путь «плохой идеей», представьте, что у вас есть строка, содержащая {{ $db }}
- такое общее имя переменной, вероятно, существует в вашем списке глобальных переменных.Поэтому, если {{ variable }}
в вашей строке соответствует ЛЮБОЙ из переменных в глобальной области видимости, вы получите ошибочные результаты.
Теперь, что должно сделать?Просто объявите ваши $pippo
данные в массиве, чтобы иметь ассоциативные отношения для использования.( Демо )
function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
$lookup = ['pippo' => 'Pizza'];
return preg_replace_callback('/{{ \$(.*?) }}/', function($m) use ($lookup) {
return $lookup[$m[1]] ?? $m[0]; // null coalescing operator provides fallback
}, $value);
}
echo parseDbString();
В зависимости от степени контроля над входными данными, вы можете теперь удалить $
перед pippo
во входной строке -- который устраняет несколько ненужных символов здесь и там.
И если вы все еще читаете, вы можете очистить все это с помощью strtr()
или str_replace()
.( Демо )
function parseDbString(string $value = 'Looking for a good {{ $pippo }}'){
$lookup = ['{{ $pippo }}' => 'Pizza']; // this can be extended all you like!
return strtr($value, $lookup);
}
echo parseDbString();