2013-11-30 1 views
0

Я хочу использовать поиск свойств в ассоциативном массиве строк, но есть уловка - мне нужно иметь возможность использовать переменную в строке. Я придумал два решения, но оба они кажутся взломанными в 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 
} 

ли один из этих двух подходов путь? Ответ, который я ищу, будет включать более оптимальное решение, если есть одна и зрелая мысль о моих двух предлагаемых решениях.

+0

Почему вы рассматриваете замену строк как хак в PHP. Или иначе - что тогда не взлом? Также - может быть, вы хотите просто сделать правильное форматирование? Тогда нет необходимости хранить формат для каждого сообщения, только сообщения - и форматировать их внутри методов отображения по шаблону форматирования –

+0

@AlmaDo Я считал его «взломанным», потому что я по существу создаю свою собственную систему интерполяции или конкатенации строк. Массив функций кажется более естественным, но также является проблемой памяти (я думаю). Я не совсем понимаю, как реализовать свое предложение. Если вы хотите расширить его, он может дать хороший ответ. – m59

+0

У меня лично нет проблем с использованием закрытий здесь? Не понимаю, почему это должна быть плохая практика (просто не исполнитель, может быть ...). – bwoebi

ответ

2

В вашем примере имеется только одна переменная на строку сообщения или может быть много переменных?

Если есть только одна переменная, вместо роли вашей старой интерполяции строк, вы можете использовать для этого sprinf. По моему мнению, это более гибко, поскольку позволяет вам делать множество типов форматирования, например. int, decimal и т. д.

$foo = [ 
    'someProp' => 'Some value here: %s.' 
]; 
$myString = sprintf($myString, $value); 
Смежные вопросы