1

私には2つのクラスがprofileあり、そのloginUser-クラスあります。 ユーザーがログインし、すべてが検証に合格すると、次のようになります。 extendsprofile

$login = new loginUser();
$login->set_status(true);
$login->set_accessClearance($get['access']);  //  integer fetched from database
$login->set_userName($get['user_name']);  //  string fetched from database

クラスloginUserはプロファイルを拡張します:

class loginUser extends profile
{   
#   update status in profile
    public function set_status($bool){
        $this->loggedIn = $bool;
    }
//
#   set users access clearance into profile
    public function set_accessClearance($int){
        $this->accessClearance = $int;
    }
//
#   set username into profile
    public function set_userName($str){
    $this->userName = $str;
    }
//
}

loggedInaccessClaranceおよびuserName--classprotected内の変数profileです。

profile私の-クラスには何も書き込まれません。
私は値がデータベースからフェッチされることを知っています。var_dump()直接実行する$loginと、期待されるデータが保持されます...何が間違っているのですか?

クラスプロファイル

class profile
{
    protected $loggedIn = false;
    protected $accessClearance = 0;  //  0 = denied
    protected $userName;

    public function get_status(){
        return $this->loggedIn;
    }   
    public function get_accessClearance(){
        return $this->accessClearance;
    }
    public function get_userName(){
        return $this->userName;
    }
}

それが役立つ場合、私は私のprofile--クラスでこれを行いました:

session_start();
    $_SESSION['profile'] = new profile();
4

4 に答える 4

2

問題は、インスタンスとクラスの違いです。$_SESSION['profile']はprofileのインスタンスに設定されます。プロファイルには多くのインスタンスが存在する可能性があり(ユーザーログインは別のインスタンスです)、1つのデータが他のデータを変更しないでください。これは、オブジェクト指向プログラミングの基本的なパラダイムです。

あなたの問題の解決策は、いくつもの形をとることができます。$ _SESSION ['profile']を新しく作成したユーザーに再割り当てできます。これは、おそらく最も簡潔な方法です。または、Profileクラスで静的アクセサーと静的プロパティを使用して探索することもできます。これにより、スコープ内にプロファイルが1つだけ存在することが保証されます。

オブジェクトコンポジション(おそらくプロファイルにユーザーが含まれているなど)、シングルトン(Profile::getProfile()およびProfile::setProfile($logged_in_user))などの追加のメソッドがさらに高度になります。

于 2012-07-10T16:46:51.357 に答える
1

をに拡張することにより、単一責任の原則に違反しuser objectていauthentication objectます。

オブジェクトコンポジションを使用して、より優れたセッションと認証メカニズムを使用する必要があります。

于 2012-07-10T16:46:13.780 に答える
0

おそらく私はあなたを誤解しましたが、クラスの拡張がどのように機能するかを理解していないかもしれません。loginUserの拡張として宣言すると、のprofileすべてのインスタンスloginUserがプロファイルのプロパティを持つことを意味します。loginUserただし、これは、すべてのオブジェクトがすべてのプロファイルオブジェクトに影響を与えるという意味ではありません。クラスは単なる抽象的な定義であり、プログラム内で使用できる実際のものではありません。

于 2012-07-10T16:45:55.480 に答える
0

あなたはオブジェクト指向プログラミングの目的を誤解していると思います。これらの変数は、プロファイルではなく、loginUserクラスのオブジェクトを作成したため、サブクラスにのみ書き込まれます-継承は上ではなく下に機能します+これらの変数をプロファイルクラスに書き込む場合は、プロファイルクラスに書き込む必要があります:)。または、プロファイルクラスで静的にします:)

于 2012-07-10T16:47:30.917 に答える