Примечание: только ссылки на переменные должны возвращаться по ссылке в PHP - PullRequest
1 голос
/ 04 августа 2020

Я назначаю свойство класса из базы данных следующим образом (Проверяет наличие сеанса go до этого, но это всего лишь назначение):

$stmt = DB::getInstance()->Prepare(
    'SELECT id, username, email FROM _users WHERE session = ?'
);

$stmt->execute(
    array( $this->session( 'oauth' ) )
);

$this->_user = $stmt->fetch( PDO::FETCH_OBJ );

Свойство $_user может быть изменено через другие части программы, поэтому его необходимо передать по ссылке:

public function &getUser() : Object { return $this->_user ?? (object) array('username' => 'Guest'); }

Проблема, с которой я сейчас сталкиваюсь, заключается в том, что когда я вызываю getUser для обновления свойств пользователя:

$request->getUser()->posts = array('example post'); // This is done on another class, sometimes there is no reason to load the users posts if the user is not visiting a page that needs that data

Я получаю это уведомление:

Notice: Only variable references should be returned by reference

Итак, чтобы go вперед и делать то, что он говорит (передать его по ссылке), я затем сохраняю $_user по ссылке следующим образом:

$this->_user =& $stmt->fetch( PDO::FETCH_OBJ );

Затем я получаю эту ошибку (в строке выше):

Uncaught Error: Typed property App\Http\Request::$_user must not be accessed before initialization

Есть идеи, как я могу подавить это предупреждение или почему оно появляется?

1 Ответ

1 голос
/ 04 августа 2020

Выражения присваивания всегда возвращают присвоенное значение.

Изменение:

public function &getUser() : Object { 
    return $this->_user ?? (object) array('username' => 'Guest'); 
}

Кому:

public function &getUser() : Object { 
    $obj = (object) array('username' => 'Guest'); // <-----
    return $this->_user ?? $obj; 
}

путем присвоения объекта переменной и возврата этой переменной .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...