DBAL в Doctrine имеет реализацию шаблона Visitor.
Есть интерфейс с несколькими методами accept.
interface Visitor
{
/**
* @return void
*/
public function acceptSchema(Schema $schema);
/**
* @return void
*/
public function acceptTable(Table $table);
public function acceptForeignKey(Table $localTable, ForeignKeyConstraint $fkConstraint)
{
}
}
И некоторые классы, такие как
class Schema
{
/**
* @return void
*/
public function visit(Visitor $visitor)
{
$visitor->acceptSchema($this);
if ($visitor instanceof NamespaceVisitor) {
foreach ($this->namespaces as $namespace) {
$visitor->acceptNamespace($namespace);
}
}
foreach ($this->_tables as $table) {
$table->visit($visitor);
}
foreach ($this->_sequences as $sequence) {
$sequence->visit($visitor);
}
}
}
Почему метод Schema::visit
имеет параметр с именем $visitor
?
Во всех определениях Visitor говорится, что именно Visitor
должен иметь метод visit
. Так что accept
метод должен быть внутри Visitable
Так есть ли некоторые проблемы с именами Schema::visit($visitor)
? DBAL\Visitor
на самом деле Visitable
? Если это так, почему Visitor::accept
не вызывает $ schema-> visit ($ this)?
Некоторая реализация Dbal\Visitor
выглядит как
/**
* {@inheritdoc}
*/
public function acceptSequence(Sequence $sequence)
{
$this->sequences->attach($sequence);
}
Не обязательно ли звонить $visitor->visit($this)
внутри Visitable::accept()
?