При разработке сайта я столкнулся с этой проблемой. Я хочу передать объект в класс, а потом я бы хотел использовать его методы. Вот что я пытаюсь сделать:
[обновленный код ниже]
Сначала я создаю новую тему и заголовок. Затем я хотел бы использовать только что созданную $ theme в своем классе Header. Так что мне нужно это пройти. Я хочу использовать один и тот же экземпляр $ theme в нескольких классах, поэтому не могу создать новый. Также я бы хотел не использовать синглтон.
С моим текущим кодом я получаю эту ошибку:
Fatal error: Call to a member function getHeader() on a non-object in...
Мои вопросы:
- Будет ли этот подход работать или он совершенно неправильный?
- Как я могу передать объект другому объекту, а затем использовать его методы?
- Может быть, лучше использовать синглтон и использовать Theme :: getInstance (); использовать его в другом классе?
[править]
Более подробный код:
$theme = new Theme($db);
$builder = new Builder($login, $db, $theme);
$builder->build();
Builder.php:
class Builder {
private $login;
private $db;
private $theme;
public function __construct($login, $db, $theme){
$this->login = $login;
$this->db = $db;
$this->theme = $theme;
}
public function build(){
$this->buildHeader();
$this->buildContent();
$this->buildFooter();
}
public function buildHeader(){
$header = new HeaderBuilder($this->login, $this->db);
$header->setTheme($this->theme);
$header->render();
}
public function buildContent(){}
public function buildFooter(){}
}
Абстрактный класс строителя:
abstract class AbstractBuilder {
private $variable = array();
private $login;
private $db;
private $view;
abstract function build();
public function __construct($login, $db){
$this->login = $login;
$this->db = $db;
$this->build();
}
public function render(){
extract($this->variable);
include($this->view);
}
}
HeaderBuilder:
class HeaderBuilder extends AbstractBuilder {
private $theme;
public function build(){
$this->view = $this->theme->getHeader();
}
public function setTheme($theme){
$this->theme = $theme;
}
}