2012-01-23 5 views
0

В разработке веб-сайта я столкнулся с этой проблемой. Я хочу передать объект в класс, а потом я хотел бы использовать его методы. Вот что я пытаюсь сделать:Использование переданных объектов в 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; 
    }  
} 
+0

На первый взгляд вы должны установить его в конструкторе, а не в своем собственном методе, я посмотрю на него за секунду. –

+1

лучше использовать 'public function setTheme (Theme $ theme)' – powtac

+0

Это ваш фактический код? Выглядит слишком сильно, как пример/пример, а сообщение об ошибке принадлежит другому. – mario

ответ

1

Ваш подход отлично работает в следующем коде:

$theme = new Theme(); 
$header = new Header(); 
$header->setTheme($theme); 
$header->build(); 

class Header { 
    private $theme; 

    public function setTheme($theme){ 
     $this->theme = $theme; 
    } 

    public function build(){ 
     $this->view = $this->theme->getHeader(); 
    } 
} 

class Theme { 
    public function getHeader() { 
     echo 'yes'; 
    } 
} 

Может быть, есть еще что-то мешает ему работать?

EDIT

Беглый место, вы неправильно набранный конструкция:

public function __constuct($login, $db, $theme){ 
    $this->login = $login; 
    $this->db = $db; 
    $this->theme = $theme; 
} 

EDIT2 Я нашел свою ошибку:

Когда new HeaderBuilder() вызывается:

$header = new HeaderBuilder($this->login, $this->db); 

$this->build(); запускается на выполнение в вашем AbstractBuilder:

public function __construct($login, $db){ 
    $this->login = $login; 
    $this->db = $db; 
    $this->build(); 
} 

Что указывает на

public function build(){ 
    $this->view = $this->theme->getHeader(); 
} 

В вашем HeaderBuilder .. НО! Это $ this-> build(); вызывается перед вызовом $ header-> setTheme(), поэтому переменная $ theme в HeaderBuilder пуста. Комментируя, что строка $ this-> view = ... заставляет код работать снова.

+0

Я обновил код ... –

+0

Я редактировал выше. –

+0

Я все еще получаю ошибку. –

Смежные вопросы