【问题标题】:object not initiating as intended PHP OOP对象未按预期启动 PHP OOP
【发布时间】:2012-04-13 08:40:00
【问题描述】:

总的来说,我是 php 和 OOP 的新手,因此决定将我现有的网站转换为 oo php 网站以获得一些经验。 这是我目前面临的问题。

我有一个从 User 扩展而来的 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) 对象(用户)#8 (4)
{ ["user_id"]=> string(1) "1" ["first_name"]=> string(7) "Melanie" ["last_name"]=> string(6) "Janson" ["user_level"]=>字符串(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(如上所述)时,我会收到以下信息:

对象(普通用户)#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;
    }

}

【问题讨论】:

  • parent::login 的返回值不是NormalUser 对象本身——你能展示一下User::login 方法的实现吗?
  • @dcoder 已添加登录方式

标签: php oop design-patterns web


【解决方案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...
    }
    

【讨论】:

  • 你是正确的。我必须在构造语句(它从用户登录方法中提取)中分配类(Normaluser)变量
【解决方案2】:

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 行为的猜测是正确的,那应该会产生您想要的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-19
    • 2018-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-14
    • 2015-11-06
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多