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合适?
  • 解决此问题的替代方法是什么?
4

3 回答 3

2

初始代码失败,因为您的 $roles_assigned 未注入。将函数参数化为“function print_roles_assigned($roles_assigned) { .. }”以访问 $roles_assigned 变量。

于 2013-06-21T14:47:35.880 回答
1

这听起来像是一个范围问题。尝试使用$this->roles_assigned该数组作为参考。

IMO,以这种方式使用 GLOBAL 并不是一个好习惯。

于 2013-06-21T14:46:01.770 回答
1

为什么我的初始代码无法工作?

每个函数都有所谓的变量范围。在函数外部声明的变量不能从函数内部访问,除非它们作为参数传入,是函数所属的类的成员,或者显式声明为全局变量。

有三种不同的方法可以做到这一点,任你选择。

最简单的方法是将函数作为参数传入 IE

$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类的成员,IE

$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;
}

另一个选项(不推荐)是使用全局关键字 IE

$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;
}
于 2013-06-21T14:51:18.723 回答