2013-06-21 5 views
0

Я работаю над приложением CodeIgniter.Переменные данные ведут себя странно внутри функции

Часть навигационного меню для моего приложения создается из использования данных сеанса. Поскольку я должен печатать одно и то же в нескольких местах, я написал функцию для печати. Файл, создающий меню, приведен ниже. Функция print_roles_assigned() используется несколько раз в этом файле.

$roles_assigned = $this->session->userdata('roles_assigned'); 
function print_roles_assigned() { 
    $output = ''; 
    if ($roles_assigned) 
    { 
     foreach ($roles_assigned as $role) { 
      $output .= '<li>' . anchor('main/home/'.$role->role_name, $role->rol 
e_name) . '</li>'; 
     } 
    } 
    else 
    { 
     $output .= '<li>No roles have been assigned.</li>'; 
    } 
    return $output; 
} 

Приведенный выше код не работает. Из любых вариантов я прибегал к использованию $GLOBAL. Подобная проблема никогда не случалась со мной раньше, и я не уверен, подходит ли использование $GLOBAL. Новый код приведен ниже:

$GLOBALS['roles_assigned'] = $this->session->userdata('roles_assigned'); // Change made here 
function print_roles_assigned() { 
    $output = ''; 
    $roles_assigned = $GLOBALS['roles_assigned']; // Using the global variable inside function 
    if ($roles_assigned) 
    { 
     foreach ($roles_assigned as $role) { 
      $output .= '<li>' . anchor('main/home/'.$role->role_name, $role->rol 
e_name) . '</li>'; 
     } 
    } 
    else 
    { 
     $output .= '<li>No roles have been assigned.</li>'; 
    } 
    return $output; 
} 

Я хотел бы знать:

  • Почему мой исходный код не срабатывает?
  • Возможно использование $GLOBAL?
  • Что может быть альтернативным методом для устранения этой проблемы?
+1

http://php.net/manual/en/language.variables.scope.php – andrewsi

+0

Почему вы не можете использовать '$ this-> session-> UserData ('roles_assigned');' внутри функционировать? –

+0

@ user1612290 Это не сработало. – Aniket

ответ

1

Почему мой первоначальный код не сработал?

Каждая функция имеет так называемую переменную область видимости. Переменные, объявленные вне функции, недоступны изнутри функции, если они не переданы как параметры, являются членами класса, членом которого является функция, или явно объявлены глобальными.

Существует три разных способа сделать это, возьмите свой выбор.

Самый простой способ сделать это - просто передать функцию в качестве параметра I.E.

$roles_assigned = $this->session->userdata('roles_assigned'); 
function print_roles_assigned($roles_assigned) { 
    $output = ''; 
    if ($roles_assigned) 
    { 
     foreach ($roles_assigned as $role) { 
      $output .= '<li>' . anchor('main/home/'.$role->role_name, $role->rol 
e_name) . '</li>'; 
     } 
    } 
    else 
    { 
     $output .= '<li>No roles have been assigned.</li>'; 
    } 
    return $output; 
} 

Другим вариантом является, чтобы сделать $roles_assigned являющемуся членом класса, т.е.

$this->roles_assigned = $this->session->userdata('roles_assigned'); 
function print_roles_assigned() { 
    $output = ''; 
    if ($this->roles_assigned) 
    { 
     foreach ($this->roles_assigned as $role) { 
      $output .= '<li>' . anchor('main/home/'.$role->role_name, $role->rol 
e_name) . '</li>'; 
     } 
    } 
    else 
    { 
     $output .= '<li>No roles have been assigned.</li>'; 
    } 
    return $output; 
} 

Другой вариант (не рекомендуется) - использовать глобальное ключевое слово I.E.

$roles_assigned = $this->session->userdata('roles_assigned'); 
function print_roles_assigned() { 
    global $roles_assigned; 
    $output = ''; 
    if ($roles_assigned) 
    { 
     foreach ($roles_assigned as $role) { 
      $output .= '<li>' . anchor('main/home/'.$role->role_name, $role->rol 
e_name) . '</li>'; 
     } 
    } 
    else 
    { 
     $output .= '<li>No roles have been assigned.</li>'; 
    } 
    return $output; 
} 
+1

Мой голос был бы средним примером, здесь. Это в основном мой ответ, врученный ему на пресловутой тарелке. – shennan

1

Это звучит как проблема с объемом. Попробуйте использовать $this->roles_assigned для ссылки на этот массив.

ИМО, это нехорошо использовать GLOBAL таким образом.

2

Исходный код не удался, потому что ваши $ role_assigned не были введены. Параметрируйте функцию «function print_roles_assigned ($ role_assigned) {..}» для доступа к переменной $ role_assigned.

Смежные вопросы