Я хочу загрузить данные из базы данных (с помощью PDO) и поместить их в класс. Но это должно быть универсальным, поэтому я использую абстрактный класс, который будет делать все основные вещи. И каждый подкласс (1 для каждой таблицы базы данных) должен быть максимально сокращен.
В то же время я хочу сохранить контроль над общими свойствами и функциями.
<code>abstract class myTable {
protected static $table
protected static $classname
public function __construct($id) {
$pdo = new MyMagicPdoClass();
$sql = "SELCT * FROM ".self::$table." WHERE id = {$id}";
$stmt = pdo->prepare($sql);
$stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_CLASS, self::$classname);
// Here is my OBJECT in the CLASS-TYPE i want (POINT 1)
// Show evidence for testing:
echo "<pre>",print_r($result),"
";
}
}
Класс User расширяет myTable {
// для каждого доступного поля: property-name = column-name -> as PRIVATE
приватный $ id;
личное $ FirstName;
личное $ LastName;
приватная электронная почта $;
// избежать автоматического создания свойства (с помощью PDO :: FETCH_CLASS),
// использование метода __set () помогает отфильтровать все свойства.
// Только свойства (объявленные в этом классе), которые совпадают с именем столбца
// будет инициировано. Если этого не сделать, ВСЕ столбцы будут
// автоматически создается как свойство класса PUBLIC.
// Так что нет управления через Gettes и Setters.
публичная функция __set ($ name, $ value) {}
публичная функция __construct ($ id = null) {
self :: $ classname = __CLASS__; // будет использоваться в абстрактном классе
self :: $ table = "tblUser"; // будет использоваться в абстрактном классе
// вызываем конструктор родительского класса
Родитель :: __ конструкт ($ ID);
/ **
* Я думаю, ЗДЕСЬ ДОЛЖЕН БЫТЬ ВОЛШЕБНЫМ (ТОЧКА 2)
* /
}
// SETTERS
публичная функция setFirstName ($ value) {
$ this-> FirstName = $ value;
}
[...]
// ДЖЕТТЕРС
публичная функция getFirstName () {
вернуть $ this-> FirstName;
}
[...]
// НЕКОТОРЫЕ МЕТОДЫ
публичная функция doWhatOnlyThisClassShallDo () {...}
}
Пример использования
$id = 234;
$user = new User($id);
echo $user->FirstName; // shall be forbidden
echo $user->getFirstName(); // shall be used instead
echo $user->doWhatOnlyThisClassShallDo(); // shall be possible
В родительском конструкторе у меня есть ОБЪЕКТ, который я ищу в $result
. Теперь я хочу получить это как результат моего конструктора (см. Пункт 2) из подкласса.
Конечно, теперь я могу вручную загрузить каждое свойство в конструкторе по результату абстрактного класса, но, как написано выше, я хочу, чтобы каждый подкласс был максимально простым. Сверху это то, что все усилия с FETCH_CLASS бесполезны, так как я просто присваиваю значения свойствам в конструкторе подкласса.
Есть предложения? Или я использую неправильный подход?