Я хочу использовать поиск свойств в ассоциативном массиве строк, но есть уловка - мне нужно иметь возможность использовать переменную в строке. Я придумал два решения, но оба они кажутся взломанными в PHP.Получить строку из массива через поиск свойств, но вставить переменную
$foo = [
'someProp' => 'Some value here: $$value$$.'
];
$myProp = 'someProp';
$value = 'some value';
$myString = $foo[$myProp];
$myString = str_replace('$$value$$', $value, $myString);
echo $myString;
В JavaScript я, вероятно, использовал бы функции вместо строк и возвращал строку, включая переменную. Я слышал, что это плохая практика в PHP.
$foo = array(
'someProp' => function($value) {
return "Some value here: {$value}.";
}
);
$myProp = 'someProp';
$value = 'some value';
$myString = $foo[$myProp]($value);
echo $myString;
Чтобы быть уверенным, что это не/проблема X Y, то я скажу, что моя цель состоит в том, чтобы абстрактные мои сообщения об ошибках в одном месте в моем коде (массив упоминается здесь) и образуют то, что можно было бы считать error api для использования во всем приложении. Например:
try {
something(); //throws "MyException('someProp', 'someValue');
}
catch (MyException $e) {
$someClass->addError($e->getType(), $e->getValue());
//this function will get the string based on $type and add $value to it, then add the message to an array
}
ли один из этих двух подходов путь? Ответ, который я ищу, будет включать более оптимальное решение, если есть одна и зрелая мысль о моих двух предлагаемых решениях.
Почему вы рассматриваете замену строк как хак в PHP. Или иначе - что тогда не взлом? Также - может быть, вы хотите просто сделать правильное форматирование? Тогда нет необходимости хранить формат для каждого сообщения, только сообщения - и форматировать их внутри методов отображения по шаблону форматирования –
@AlmaDo Я считал его «взломанным», потому что я по существу создаю свою собственную систему интерполяции или конкатенации строк. Массив функций кажется более естественным, но также является проблемой памяти (я думаю). Я не совсем понимаю, как реализовать свое предложение. Если вы хотите расширить его, он может дать хороший ответ. – m59
У меня лично нет проблем с использованием закрытий здесь? Не понимаю, почему это должна быть плохая практика (просто не исполнитель, может быть ...). – bwoebi