Что я делаю неправильно?
Что я делаю неправильно?
Всё.Он ведь возвращает : new mysqli(
В сообщении об ошибке нигде не говорится про то, что "он" возвращает. Сообщение об ошибке говорит тебе человеческим голосом что у класса DB нет метода query(). И если ты посмотришь код класса в своем вопросе, то в нем действительно нет такого метода. А ты можешь вызывать только существующий методы у класса, что бы там кто не возвращал. 
Хуже того, даже если ты заставишь свой класс выполянять запросы, он будет создавать миллион соединений с БД.
Потому что в отличие от mysql_connect, каждое обращение к new mysqli создает новое соединение. И тебе самом надо заботиться о том, чтобы соединение с БД юыло только одно. А не создавалось каждый раз, когда ты напишешь $db=new DB();. Фв тф это собираешься похоже писать в каждом методе каждого класса
Ну и то что в DB используется mysqli а не PDO означает что у тебя весь код будет в SQL инъекциях.
Правильный способ будет создать сначала экземпляр класса PDO,  и потом при создании каждого объекта, которому нужна работа с БД, и  передавать его в конструктор.PDO создаем как написано здесь, это код помещаем в файл, чтобы потом инклюдить где нужно.class Categories
{
    public function __construct($db){
        $this->db = $db;
    }
    public function getCategories()
    {
        $query="SELECT * FROM categories";
        return $this->db->query($query)->fetchAll();
    }
}
и потом что-то вродеinclude 'pdo.php';
$category = new Categories($pdo);
$list = $category->getCategories();
Ретурн в конструкторе не работает. Всегда возвышается инстанс обьекта