Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Przekazywanie obiektów
Forum PHP.pl > Forum > Przedszkole
sannin
Witam,
mam problem z przekazaniem referencji obiektu. A mianowicie:

Klasa View:
  1. class View {
  2. private $mConfig = null;
  3. private $mSmarty = null;
  4.  
  5. /* konstruktor */
  6. public function __construct($pConfig) {
  7. /* ładowanie biblioteki */
  8. require_once('system/smarty/Smarty.class.php');
  9.  
  10. $this->mConfig = $pConfig;
  11. $this->mSmarty = new Smarty();
  12.  
  13. /* konfiguracja */
  14. $this->mSmarty->setTemplateDir('/application/views/');
  15. $this->mSmarty->setCompileDir('/application/smarty/compile/');
  16. $this->mSmarty->setConfigDir('/application/smarty/config/');
  17. $this->mSmarty->setCacheDir('/application/smarty/cache/');
  18.  
  19. $this->mSmarty->debugging = $this->mConfig->get('debugging');
  20. $this->mSmarty->caching = $this->mConfig->get('caching');
  21. $this->mSmarty->cache_lifetime = $this->mConfig->get('cache_lifetime');
  22. }
  23.  
  24. /* podstawianie wartości do klucza */
  25. public function assign($pKay, $pValue){
  26. $this->mSmarty->assign($pKey, $pValue);
  27. }
  28.  
  29. /* wyświtlanie widoku */
  30. public function display($pTemplateFile){
  31. $this->mSmarty->display('application/view/'.$pTemplateFile);
  32. }
  33. }


Klasa Controller:
  1. abstract class Controller {
  2. private $mView = null;
  3.  
  4. public function setView($pView){ $this->mView = $pView; }
  5. public function getView(){ return $this->mView; }
  6. }


Klasa Index:
  1. class Index extends Controller {
  2. public function index(){
  3. $this->getView()->assign('name', 'value');
  4. }
  5. }


I teraz wywołanie:
  1. include_once('system/core/Config.php');
  2. include_once('system/core/View.php');
  3.  
  4. $config = new Config();
  5. $view = new View($config);
  6.  
  7. $index = new Index();
  8. $index->setView($view);
  9.  
  10. $index->index();

Otrzymuje błąd: Fatal error: Call to a member function assign() on a non-object in D:\EasyPHP-12.1\www\falcon\application\controller\index.php on line 12
Czyli zmienna jest nie jest obiektem ?
Ta linia to: $this->getView()->assign('name', 'value');
Jeżeli użyje funkcji var_dump to wyświetla się NULL, a następnie info o obiekcie jakby istniał :/
Pierwszy raz pisze w PHP obiektowo zazwyczaj piszę w JAVA i C# więc może coś robię tak ?

Poproszę o jakieś rady smile.gif
b4rt3kk
Funkcja:

  1. public function getView(){ return $this->mView; }


jak sam widzisz zwraca tylko wartość mView.
sannin
No ok,
ale czy to nie jest referencja do obiektu ?

Kontroler wygląda tak:
  1. abstract class Controller {
  2. private $mView = null;
  3.  
  4. public function setView($pView){ $this->mView = $pView; }
  5. public function getView(){ return $this->mView; }
  6. }


A następnie działamy:
  1. $view = new View($config);
  2.  
  3. $index = new Index();
  4. $index->setView($view);


Więc jak na moje oko powinna zwracać ref do obiektu.
rocktech.pl
Witam.

Sprawa wygląd tak.

  1. class Index extends Controller {
  2. /**
  3.   * Metoda staje się konstruktorem tej klasy bo ma tą samą nazwę co klasa
  4.   * Zmień nazwę na np. renderIndex() i będzie ok ew. przekaż obiekt w konstruktorze po małej reorganizacji :)
  5.   */
  6. public function index(){
  7.  
  8. $this->getView()->assign('name', 'value');
  9.  
  10. }
  11.  
  12. }


Na przykładzie:

  1. //Tworzysz obiekt i wywołujesz konstruktor index()
  2. $index = new Index();
  3. //Tu dopiero setujesz widok
  4. $index->setView($view);
  5. //Tu widok już jest
  6. $index->index();


2 .Masz literówkę w metodzie assign

  1. public function assign($pKay, $pValue){ //powinno bć $pKey
  2.  
  3. $this->mSmarty->assign($pKey, $pValue);
  4.  
  5. }
sannin
O to właśnie chodziło, myślałem, że w PHP jedynie __construct jest konstruktorem.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.