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

最初のコードが機能しなかったのはなぜですか?

各関数には、可変スコープと呼ばれるものがあります。関数の外部で宣言された変数は、パラメーターとして渡されるか、関数がメンバーであるクラスのメンバーであるか、グローバルであると明示的に宣言されていない限り、関数内からアクセスできません。

これを行うには 3 つの異なる方法があります。

これを行う最も簡単な方法は、関数をパラメーター 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;
}

もう 1 つのオプション (推奨されません) は、グローバル キーワード 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 に答える