Не нужно осваивать всё сразу. У тебя не будет работать тоже все сразу. И ты не будешь знать, что именно.
Всегда надо решать только одну задачу за раз
А у тебя тут и ООП, и ПДО, а неймспейсы ,и автолоад, и ни одну из этих вещей ты не понимаешь.
Собрался писать класс для работы с БД?
Отлично, пиши класс для работы с БД.
БЕЗ неймспейсов и автолоадов. Не переломишься, добавишь один инклюд. Но зато хотя бы не будешь бегать по коду и искать, в каком из 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();
}
}