Использование переданных объектов в PHP5 - PullRequest
0 голосов
/ 23 января 2012

При разработке сайта я столкнулся с этой проблемой. Я хочу передать объект в класс, а потом я бы хотел использовать его методы. Вот что я пытаюсь сделать:

[обновленный код ниже]

Сначала я создаю новую тему и заголовок. Затем я хотел бы использовать только что созданную $ 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;
    }       
}

1 Ответ

1 голос
/ 23 января 2012

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

$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';
    }
}

Возможно, что-то еще мешает его работе?

РЕДАКТИРОВАТЬ

Вкратце, вы набрали неверную конструкцию:

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 = ... заставляет код снова работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...