«Замечание 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->session – объект User

 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() всем объектам осуществляется с помощью магии __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 .

Solutions Collecting From Web of "«Замечание PHP: неопределенное свойство»"

Поскольку он говорит, что неопределенное свойство находится в stdClass , это означает, что рассматриваемый объект не является фактически классом User который вы так считаете.

Это обычно подразумевает, что что-то пошло не так с созданием объекта. Таким образом, фактическая ошибка в коде, которая ведет к этой ошибке, ранее была в программе, чем строка кода, которую вы нам дали.

Найдите, где объект создается. Вот в чем проблема, вероятно, будет.

Я не могу больше помогать, чем это, не видя остальной части кода, но надеюсь, что это поможет.

[РЕДАКТИРОВАТЬ]

Объект, который выбрасывает ошибку, – это $this->session->user (это тот, к $this->session->user вы пытаетесь получить доступ к свойству – $this->session->user for).

Насколько вы хотите сказать, что это определенно объект User , факт заключается в том, что PHP говорит иначе. Сделайте var_dump($this->session->user) непосредственно перед ошибкой, и вы сможете увидеть, что я говорю.

Что касается того, почему это не то, что вы ожидаете, я все равно не могу дать лучшего ответа. Использование отладчика, такого как xDebug, для отслеживания программы может помочь одна строка за раз.

Очевидным объяснением будет то, что свойство определено, но защищено. Это означает, что он доступен только для этого и расширенных классов.

Однако сообщение об ошибке указывает на некоторую другую ошибку. Класс является классом User , но ошибка предполагает, что это свойство stdClass .