@ygen

Получение информации из базы данных namespace?

Здравствуйте.
Недавно начал изучать ООП. В связи с чем возникла проблема. Не получается получить данные из пространства имени.
Получаю ошибку:

Fatal error: Using $this when not in object context

Вызываю из другого файла:
require_once 'classes/Auth.php';
require_once 'classes/functions.php';
echo Func\User::isAdmin('1');


namespace Func;

class User
{
    private $db_host = "localhost";
    private $db_name = "test";
    private $db_user = "root";
    private $db_pass = "root";
	
	
	public function connect($db_name, $db_user, $db_pass, $db_host = "localhost"){
		try { 
			$db = new \pdo("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
			} catch (\pdoexception $e) {
            echo "database error: " . $e->getmessage();
            die();
        }
        $this->db->query('set names utf8');

        return $this;		
	}
	
	public function __construct($username = null, $password = null)
    {
        $this->username = $username;
        $this->connectDb($this->db_name, $this->db_user, $this->db_pass, $this->db_host);
    }

    public function __destruct()
    {
        $this->db = null;
    }
	
	public function isAdmin($id) {
		/* проверка на админа */
		$query = "select id, username, status from users where id = :id limit 1";		

    $stm = $this->db->prepare($query);
    $stm->execute(array(
                    ':id' => $id
                )
            );
    $row = $stm->fetch(PDO::FETCH_ASSOC);
    if($row) {
        echo $row;
    } else {
        print_r($db->errorInfo());
    }
		
	return $result;
}
}
  • Вопрос задан
  • 231 просмотр
Решения вопроса 1
27cm
@27cm
TODO: Написать статус
Псевдо-переменная $this доступна в том случае, если метод был вызван в контексте объекта. $this является ссылкой на вызываемый объект.

php.net/manual/ru/language.oop5.basic.php

Объявление свойств и методов класса статическими позволяет обращаться к ним без создания экземпляра класса. <...> Так как статические методы вызываются без создания экземпляра класса, то псевдо-переменная $this не доступна внутри метода, объявленного статическим.

php.net/manual/ru/language.oop5.static.php

  1. Сделайте метод isAdmin() статическим и не используйте в нём $this.
  2. В конструкторе вызывается connectDb() вместо connect().
  3. В методе connect() подключение вы положили в переменную $db, а дальше обращаетесь к свойству $this->db, в котором ничего не лежит. Затем в методе isAdmin() такая же фигня: то $this->db, то $db.
  4. Хранить подключение к базе данных как часть класса пользователя - не правильно. В вашем случае подключение к БД будет создаваться для каждого экземпляра User.
  5. Так же вам будет полезно почитать и начать следовать: PSR-2: Coding Style Guide
  6. Чтобы не писать каждый раз require_once, когда вам понадобиться использовать в коде какой-либо класс, познакомьтесь с автозагрузкой классов PSR-4: Autoloader и менеджером зависимостей composer.
  7. Чтобы в будущем реже сходить с правильного пути — PHP: The Right Way.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы