7

この奇妙なエラーが発生します。あなたは言うでしょう:「なぜ奇妙なのですか?あなたはそのような財産を持っていないだけです」。いいえ。問題はプロパティがあることです。

エラーが発生しました。

// 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

4

2 に答える 2

5

未定義のプロパティがにあると書かれているのでstdClass、これは問題のオブジェクトが実際にはUserあなたが思っているクラスではないことを意味します。

これは通常、オブジェクトの作成で問題が発生したことを意味します。したがって、このエラーの原因となるコードの実際のバグは、指定したコード行よりもプログラムの早い段階にあります。

オブジェクトが作成されている場所を探します。ここで問題が発生する可能性があります。

残りのコードを見ずにそれ以上の助けになることはできませんが、それが役立つことを願っています。

[編集]

エラーをスローしているオブジェクトは次のとおりです(これは、プロパティ$this->session->userにアクセスしようとしているオブジェクトです)。->roles

あなたがそれが間違いなくオブジェクトであると言いたいのと同じくらいUser、事実はPHPがそうではないと言っているということです。エラーのvar_dump($this->session->user)直前に実行すると、私が言っていることがわかるはずです。

どうしてそれがあなたの期待通りではないのかというと、私はまだこれ以上の答えを出すことはできません。xDebugなどのデバッガーを使用して、一度に1行ずつプログラムをトレースすると役立つ場合があります。

于 2012-10-07T19:35:29.210 に答える
2

明らかな説明は、プロパティが定義されているが、保護されているということです。これは、このクラスと拡張クラスにのみアクセスできることを意味します。

ただし、エラーメッセージは他のエラーを示唆しています。クラスはUserクラスですが、エラーはそれがのプロパティであることを示唆していますstdClass

于 2012-10-07T19:33:51.803 に答える