2011-07-18 16 views
1

現在、PHPクラスのコンストラクタを使用して、ユーザーがログインしているかどうかを確認しています。コンストラクタは、セッションIDなどを持っているかどうかをチェックする関数を呼び出します。そうでない場合は、ログインページにリダイレクトします。ここで私が使用しているかのアイデアです:PHP __constructをオーバーライドする

function __construct() { 
    parent::__construct(); 
    $this->check(); 
    $this->mid = $this->session->userdata('member_id'); 
} 

function check() { 
    if($this->mid == ''){ 
     $this->login(); 
    } 
} 

function signup() { 
    // registration code 
} 

このコンストラクタは、当然のことながら、クラス内の他のすべての関数の前に実行されます。しかし、私はユーザーがアクセスする際にログインしないようにする必要がある登録機能を持っています。ログインしていないユーザーが登録機能にアクセスできるように、例外を作成するか、__construct関数をオーバーライドする方法はありますか?

答えて

6

コードを再設計する必要があります。最初に何か(ユーザーの検証)を常に行うクラスを定義し、そのクラスが無かったユーザー(検証されていないユーザー)にそのクラスを使用したいとします。トータルのハックを避けるためには、あなたのコードをリファクタリングして、あなたのクラスに設定した制限を回避するパッチを探すべきではありません。

+0

あなたはそうです。アカウント特権を持たないユーザーを処理し、登録ユーザーを扱う元のままにしておいた新しいSignupクラスを作成しました。ありがとう! – hohner

+0

@Jamie:お手伝いしてうれしい! –

1

__constructはオブジェクト作成時に自動的に呼び出されますが、変更する方法はありません。しかし、問題のクラスを拡張し、その派生クラスに対して関数__constructを記述すると、それが最初に呼び出され、そこに必要なことをすべて実行してから、例のように親コンストラクタをparent::__construct();経由で呼び出すことができます。コンストラクタが呼び出されていないオブジェクトへの操作は、通常はベスト・アイデアではありませんので、ロジックをできるだけコンストラクタの外に取り出すようにコードをリファクタリングすることをお勧めします。次に、やりとりすることも簡単になります。

2

クラス設計するとき、私はシンプルなガイドラインを持っている:コンストラクタで無機能(何かを初期化するだけのもの)

を、これは絶対にこの場合に必要とされている場合のように、ユーザーがログインしている場合には、チェックした場合に入れ、電話番号if(User::logged_in()) { .. }

関連する問題