Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] obiekt w klasie
Forum PHP.pl > Forum > PHP
konrad13
Witam

Mam klasę do obsługi bazy mysql. Zwykle zapytanie wykonuje w ten sposób $sql -> sql_query('zapytanie');

Ostatnio jednak chciałem napisać sobie klase 'user', w której byłaby m.in. metoda dodająca uzytkownika do bazy. Dlatego chciałem się zapytać w jaki sposób mam odwoływać się do metody sql_query() wewnątrz klasy 'user'?

Gdy normalnie chcę się odwołać do obiektu wewnątrz metody
  1. <?php
  2. class user
  3. {
  4. function dodaj()
  5. {
  6. echo $sql -> sql_query('SELECT * FROM table');
  7. }
  8. }
  9. ?>

pojawiają się błędy
Kod
Notice: Undefined variable: sql in c:\usr\krasnal\www\proba\index.php on line 17

Fatal error: Call to a member function sql_query() on a non-object in c:\usr\krasnal\www\proba\index.php on line 17



Z góry dziękuje za pomoc smile.gif
UDAT
A wiesz co to zasięg zmiennych?

$sql to zmienna globalna, a w funkcji używasz zmiennej lokalnej metody, która ma wartość null

Dodaj na początku funkcji:
  1. <?php
  2. global $sql;
  3. ?>



A na przyszłość zainteresuj się ustawianiem właściwościami obiektów. np. przy konstrukcji.
Ociu
global nie bardzo, nie powinno się go używać w klasach, przerzuć sobie $sql przez parametr.
konrad13
Dzięki za podpowiedzi.

global nie działa, wyrzuca błędy, próbowałem już tego wcześniej.

Pomysł z parametrem działa i pewnie będe go musiał wykorzystać jeśli nie wymyśle nic lepszego. Chodzi mi przede wszystkim o to, że będe musiał pamiętać, aby do każdego wywołania funkcji dodać jeszcze jeden parametr. To może być niezbyt przyjemne, a po to właśnie ucze sie OOP, żeby mi było lżej winksmiley.jpg

Próbowałem w ten sposób: ($sql jest obiektem klasy do obsługi mysql)

  1. <?php
  2. class user
  3. {
  4. public $obiekt;
  5.  
  6. function dodaj()
  7. {
  8. echo $this -> $obiekt -> sql_query('SELECT * FROM config');
  9. echo $this -> obiekt;
  10. }
  11.  
  12.  
  13. function __construct($a)
  14. {
  15.  $this -> obiekt = $a;
  16. }
  17. }
  18. $user = new user(&$sql);
  19. $user -> dodaj();
  20. ?>


Ale oczywiście nie działa.
$this -> obiekt; zwraca Object id #1

natomiast

$this -> $obiekt -> sql_query('SELECT * FROM config'); lub
$obiekt -> sql_query('SELECT * FROM config');

powoduje błąd:
Fatal error: Call to a member function sql_query() on a non-object in c:\usr\krasnal\www\proba\index.php on line 21


Proszę jeszcze o pomoc. Jak wy rozwiązujecie to w swoich projetkach?
UDAT
Zdecyduj się.

Piszesz w PHP5 to wywal tą referencję.
Piszesz w PHP4 wywal public.

A w jednym i drugim wywal $ sprzed obiekt
  1. <?php
  2. echo $this -> obiekt -> sql_query('SELECT * FROM config');
  3. //zamiast
  4.  echo $this -> $obiekt -> sql_query('SELECT * FROM config');
  5. ?>
konrad13
Dziękuje bardzo. Na prawde bardzo mi pomogliście smile.gif



Nie wiedziałem że w PHP5 nie można używać referencji do obiektów. Czy to znaczy, że parser sam wybierze, że to ma być referencja czy skopiuje cały obiekt?
//to pytanie już czysto teoretyczne, po prostu chce wiedzieć smile.gif
PdM
sam robi referencję, gdy przekazujesz obiekt.

natomiast odnośnie twojego problemu ja bym zrobił z obiektu sql singleton'a. Na stronie głównej nie tak dawno był tekst o tym, na wikipedii też jest o tym wzorcu sporo. Trick polega na tym, że właściwy obiekt jest ukryty w statycznym polu singletona. Konstruktor singletona jest prywatny, więc przez operator new nie stworzysz nowego obiektu, możesz tylko odzyskać (lub stworzyć) obiekt docelowy. zawile brzmi, ale w praktyce się sprawdza znakomicie smile.gif
Cysiaczek
Cytat
Nie wiedziałem że w PHP5 nie można używać referencji do obiektów. Czy to znaczy, że parser sam wybierze, że to ma być referencja czy skopiuje cały obiekt?
//to pytanie już czysto teoretyczne, po prostu chce wiedzieć smilingsmiley.gif


Domyślnie
obiekty są przekazywane przez referencję - jeśli chcesz kopię obiektu, to musisz zrobić to ręcznie. Parser nic nie wybiera : ) Ciagle to Ty decydujesz.
konrad13
PdM: dzięki za podpowiedź, jednak to wcześniejsze rozwiązanie mnie zadawala i nie będe go zmieniał smile.gif

Cysiaczek: dzięki za wyjaśnienie

pozdrawiam

problem rozwiązany - mozna zamknąć 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.