Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] obiekt w klasie
konrad13
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.07.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
UDAT
post
Post #2





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Ociu
post
Post #3





Grupa: Moderatorzy
Postów: 1 566
Pomógł: 37
Dołączył: 14.05.2003
Skąd: Kraków




global nie bardzo, nie powinno się go używać w klasach, przerzuć sobie $sql przez parametr.
Go to the top of the page
+Quote Post
konrad13
post
Post #4





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.07.2005

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
UDAT
post
Post #5





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
konrad13
post
Post #6





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.07.2005

Ostrzeżenie: (0%)
-----


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

Ten post edytował konrad13 11.11.2006, 11:36:46
Go to the top of the page
+Quote Post
PdM
post
Post #7





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 27.07.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Cysiaczek
post
Post #8





Grupa: Moderatorzy
Postów: 4 465
Pomógł: 137
Dołączył: 26.03.2004
Skąd: Gorzów Wlkp.




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.


--------------------
To think for yourself you must question authority and
learn how to put yourself in a state of vulnerable, open-mindedness;
chaotic, confused, vulnerability, to inform yourself.
Think for yourself. Question authority.
Go to the top of the page
+Quote Post
konrad13
post
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 18.07.2005

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 11:33