Я хотел бы использовать внедрение зависимостей, чтобы указать имя таблицы и допустимые столбцы для класса объекта данных. Мой план — сделать что-то вроде:
class DatabaseTable implements DatabaseTableInterface {
protected $_table_name;
protected $_columns;
public function __construct($table_name, $columns){
$this->_table_name = $table_name;
$this->_columns = $columns;
}
public function addColumn($new_column) {
...
}
public function getColumns() {
...
}
...
}
class UserObject implements UserObjectInterface {
protected $_table; // Should be a DatabaseTable object
public function __construct($table){
$this->_table = $table; // Inject a DatabaseTable object here
}
// Set the value of a particular property of this User
public function setValue($column, $value){
// Only allow if the column is present in the list of permissible columns in the DatabaseTable object
...
}
}
Который может быть использован, например:
// Initial table parameters
$user_table = new DatabaseTable("user", ["id", "name", "email"]);
// Create a new user object
$user = new User($user_table);
addColumn
Метод в основном добавляет столбец в белый список для конкретной таблицы. Для нескольких типов объектов данных может потребоваться доступ к одной и той же таблице, поэтому я делю это на отдельный класс. Кроме того, должна быть возможность динамически добавлять столбцы в белый список в любое время, даже после создания конкретного объекта:
// This is OK
$user->setValue("name", "Alex");
// This is not OK (yet)
$user->setValue("marbles", 0);
// Add "marbles" column to the whitelist
$user_table->addColumn("marbles");
// Now it is OK!
$user->setValue("marbles", 0);
Я знаю, что в PHP5 это будет работать, потому что объекты назначаются по «ссылке». Но нарушаю ли я какие-либо принципы проектирования, позволяя изменить зависимость после введения в ее зависимую часть?
Задача ещё не решена.
Других решений пока нет …