«Уведомление PHP: неопределенное свойство» [закрыто]

Я получаю эту странную ошибку. Вы скажете: «Почему странно? У вас просто нет такого свойства. Проблема естьare имущество.

Там я получаю сообщение об ошибке.

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

Так что этот методis вызывается, когда я пытаюсь получить доступ к свойству в этой строке. Все работает нормально, но я не хочу увеличивать мой журнал ошибок. Что происходит?

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()

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"
    }
  }
}
Explanation

В одном месте я случайно написал$this->session->user->id = $user->id в месте, где$this->session->user еще не создан. Такnull->id на самом деле был(new stdClass())->id, Что ж,thank you, PHP.

 Michael Berkowski07 окт. 2012 г., 21:29
Ваше сообщение об ошибке указывает на то, что$this->session->user являетсяNOT User возражать хотя. Это общийstdClass объект, который не имеет$roles имущество. Разместите код где$this->session->user установлено ...
 efpies07 окт. 2012 г., 21:45
@MichaelBerkowski Взгляните на upd1 и upd2.
 hakre07 окт. 2012 г., 22:05
@efpies: установите XDebug, используйте совместимый редактор / IDE, запустите эту строку иlook inside on your own, В SO мы можем проводить статический анализ кода только с небольшими порциями кода, которые вы предоставляете peu-a-peu, как будто у вас есть секрет, который нужно скрыть (и ваши совершенно плохие, разглагольствования, неконструктивные описания), ничего больше и ничего Меньше.
 Michael Berkowski07 окт. 2012 г., 21:31
Во-вторых,User::$roles являетсяprotectedтак что вы не сможете получить к нему доступ через$something->user->roles, Это было бы точкойUser::getRoles() метод.
 Eric07 окт. 2012 г., 21:29
Как$this->session->user создан? PHP распознает это какstdClass объект, а неUser объект.

Ответы на вопрос(2)

Решение Вопроса

stdClassэто означает, что рассматриваемый объект на самом деле неUser класс, который вы думаете, что это.

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

Ищите, где объект создается. Вот где проблема, скорее всего, будет.

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

[EDIT]

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

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

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

 07 окт. 2012 г., 22:07
@efpies - и что происходит со строки непосредственно перед строкой с ошибкой? В этом случае я бы предложил проверитьisLoggedIn() функция; это может быть что-то неожиданное для объекта пользователя. Может быть, превратить ваше троичное состояние в стандартif else заблокировать и добавитьvar_dump внутри него.
 efpies07 окт. 2012 г., 21:56
В upd3 я выложилvar_dump, Это говорит о том, что этоUser объект.
 07 окт. 2012 г., 21:51
@efpies - re UPD1 Вы говорите, что этоUser объект, но PHP говорит, что этоstdClass это выбрасывает ошибку. Где-то вдоль линии вы не получаете доступ к объекту, который, по вашему мнению, вы есть. Смотрите мое редактирование.
 efpies07 окт. 2012 г., 22:14
Нет,isLoggedIn() только проверяет куки. Такvar_dump послеisLoggedIn() печатает ту же информацию. Я сейчас пытаюсь использовать отладчик ...
 efpies07 окт. 2012 г., 21:37
Посмотрите на upd1 плз.

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

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

 efpies07 окт. 2012 г., 21:40
Все свойства доступны через магию__get() метод. Так что даже если этоprotected, оно работает. И метод вызывается, когда я к нему обращаюсь.
 efpies07 окт. 2012 г., 21:52
И что? Вы опубликовали свой ответ, а я обновлял свой вопрос для других комментариев. Поэтому я уведомил вас об этом. В чем проблема? Все свойства в моем кодеprotected но других ошибок нет. А такжеget_class($this->session->user) возвращаетсяUser.
 07 окт. 2012 г., 21:45
-1: Вы отредактировали свой вопрос после того, как я дал свой ответ. Но мой ответ остается в силе

Ваш ответ на вопрос