Почему PHP compact() использует строки вместо реальных переменных?
Может ли кто-нибудь объяснить преимущества функции compact() PHP, принимающей строку "переменная с этим именем" вместо фактической переменной?
Например:
$foo = 'foo';
$bar = 'bar';
$compacted = compact('foo', 'bar');
Почему мне нужно передать строку имени переменной вместо того, чтобы просто передать эту переменную и обработать PHP, сопоставляя это с массивом? Например:
$compacted = compact($foo, $bar);
Ответы
Ответ 1
Поскольку функция compact()
должна знать имена переменных, так как она будет использовать их как ключи массива. Если вы передадите переменные напрямую, то compact()
не будет знать их имена и не будет иметь никакого значения для возвращаемых ключей массива.
Однако я предлагаю создать массив вручную:
$arr = array(
'foo' => $foo,
'bar' => $bar);
Я считаю compact()
устаревшим и избегаю использовать его в любом новом коде.
Ответ 2
Что касается преимуществ, я нашел compact() полезным в приложениях MVC. Если вы пишете код контроллера и вам нужно передать ассоциативный массив переменных и их видимые имена, которые вы установили в своем контроллере, это сократит что-то вроде:
View::make('home')->with(array('products' => $products, 'title' => $title, 'filter' => $filter'));
к
View::make('home')->with(compact('products', 'title', 'filter'));
Ответ 3
compact
- это функция, а не языковая конструкция. Невозможно, чтобы функции PHP знали имена переданных им переменных. Теоретически compact
может быть реализована как языковая конструкция, такая как unset
или isset
, и работать так, как вы описали. Но это не то, что произошло.