我一般都是php和OOP的新手,因此决定将我现有的网站改为oo php,以获得一些经验。 这是我目前面临的问题。
我有一个从用户扩展的Normaluser类。 User类内部是一个login方法,它返回一个包含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 }
我不明白我哪里出错了,如果有人能够指出我正确的方向,我会非常感激。
谢谢。
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;
}
}
答案 0 :(得分:1)
问题是你在构造函数中返回一个对象。这不是构造函数的工作方式。
我有两种选择:
要么创建一个返回NormalUser实例的静态方法(而不是使用构造函数):
// In your NormalUser class.
static function createNormalUser($loginarray) {
$email = $loginarray['email'];
$pass = $loginarray['pass'];
return parent::login($email,$pass);
}
或者您坚持使用构造函数,但不是返回对象实例,而是将其属性分配给$this
实例:
function __construct($loginarray) {
$email = $loginarray['email'];
$pass = $loginarray['pass'];
$temp = parent::login($email,$pass);
$this->user_id = $temp->user_id;
// etc...
}
答案 1 :(得分:0)
new NormalUser()
创建一个NormalUser
对象,该对象与User
返回的User::login()
对象完全不同。 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
行为的猜测是正确的,那么这应该会产生您想要的结果。