Вопрос: Как работать с PDO внутри класса?

Лучший ответ: Не нужно осваивать всё сразу.  У тебя не будет работать тоже все сразу. И ты не будешь знать, что именно.Всегда надо решать только одну задачу за раз
А у тебя тут и ООП, и ПДО, а неймспейсы ,и автолоад, и ни одну из этих вещей ты не понимаешь. 
Собрался писать класс для работы с БД? Отлично, пиши класс для работы с БД. БЕЗ неймспейсов и автолоадов. Не переломишься, добавишь один инклюд. Но зато хотя бы не будешь бегать по коду и искать, в каком из 10 мест у тебя ошибка.Только после того, как класс у тебя за заработает, добавляешь неймспейсы. И мучаешься уже с ними.
После того как заработает с неймспейсами, осваиваешь автолоад.
Свой велосипед, чтобы он был хоть на что-то годен и добавлял хоть что-то к оригинальному ПДО, переписываешь такclass DB
{
    public $pdo;

    public function __construct() {
        $host = "localhost";
        $user = "root";
        $password = "";
        $dbname = "dbtest";
        $charset = "utf8";
        
        $dsn = "mysql:host=$host;dbname=$dbname;charset=$charset";
        $this->opt = [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => FALSE
        ];
        $this->pdo = new PDO($dsn, $user, $password, $opt);
    }
    
    public function query($sql, $args = NULL)
    {
        if (!$args)
        {
             return $this->pdo->query($sql);
        }
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($args);
        return $stmt;
    }
    public function __destruct() {
        $pdo = NULL;
    }
}
Объяснения по коду (на английском) - Детские болезни моего первого класса для работы с БД
Дальше.
Класс  Settings не должен наследовать классу БД. Это совершенно разные сущности. Класс человек не должен наследовать классу Карман только потому что у всех людей есть карманы обычно. 
Если человеку нужен карман, то карман передается в конструктор добавляется в свойства класса. Поэтомусlass Settings {
    public function __construct($db) {
        this->db = $db;
    }
    public function getSiteName() {
        $stmt = $this->db->query("SELECT Value FROM configs WHERE Name = 'SiteName'");
        return $stmt->fetchColumn();
    }
}

Худший ответ: У вас внутри конструктора есть вот эта строчка:$pdo = new PDO($this->dsn, $this->user, $this->password, $this->opt);
Здесь создаётся переменная $pdo находящаяся исключительно в скоупе самого конструктора и после того как завершается его выполнение, сборщик мусора уничтожает объект, который вы создали.
В методе SELECT:public function SELECT($Query) {
        $stmt = $pdo->query("$Query");
    }
Вы обращаетесь к переменной, которая как бы существует только в скоупе этого метода (на самом деле, её  нет). Естественно, что ничего не работает.
Вам нужно:Создать свойство, в котором будет храниться после инициализации в конструкторе объект PDO у вашего недоабстрактного класса DBВ методе SELECT обращаться к этому объекту как к $this->pdo (или как вы его назовёте)
Почитайте про скоупы переменных. А ещё про ООП и области видимости. И не лепите protected для всего, что под руку попадётся. Вполне вероятно, что в наследниках вам нужен доступ только к SELECT(), а свойство содержащее объект PDO и остальные не нужны. В этом плане можете ещё про deffensive programming (пример).
P.S. Вам, кстати, эта толпа свойств dsn, user, password, opt и прочие, скорее всего не нужны после инициализации PDO. Вполне вероятно, что можно их не сохранять вообще.