В моем классе мы создали простое приложение с использованием MVC с шаблоном наблюдателя в Java и оно работает. Представление не может вызывать любые методы из модели, которые не входят в интерфейс (Observable) и наоборот.OO, MVC и шаблон наблюдателя работают не так, как ожидалось
Я довольно поклонник PHP и решил сделать тот же (упрощенный) пример в PHP. Я заметил, что, хотя я использую интерфейс и передаю ссылку модели в качестве интерфейса, вид все равно может вызвать каждый метод внутри модели, делая весь рисунок бесполезным.
Есть ли что-то, что я забыл или это невозможно в PHP?
РНР код (каждая ссылка, метод и т.д. точно такой же, как и в приложении Java):
class App
{
public function __construct()
{
$model = new Model();
$controller = new Controller($model);
}
}
class Model implements Observable
{
private $view;
private $count = 1;
public function __construct()
{
echo 'Model created. <br>';
}
public function registrate(Observer $view)
{
$this->view = $view;
echo 'Model: view is registered. <br>';
}
public function addOne()
{
$this->count += 1;
$this->view->modelChanged($this);
}
public function getCounter()
{
return $this->count;
}
public function getMessage()
{
return 'The view should not be able to call this method.';
}
}
class Controller
{
private $view;
private $model;
public function __construct(Model $model)
{
echo 'Controller created. <br>';
$this->model = $model;
$this->view = new View($this->model);
$this->model->addOne();
}
}
class View implements Observer
{
public function __construct(Observable $model)
{
echo 'View created. <br>';
$model->registrate($this);
}
public function modelChanged(Observable $model)
{
// Should only be able to call method "getCounter()"
echo $model->getMessage();
}
}
interface Observable
{
public function registrate(Observer $view);
public function getCounter();
}
interface Observer
{
public function modelChanged(Observable $model);
}
Выход, если вы запустите это: создается
модели.
Контроллер создан.
Открыть создано.
Модель: вид зарегистрирован.
Вид не должен называть этот метод. Как вы можете видеть, представление может вызывать метод модели, который не, объявленный внутри интерфейса Observable.
Как это возможно и почему это не работает на PHP, как в Java?
Этот вопрос кажется более подходящим для [codereview] (http://codereview.stackexchange.com/), разместите его там, вы, скорее всего, получите исчерпывающий ответ, объясняющий возможные недостатки в вашем дизайне, некоторые советы и ссылки на полезные ресурсы –
@EliasVanOotegem кажется, что что-то не так с кодом 'view не должно быть в состоянии вызвать этот метод'. В последнем предложении спрашивается, почему он не работает так, как предполагалось. это вне темы на CR – Malachi
@Malachi: Это не столько проблема с кодом, сколько в случае путаницы. OP ожидает, что интерфейсные подсказки заставят PHP вести себя так же, как Java.Простой факт заключается в том, что PHP не является Java, что бы тщательно проанализировал код, наряду с предоставлением альтернативных предложений и поддержкой тех, с документацией. Это пограничная линия вне темы на CR, так же, как она есть здесь: это не проблема, связанная с кодом, более «понимание того, как язык X отличается от языка Y» _ question –