Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP5] Dostęp do obiektów z wnętrza klasy
Forum PHP.pl > Forum > Przedszkole
Tarcil
Witam

Raczkuję właściwie w obiektowym php i mam pewien problem.

Mam dwie klasy: mySqlEng() i sitePages(). Obydwie includuje na początku, pomiędzy instrukcjami include tworzę obiekt $sql=new mySqlEng().
W jaki sposób w metodzie klasy sitePages() [metoda save() do służy do zapisywania zmian w bazie] wywołać metodę insertQuery() klasy mySqlEng?
Udało mi się to zrobić tworząc nowy egzemplarz klasy mySqlEng wewnątrz tej metody, ale nie jest to zbyt eleganckie, moim zdaniem...

Inne próby powodują wyświetlenie takiego błędu: Fatal error: Call to a member function insertQuery() on a non-object in /home/kotonski/ftp/catering_iwo/class/sitePages.php5 on line 79

Proszę o pomoc, i pozdrawiam!

Przemek "Tarcil" Kwiecień
JoShiMa
Cytat(Tarcil @ 2.07.2008, 15:49:41 ) *
Udało mi się to zrobić tworząc nowy egzemplarz klasy mySqlEng wewnątrz tej metody, ale nie jest to zbyt eleganckie, moim zdaniem...


A to dlaczego? Jeśli tego konkretnego obiektu nigdzie indziej nie używasz to tak może być.

Jeśli zaś chcesz mieć obiekt pierwszej klasy używany w drugiej a potem jeszcze w innych. To możesz go przekazywać z klasy do klasy odpowiednimi metodami przez referencje.
nevt
rozwiązanie zalecane: przekaż jawnie do konstruktora klasy sitePages stworzoną wcześniej instancję obiektu klasy mySqlEng, np.
  1. <?php
  2. $sql=new mySqlEng();
  3. $page = new sitePages($sql);
  4. class sitePages
  5.  {
  6. ...
  7. private $sql;
  8. public function __construct($sql)
  9. {
  10. $this->sql = $sql;
  11. }
  12.  public function save()
  13.  {
  14. //operacje na bazie przez odwołanie do $this->sql;
  15.  }
  16.  }
  17. ?>


rozwiązanie niezalecane: w metodzie save() klasy sitePages odwołaj się do zmiennej globalnej $sql, np.
  1. <?php
  2. $sql=new mySqlEng();
  3. class sitePages
  4. {
  5. ...
  6. public function save()
  7. {
  8.  global $sql;
  9.  //operacje na bazie;
  10. }
  11. }
  12. ?>

powodzenia.
Tarcil
Witam

Pomógł sposób ze zmienną globalną. Zdaję sobie sprawę, że to nie jest najbardziej fortunne rozwiązanie, ale na razie musi wystarczyć.

Z przekazaniem obiektu był ten sam problem. Wywoływałem metodę za pomocą $this->sql->insertQuery()... ale to chyba niemożliwe w php.

Dzięki i pozdrawiam
Przemek
JoShiMa
Cytat(Tarcil @ 3.07.2008, 06:57:31 ) *
Witam

Pomógł sposób ze zmienną globalną.


Naprawdę uważasz, że uzywanie zmiennej globalnej jest bardziej eleganckie niż zadeklarowanie obiektu wewnątrz klasy? Naucz się działać z referencjami jeśli chcesz mieć obiekt z zewnątrz i w dodatku elegancko.
ucho
Cytat(Tarcil @ 3.07.2008, 06:57:31 ) *
Z przekazaniem obiektu był ten sam problem. Wywoływałem metodę za pomocą $this->sql->insertQuery()... ale to chyba niemożliwe w php.

Kurcze, wszystkim działa przekazywanie obiektów jako argument w konstruktorze i późniejsze ich wykorzystywanie w klasie - tak jak zademonstrował to nevt, tylko Tobie nie? PHP musiało się na Ciebie uwziąć smile.gif Ewentualnie masz przedpotopowe php4 i musisz stosować =& zamiast = dla obiektów - ale nawet to w większości wypadków nie powinno spowodować problemów, tylko większe zużycie pamięci.
Jest jeszcze 3 metoda - opakuj obiekt w statyczna klasę - ale to rozwiązanie w sumie równie brzydkie co używanie global smile.gif
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.