Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对象未按预期的PHP OOP启动_Php_Oop_Design Patterns_Web - Fatal编程技术网

对象未按预期的PHP OOP启动

对象未按预期的PHP OOP启动,php,oop,design-patterns,web,Php,Oop,Design Patterns,Web,一般来说,我对php和OOP都是新手,所以我决定将我现有的站点改为oo php站点,以获得一些经验。 这是我目前面临的问题 我有一个类Normaluser,它是从User扩展而来的。用户类中有一个login方法,它返回一个包含用户类属性数组的对象 class NormalUser extends User { public function __construct($loginarray){ $email = $loginarray['email']; $pass = $log

一般来说,我对php和OOP都是新手,所以我决定将我现有的站点改为oo php站点,以获得一些经验。 这是我目前面临的问题

我有一个类Normaluser,它是从User扩展而来的。用户类中有一个login方法,它返回一个包含用户类属性数组的对象

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_转储(如上所述)时,我得到

我认为调用
$userstart
作为一个新的NormalUser对象将返回正确的变量,但是当我进行var_转储(如上所述)时,我会收到以下信息:

object(NormalUser)#5 (4) { ["user_id"]=> NULL ["first_name"]=> NULL ["last_name"]=> NULL ["user_level"]=> NULL }
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\u by_sql
行为的猜测是正确的,那么应该会产生您想要的结果。

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

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

我有两个选择:

  • 或者创建一个返回NormalUser实例的静态方法(而不是使用构造函数):

  • 或者使用构造函数,但不返回对象实例,而是将其属性指定给
    $this
    实例:

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

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

    我有两个选择:

  • 或者创建一个返回NormalUser实例的静态方法(而不是使用构造函数):

  • 或者使用构造函数,但不返回对象实例,而是将其属性指定给
    $this
    实例:

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

  • parent::login
    的返回值不是
    NormalUser
    对象本身-可以显示
    User::login
    方法实现吗?@dcoder添加了登录方法
    parent::login
    的返回值不是
    NormalUser
    对象本身-可以显示
    User::login
    方法吗实现?@dcoder添加了您当时使用的登录方法。我必须在构造语句中指定类(Normaluser)变量(它是从用户登录方法中提取的)。我必须在construct语句中分配类(Normaluser)变量(它从用户登录方法中提取)
    function __construct($loginarray) {
      $email = $loginarray['email'];
      $pass = $loginarray['pass'];
      $temp = parent::login($email,$pass);
    
      $this->user_id = $temp->user_id;
      // etc...
    }