1

AdminMenuプロジェクトの管理者用のメニューを作成するために使用しているクラスがあります。クラスは次のとおりです。

class AdminMenu{
    public $menu = array(
        'Groups and Statuses' => 'groups',
        'Members Management' => 'members',
        'Book Manager' => 'books',
        'Activity Log' => 'activities',
        'Quiz Maker' => 'quiz',
        'Other' => 'other'
    );
    public function AdminMenu() {
        $html = "<nav><ul><li><input type='text' id='search' placeholder='Search' /></li>";    
        foreach($this->menu as $text => $link){
            $html .= '<li><a href="'. site_url(array('admin', $link)) .'">'. $text .'</a></li>';
        }
        $html .= '</ul></nav>';
        echo $html;
    }
}

ご覧のとおり、コンストラクター関数はデータをエコーアウトしていますが、これは問題ありません。そのため、管理メニューが必要な場合は、電話new AdminMenu();をかけるだけで見栄えがします。

問題は、CodeIgniter がクラスをlibrariesディレクトリに保持し、次のように呼び出すことを推奨していることです$this->load->library('adminMenu');。問題は、何らかの理由でここでコンストラクター関数を呼び出すため、それをロードしてから新しい を作成するAdminMenu()と、コンストラクターが合計 2 回呼び出されるため、2 つのメニューが表示されることです。

ライブラリのロードはコンストラクターを呼び出すことを意図していますか?ここで間違っていますか? 出力用に別の関数を作成する必要がありましたか? または、そのままにしてlibraries、含まれているクラスのように呼び出すことはできますか?

ありがとう!

4

2 に答える 2

4

CodeIgniter のロードでは、常にコントローラーのローカル スコープにクラスの単一のインスタンスが作成されます。それがまさに彼らが設計した方法です。(私は個人的にそのアプローチが好きではありません。)

したがって、クラスを CodeIgniter ライブラリとしてビルドする場合は、コンストラクターでビルドアップ タスクのみを実行し (オブジェクト指向では推奨されます)、メニューを取得するための別のメソッドを用意する必要があります。

(あるいは、SPL オートローダーを追加するなどして、独自の外部ローディングを使用してクラスを直接ロードすることもできます)。

とにかく、これをやってみてください:

class AdminMenu
{
    public $menu = array(
        'Groups and Statuses' => 'groups',
        'Members Management' => 'members',
        'Book Manager' => 'books',
        'Activity Log' => 'activities',
        'Quiz Maker' => 'quiz',
        'Other' => 'other'
    );

    public function __construct()
    {
    }

    public function getMenu()
    {
        $html = "<nav><ul><li><input type='text' id='search' placeholder='Search' /></li>";    
        foreach($this->menu as $text => $link){
            $html .= '<li><a href="'. site_url(array('admin', $link)) .'">'. $text .'</a></li>';
        }
        $html .= '</ul></nav>';
        return $html;
    }
}

そして、次のように使用します。

$this->load->library('adminMenu');
echo $this->adminMenu->getMenu();

$menu を public ではなく private にすることもお勧めします。

于 2013-05-23T01:23:20.837 に答える
2

CodeIgniter はSingletonアプローチで動作します。ロード時にクラスを自動的にインスタンス化します。

このように、むしろ既存のインスタンスを使用する必要があります

$this->adminMenu->foo();

一方、コンストラクターからの出力を行うことはお勧めできません。コンストラクターは、アクションを実行するのではなく、オブジェクトの内部状態を構築することを目的としています。出力を呼び出し可能なメソッドに移動します。

もう 1 つ: PHP では (Java とは異なり)、__constructクラス名を使用するのではなく、コンストラクターに名前を付けることが推奨されます。これを参照してください。

于 2013-05-23T01:22:11.747 に答える