получить доступ к $ this в расширенном классе

Я следовал учебнику о программировании ООП. И я получил этот класс с именем User:

class User {

private $_db,
$_data,
$_sessionName,
$_isLoggedIn;

public function __construct($user = null) {

$this->_db = DB::getInstance();

$this->_sessionName = Config::get('session/session_name');

if (!$user) {

if (Session::exists($this->_sessionName)) {

$user = Session::get($this->_sessionName);

if ($this->find($user)) {

$this->_isLoggedIn = true;

} else {

// Process logout

}

}

} else {

$this->find($user);

}

}

public function update($fields = array(), $id = null) {

if (!$id && $this->isLoggedIn()) {

$id = $this->data()->id;

}

if (!$this->_db->update('users', $id, $fields)) {

throw new Exception('De gegevens konden niet gewijzigd worden');

}

}

public function create($fields = array()) {

if (!$this->_db->insert('users', $fields)) {

throw new Exception('Het account is niet aangemaakt');

}

}

public function find($user = null) {

if ($user) {

$field = (is_numeric($user)) ? 'id' : 'email';
$data = $this->_db->get('users', array($field, '=', $user));

if ($data->count()) {

$this->_data = $data->first();

return true;

}

}

}

public function login($email = null, $password = null) {

$user = $this->find($email);

if ($user) {

if ($this->data()->password === hash::make($password)) {

session::put($this->_sessionName, $this->data()->id);

return true;

}

}

return false;

}

public function logout() {

session::delete($this->_sessionName);

}

public function hasPermission($key) {

$group = $this->_db->get('user_role', array('id', '=', $this->data()->rank));

if ($group->count()) {

$permissions = json_decode($group->first()->permission, true);

if ($permissions[$key] == true) {

return true;

}

}

return false;

}

public function data() {

return $this->_data;

}

public function isLoggedIn() {

return $this->_isLoggedIn;

}

}

Каждый пользователь имеет различные быстрые ссылки, хранящиеся в базе данных. Я попытался расширить класс User с помощью класса Link следующим образом:

class Link extends User {

public static function getUserLinks($user) {

if ($user) {

$data = $this->_db->get('user_links', array('uid', '=', $user));

if ($data->count()) {

$this->_data = $data->results();

return $this->_data;

} else {

echo 'No matches found';

}

}

return false;

}

Но я получаю сообщение об ошибке:
Неустранимая ошибка: использование $ this, когда нет в контексте объекта в … в строке 153

Я думал, что при расширении класса я могу получить доступ ко всем деталям родителей?

Что я делаю неправильно? Кроме того, моя логика верна class Link extends User?

Спасибо за помощь.

1

Решение

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

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

class Link extends User {

public static $instance;

public function __construct() {
parent::__construct();
self::$instance = $this;
}

public static function getUserLinks($user) {

if (self::$instance instanceof Link && $user) {

$data = self::$instance->_db->get('user_links', array('uid', '=', $user));

if ($data->count()) {

self::$instance->_data = $data->results();

return self::$instance->_data;

} else {

echo 'No matches found';

}

}

return false;

}
}
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]