“PHP通知:未定义的属性”

时间:2012-10-07 19:27:01

标签: php

我收到了这个奇怪的错误。你会说:“为什么这么奇怪?你只是没有这样的财产”。不。问题是属性。

我收到了一个错误。

// PHP Notice:  Undefined property: stdClass::$roles in
$canWrite = $this->session->isLoggedIn() ? $this->page->canWrite($this->session->user->roles) : false;

这是班级。

class User {
    protected $roles;

    function getRoles() {
        if (!$this->roles)
        {
            // Get them!
        }

        return $this->roles;
    }
}

因此,当我尝试访问此行中的属性时,此方法调用。一切正常但我不想增加我的错误日志。发生了什么事?

UPD1

$this->user->sessionUser对象

function getUser() {
    if (!$this->user) {
        $u = new User();
                    // Logic
        $this->user = $u;
    }
    return $this->user;
}
User Object
(
    [roleId:protected] => 1
    [roles:protected] => Array
        (
            [root] => Role Object
                (
                    [id:protected] => 1
                    [hrefname:protected] => root
                )

        )
)

UPD2

通过魔术__get()

访问所有属性
public function __get($var) {
    if ($this->__isset($var)) {
        $method = 'get'.ucfirst($var);
        if (method_exists($this, $method)) {
            return $this->$method();
        } else {
            return $this->$var;
        }
    }
    throw new Exception("Unrecognized attribute '$name'");
}

UPD3

var_dump($this->session->user)

object(User)#370 (30) {
  ["roles":protected]=>
  array(1) {
    ["root"]=>
    object(Role)#372 (2) {
      ["id":protected]=>
      string(1) "1"
      ["hrefname":protected]=>
      string(4) "root"
    }
  }
}

解释

在某个地方,我不小心写了$this->session->user->id = $user->id,但尚未创建$this->session->user。所以null->id实际上是(new stdClass())->id。好吧,谢谢你,PHP

2 个答案:

答案 0 :(得分:5)

因为它说未定义的属性在stdClass中,这意味着有问题的对象实际上不是您认为的User类。

这通常意味着对象的创建出了问题。因此,导致此错误的代码中的实际错误在程序中比您给我们的代码行早。

查找对象的创建位置。这就是问题所在。

如果没有看到剩下的代码,我的帮助就不会那么多,但希望有所帮助。

<强> [编辑]

抛出错误的对象是$this->session->user(这是您尝试访问->roles属性的对象。)

尽管你想说它绝对是一个User对象,但事实是PHP却说不然。在错误发生之前立即执行var_dump($this->session->user),您应该能够看到我在说什么。

至于为什么不是你所期望的,我仍然无法给出任何更好的答案。使用xDebug之类的调试器一次一行地跟踪程序可能有所帮助。

答案 1 :(得分:2)

明显的解释是该属性已定义,但受到保护。这意味着它只能访问此类和扩展类。

但是,错误消息确实表明存在其他一些错误。该类是User类,但错误表明它是stdClass的属性。