【问题标题】:PHP object properties are null after instantiationPHP 对象属性在实例化后为空
【发布时间】:2013-03-13 21:38:05
【问题描述】:

这就是让我的大脑受伤的原因。首先,我知道足够的 php 在大约 5 分钟内解释它。然而,我相当精通面向对象的编程。情况:

我正在尝试构建一个 php 应用程序以用作唯一的 Intranet 工具。我的想法是将当前用户保存在会话中。我为我的数据库用户表创建了一个 PHP 模型。在代码中,我正在对用户进行身份验证,如果用户进行了身份验证,那么我将创建一个 User 对象并将其保存在会话中。问题是创建了 User 对象,但所有属性都为空。我在这里和 php net 上研究了一些答案,并尝试了几件事,但问题仍然存在。我不认为它与 php 相关,我绝对认为这是我做错了,但就是不能指望它。这是登录脚本中的相关代码示例。要到达这里,必须验证密码,变量$users 是从我的数据库控制器中的函数直接返回的。由于变量包含在var_dump 中,因此可能不需要返回该变量的代码。我尝试将相关的数组元素分别传递给构造函数,我尝试传递完整的数组,我使用了serializeunserialize。我尝试使用 $this->property = $someValue 设置它们。

if ($hash) {
    $current_user = new User($users);
    $_SESSION['current_user'] = serialize($current_user); 
    $current_user = unserialize($_SESSION['current_user']);
    var_dump(session_id());
    var_dump($users);
    var_dump($current_user);
    var_dump($_SESSION['current_user']);
}

这是我的构造函数:

class User {
public $userid;
public $fname;
public $lname;
public $email;
public $username;
public $function;
public $d_joined;
public $is_internal;
public $is_active;

function __costruct() {
    $arguments = func_get_args();
    if (!empty($arguments)) {
        foreach ($arguments[0] as $key => $property) {
            if ($property_exists($this, $key)) {
                $this -> {$key} = $property;
            }
        }
    } 
}

我尝试过_<em>construct($args)</em>_construct(array($args)),但没有任何尝试。这是var_dump() 调用的输出

string 'cgotecrpu7soqvepoimjo2s116' (length=26)

array (size=1)
0 => 
array (size=20)
  'userid' => string '1' (length=1)
  0 => string '1' (length=1)
  'fname' => string 'First Name' (length=4)
  1 => string 'First Name' (length=4)
  'lname' => string 'Last Name' (length=8)
  2 => string 'Last Name' (length=8)
  'email' => string 'email address' (length=21)
  3 => string 'email address' (length=21)
  'username' => string 'username' (length=9)
  4 => string 'username' (length=9)
  'password' => string 'hashed password:salt' (length=65)
  5 => string 'hashed password:salt' (length=65)
  'function' => string '4' (length=1)
  6 => string '4' (length=1)
  'd_joined' => string '2013-01-14' (length=10)
  7 => string '2013-01-14' (length=10)
  'is_internal' => string '1' (length=1)
  8 => string '1' (length=1)
  'is_active' => string '1' (length=1)
  9 => string '1' (length=1)

object(User)[2]
public 'userid' => null
public 'fname' => null
public 'lname' => null
public 'email' => null
public 'username' => null
public 'function' => null
public 'd_joined' => null
public 'is_internal' => null
public 'is_active' => null

string 'O:4:"User":9{
s:6:"userid";N;
s:5:"fname";N;
s:5:"lname";N;
s:5:"email";N;
s:8:"username";N;
s:8:"function";N;
s:8:"d_joined";N;
s:11:"is_internal";N;
s:9:"is_active";N;}' (length=162)

所以据我所知,初始数组$users 具有正确的数据。 User 对象在变量 $current_user 中创建。但是,当我尝试访问对象属性时,我收到有关从非对象访问对象属性的错误。看起来会话变量不是对象,但 $current_user 是,即使它具有空属性。有人可以指出我正确的方向吗?谢谢。

【问题讨论】:

  • 注意函数是__construct(),而不是__costruct()_construct...并且不要在会话中序列化对象,除非您出于某种原因更喜欢在上课前调用session_start()定义是在没有自动加载的情况下加载的。它会在会话中保存时序列化,无需执行两次。
  • 没有查看您的所有代码,但您是否尝试在序列化/反序列化之前查看$_SESSION['current_user']$current_user 的值?
  • 您的构造函数旨在解析传递给对象实例化的多个变量,同时您将单个(数组?)值传递给您的类。我觉得有问题。

标签: php web-applications session-variables


【解决方案1】:

你的构造函数看起来不对你想做的事情,我认为你应该这样做:

 /**
 * Constructor set each public values with the ones passed from the passed array
 * @param array $userDatas Array containing the user datas
 */
function __construct($userDatas) {
    foreach($userDatas as $key => $value) {
        if (property_exists($this, $key)) {
            $this->$key = $value;
        }

    }
}

【讨论】:

  • 这成功了。首先,我担心拼写错误是问题所在,但它在我的代码中拼写正确,“n”一定是我匆忙尝试将其格式化并发布并在刚开始时离开办公室的牺牲品很好。
猜你喜欢
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 2020-12-27
  • 1970-01-01
  • 2012-05-15
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多