2012-04-13 44 views
1

我是一般的PHP和OOP的新手,所以决定把我现有的网站放在一个php的oo中以获得一些经验。 这是我目前面临的问题。对象没有按照预期启动PHP OOP

我有一个从用户扩展的类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; 
    } 

} 
+2

'parent :: login'的返回值不是'NormalUser'对象本身 - 你能显示User :: login'方法的实现吗? – DCoder 2012-04-13 08:46:17

+0

@dcoder增加了登录方法 – Nik 2012-04-13 08:48:42

回答

1

问题是,你是在构造函数中返回一个对象。这不是构造函数的工作方式。

我有两个选项供您:

  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... 
    } 
    
+0

你是在现场。我不得不在构造语句中指定类(Normaluser)变量(它从用户登录方法中提取) – Nik 2012-04-13 10:15:45

0
new NormalUser()

创建NormalUser对象,这是从通过User::login()返回的User对象完全不同:

编辑。 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; 
    } 
    } 
} 
} 

但觉得我错了。另一种选择是:

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

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

如果我对你的find_by_sql行为的猜测是正确的,这应该产生你想要的结果。