Можно ли изменить зависимость после внедрения?

Я хотел бы использовать внедрение зависимостей, чтобы указать имя таблицы и допустимые столбцы для класса объекта данных. Мой план — сделать что-то вроде:

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 это будет работать, потому что объекты назначаются по «ссылке». Но нарушаю ли я какие-либо принципы проектирования, позволяя изменить зависимость после введения в ее зависимую часть?

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …