Я получаю эту странную ошибку. Вы скажете: «Почему странно? У вас нет такой собственности». Нет. Проблема в том, что есть свойство.
Там я получаю сообщение об ошибке.
// 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; } }
Поэтому этот метод вызывается, когда я пытаюсь получить доступ к свойству в этой строке. Все работает нормально, но я не хочу увеличивать свой журнал ошибок. Что происходит?
$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 ) ) )
Доступ __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'"); }
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 .
Поскольку он говорит, что неопределенное свойство находится в stdClass
, это означает, что рассматриваемый объект не является фактически классом User
который вы так считаете.
Это обычно подразумевает, что что-то пошло не так с созданием объекта. Таким образом, фактическая ошибка в коде, которая ведет к этой ошибке, ранее была в программе, чем строка кода, которую вы нам дали.
Найдите, где объект создается. Вот в чем проблема, вероятно, будет.
Я не могу больше помогать, чем это, не видя остальной части кода, но надеюсь, что это поможет.
[РЕДАКТИРОВАТЬ]
Объект, который выбрасывает ошибку, – это $this->session->user
(это тот, к $this->session->user
вы пытаетесь получить доступ к свойству – $this->session->user
for).
Насколько вы хотите сказать, что это определенно объект User
, факт заключается в том, что PHP говорит иначе. Сделайте var_dump($this->session->user)
непосредственно перед ошибкой, и вы сможете увидеть, что я говорю.
Что касается того, почему это не то, что вы ожидаете, я все равно не могу дать лучшего ответа. Использование отладчика, такого как xDebug, для отслеживания программы может помочь одна строка за раз.
Очевидным объяснением будет то, что свойство определено, но защищено. Это означает, что он доступен только для этого и расширенных классов.
Однако сообщение об ошибке указывает на некоторую другую ошибку. Класс является классом User
, но ошибка предполагает, что это свойство stdClass
.