2012-04-13 12 views
1

私はphpとOOPには一般的なので、私はいくつかの経験を得るためにoo phpで私の既存のサイトを有効にすることを決めました。 ここに私が現在直面している問題があります。オブジェクトが意図したとおりに起動していないOOP

私はUserから拡張しているNormaluserクラスを持っています。 Userクラスの中には、Usersクラスのプロパティの配列を含むオブジェクトを返すログインメソッドがあります。

class NormalUser extends User { 

public function __construct($loginarray){ 
    $email = $loginarray['email']; 
    $pass = $loginarray['pass']; 

    var_dump (parent::login($email,$pass)); 
    //return parent::login($email,$pass) 
} 
} 

のvar_dumpを(上記のように)私は私のlogin.phpページ内のコードを呼び出した後

bool(false) object(User)#8 (4) 
{ ["user_id"]=> string(1) "1" ["first_name"]=> string(7) "Melanie" ["last_name"]=> string(6) "Janson" ["user_level"]=> string(1) "1" } 

しかし

を得ること:

$postdata = User::mysqli_array_escape($_POST);  

    $email = $postdata['email']; 
    $pass = $postdata['pass']; 

    $userstart = new NormalUser($postdata); 
    var_dump($userstart); 

は、私が思うだろうそのよう$userstartを呼び出します新しいNormalUserオブジェクトは正しい変数を返しますが、上記のようにvar_dumpを実行すると、次のように表示されます。

 
object(NormalUser)#5 (4) 
{ ["user_id"]=> NULL ["first_name"]=> NULL ["last_name"]=> NULL ["user_level"]=> NULL } 

どこが間違っているのかわかりません。誰かが正しい方向に向けることができれば、私は非常に感謝しています。

ありがとうございます。

EDITED:添加user.phpログインメソッド要求として

public static function login($email, $pass) { 
    global $database; 
    $sql = "SELECT user_id, first_name, last_name, user_level FROM users WHERE (email='$email' AND pass=SHA1('$pass')) AND active IS NULL LIMIT 1"; 
    $results = self::find_by_sql($sql); 
    //var_dump($results); 
    if (!empty($results)) { 

     return array_shift($results); 
    } else { 
     return false; 
    } 

} 
+2

'parent :: login'の戻り値は' NormalUser'オブジェクトではありません。 'User :: login'メソッドの実装を表示できますか? – DCoder

+0

@dcoderはあなたがログインしていたログイン方法 – Nik

答えて

1

問題は、がコンストラクタのオブジェクトを返すことです。これはコンストラクターの仕組みではありません。

私はあなたのための2つのオプションがあります。

  1. あなたが(代わりにコンストラクタを使用しての)NormalUserインスタンスを返す静的メソッドを作成して次のいずれか

    // In your NormalUser class. 
    static function createNormalUser($loginarray) { 
        $email = $loginarray['email']; 
        $pass = $loginarray['pass']; 
        return parent::login($email,$pass); 
    } 
    
  2. それともに固執しますオブジェクトインスタンスを返す代わりに、その属性をインスタンスに割り当てます。

    function __construct($loginarray) { 
        $email = $loginarray['email']; 
        $pass = $loginarray['pass']; 
        $temp = parent::login($email,$pass); 
    
        $this->user_id = $temp->user_id; 
        // etc... 
    } 
    
+0

を持っています。私は、(ユーザーのログインメソッドから引っ張った)構成ステートメントのクラス(Normaluser)変数を割り当てなければなりませんでした。 – Nik

0

new NormalUser()User::login()によって返さUserオブジェクトから完全に区別されるNormalUserオブジェクトを作成します。 Userオブジェクトは、何も割り当てられていないため、すぐに失われます。

一つの解決策は、手動で各フィールドを割り当てるには、次のようになります。

class NormalUser extends User { 

public function __construct($loginarray){ 
    $email = $loginarray['email']; 
    $pass = $loginarray['pass']; 

    if($base = parent::login($email,$pass)) { 
    $fields = array('user_id', 'first_name', 'last_name', 'user_level'); 
    foreach($fields as $fld) { 
    $this->$fld = $base->$fld; 
    } 
    } 
} 
} 

それは私に間違って感じています。別のオプションは、次のようになります。あなたのfind_by_sqlの行動についての私の推測が正しければ

$email = $postdata['email']; 
$pass = $postdata['pass']; 

$userstart = NormalUser::login($postdata); 
var_dump($userstart); 

、それはあなたが望む結果を生成する必要があります。

関連する問題