Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Wywołanie klasy w konstruktorze
Forum PHP.pl > Forum > Przedszkole
etup
Dlaczego ten kod wyświetla taki komunikat:

Cytat
Catchable fatal error: Argument 1 passed to Theme::__construct() must be an instance of Config, none given, called in /var/www/index.php on line 8 and defined in /var/www/theme.php on line 7


index.php

  1. include_once 'config.php';
  2. include_once 'theme.php';
  3.  
  4. $test = new Theme;
  5. echo $test-> show();


theme.php

  1. class Theme
  2. {
  3. private $db;
  4.  
  5. public function __construct(Config $db)
  6. {
  7. $this->db = $db;
  8. }
  9.  
  10. public function show()
  11. {
  12. return $this->db;
  13. }
  14. }


config.php

  1. class Config
  2. {
  3. public $host;
  4. private $user;
  5. private $pswd;
  6. private $baza;
  7.  
  8.  
  9. public function __construct()
  10. {
  11. $this->host = 'host';
  12. $this->user = 'user';
  13. $this->pswd = 'password';
  14. $this->baza = 'baza';
  15. }
  16.  
  17. }


Jak to naprawić?
CTRL
Czy nie chodzi o to, że np. private $db; jest tylko w Theme, a w configu takiej zmiennej nie ma?
nospor
Przecież masz wyraźnie napisane: theme należy wywołać z parametrem a ty wywołujesz bez
MA byc:
$test = new Theme(TU OBIEKT KLASY Config);
etup
Nie rozumiem. Chciałbym aby w klasie theme były dostępne dane Configu, to się chyba centralizacja nazywa... Po co mam wywoływać obiekt klasy config w obiekcie klasy theme? Chciałbym aby przy wywołaniu klasy theme, były już widoczne dane klasy config. Czyli po co jest opcja wywołania klasy w konstruktorze?
krzywy36
żeby Config był dostępny w Theme musisz go tam przekazać, np. poprzez konstruktor klasy Theme (tak to robisz w tym kodzie), z tym, że, żeby to zadziałało, musisz przekazać obiekt klasy Config przy tworzeniu obiektu klasy Theme czyli zamiast:
  1. $test = new Theme;
  2. echo $test-> show();

zrób
  1. $config = new Config;
  2. $test = new Theme($config);
  3. echo $test-> show();
peter13135
jak masz funkcję typu :

  1. function mojaSuperFunkcja($parametr)
  2. {
  3. return $parametr*2;
  4. }


to ją wywołujesz np. tak :
  1. mojaSuperFunkcja(7);


jak wywołasz ją tak :
  1. mojaSuperFunkcja();

to będzie błąd.

Czy to jest dla Ciebie zrozumiałe ?
Jeśli tak, to zauważ, że masz podobną sytuację u siebie smile.gif


Pozatym (tak już poza tym problemem) wydaje mi się, że warto taki "sterownik bazy" trzymać w singletonie, żeby się nie łączyć kilka razy z bazą i mieć dostęp do bazy w każdym miejscu skryptu.
thek
Peter... Albo raz utworzyć połączenie i potem obiekt połączenia wstrzykiwać gdzie jest potrzebny.
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.