Доступ к локальной переменной из другой функции PHP

#php #cakephp

#php #cakephp

Вопрос:

У меня есть частная функция, в которой много переменных, скажем, таких: $foo , $bar , $baz .

Внутри функции я вызываю parent::_setViewVars(array('foo','bar','baz'));

Это _setViewVars выглядит так:

 protected function _setViewVars($a){
    foreach($a as $v){
        global $$v;
        $this->set($v, $$v);
    }
}
  

Я просто хочу избавиться от дерьма cakephp, например, 80 строк $this->set('selected_areas',$selected_areas); , для этого и предназначена эта функция.

_setViewVars невозможно получить доступ $$v , потому что это не глобальная переменная. Учитывая, что эта функция вызывается из контекста, в котором есть эти переменные, могу ли я как-то их получить?

(кстати, если есть cakephp способ массовой настройки переменных просмотра с одинаковыми именами, скажите мне, как — я его не нашел)

PS: упаковка всего в массив НЕ является решением, мы говорим здесь о тысячах ненужных квадратных скобок.

Комментарии:

1. Взгляните на compact , который создает массив, полезный для вашего сценария.

2. Я пробовал это: compact также не достигает этих переменных.

3. Можете ли вы переопределить parent::_setViewVars ? Или вообще пропустить ее вызов в пользу вашего собственного цикла, в котором вы вызываете ->set() , имея дело с выводом compact ?

4. global ? Серьезно? Просто используйте compact() в своих действиях контроллера (не в избыточном отдельном методе): $this->set(compact('foo', 'bar', 'baz')); Это, кстати, именно то, что делает CakePHP при запуске контроллеров…

Ответ №1:

То, что вы ищете, на самом деле довольно стандартный PHP:

compact() — Создать массив, содержащий переменные и их значения

Пример, показывающий его использование в действии CakePHP:

 $var1 = "I";
$var2 = "love";
$var3 = "pizza!";
$this->set(compact('var1', 'var2', 'var3'));
  

(возможно, стоит попытаться немного смягчить ненависть — таким образом у вас больше шансов получить помощь)