1

私は一般的にphpとOOPに慣れていないので、経験を積むために既存のサイトをoophpサイトに変えることにしました。これが私が現在直面している問題です。

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を実行すると(上記のように)、

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"}

しかし、私のlogin.phpページのコードを呼び出した後:

$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}

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

ありがとうございました。

編集済み:要求に応じて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;
    }

}
4

2 に答える 2

1

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

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

  1. (コンストラクターを使用する代わりに)NormalUserインスタンスを返す静的メソッドを作成するか、次のようにします。

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

    function __construct($loginarray) {
      $email = $loginarray['email'];
      $pass = $loginarray['pass'];
      $temp = parent::login($email,$pass);
    
      $this->user_id = $temp->user_id;
      // etc...
    }
    
于 2012-04-13T09:05:47.833 に答える
0

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

1つの解決策は、各フィールドを手動で割り当てることです。

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;
   }
  }
 }
}

しかし、それは私には間違っていると感じます。別のオプションは次のとおりです。

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

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

あなたの振る舞いについての私の推測find_by_sqlが正しければ、それはあなたが望む結果を生み出すはずです。

于 2012-04-13T09:01:15.990 に答える