В разработке веб-сайта я столкнулся с этой проблемой. Я хочу передать объект в класс, а потом я хотел бы использовать его методы. Вот что я пытаюсь сделать:Использование переданных объектов в PHP5
[обновленный код ниже]
Сначала я создать новую тему и заголовок. Затем я хотел бы использовать только что созданную тему $ в классе Header. Поэтому мне нужно передать его. Я хочу использовать один и тот же экземпляр $ theme в нескольких классах, поэтому я не могу создать новый. Также я бы хотел избежать использования Singleton.
С моим текущим кодом я получаю эту ошибку:
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;
}
}
На первый взгляд вы должны установить его в конструкторе, а не в своем собственном методе, я посмотрю на него за секунду. –
лучше использовать 'public function setTheme (Theme $ theme)' – powtac
Это ваш фактический код? Выглядит слишком сильно, как пример/пример, а сообщение об ошибке принадлежит другому. – mario