Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> widocznosc obiektu wewnątrz klasy
Black-Berry
post 13.02.2008, 01:01:28
Post #1





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Czy we wnątrz klasy mogę użyć zewnętrzny obiekt bez konieczności używania deklaracji public ?

  1. <?php
  2. class c_page_creator_main
  3. {
  4. function c_page_creator_main()
  5. {
  6. global $db; //wewnątrz chciałbym użyć ten obiekt bez ciągłego deklorowania go jako public
  7. $db->query( "SELECT * FROM tabela" );
  8.  
  9. }
  10. ?>


--------------------
Go to the top of the page
+Quote Post
webdice
post 13.02.2008, 01:08:35
Post #2


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Może dziedziczenie?
Go to the top of the page
+Quote Post
Black-Berry
post 13.02.2008, 01:22:21
Post #3





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


nie ma innego sposobu ?


--------------------
Go to the top of the page
+Quote Post
webdice
post 13.02.2008, 01:24:03
Post #4


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




  1. <?php
  2. class c_page_creator_main
  3. {
  4. function c_page_creator_main()
  5. {
  6. $db = new myDB ();
  7. $db->query( "SELECT * FROM tabela" );
  8.  
  9. }
  10. ?>


Ten post edytował webdicepl 13.02.2008, 01:24:17
Go to the top of the page
+Quote Post
Black-Berry
post 13.02.2008, 01:28:07
Post #5





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


no tak ale wtedy za kazdym razem bede musiał tworzyc nowy obiekt a to mi ma ułatwić sprawę smile.gif Chodzi o to ze to są odrębne klasy i chciałbym zachoać odrębnoać ale w kazdej linijce pisanie global troche mi się nie widzi.


--------------------
Go to the top of the page
+Quote Post
webdice
post 13.02.2008, 01:43:03
Post #6


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Możesz jeszcze przekazywać obiekt do metody.
Go to the top of the page
+Quote Post
LonelyKnight
post 13.02.2008, 11:05:44
Post #7





Grupa: Zarejestrowani
Postów: 240
Pomógł: 13
Dołączył: 1.06.2007
Skąd: Wrocław

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


Cytat(Black-Berry @ 13.02.2008, 01:01:28 ) *
Czy we wnątrz klasy mogę użyć zewnętrzny obiekt bez konieczności używania deklaracji public ?

  1. <?php
  2. class c_page_creator_main
  3. {
  4. function c_page_creator_main()
  5. {
  6. global $db; //wewnątrz chciałbym użyć ten obiekt bez ciągłego deklorowania go jako public
  7. $db->query( "SELECT * FROM tabela" );
  8.  
  9. }
  10. ?>



A co złego w tym:

  1. <?php
  2. class c_page_creator_main
  3. {
  4. public $objDB;
  5.  
  6. function c_page_creator_main()
  7. {
  8. $this->objDB = Database::getInstance(); // do bazy danych powinieneś użyć singletona 
  9. $this->objDB ->query( "SELECT * FROM tabela" );
  10.  
  11.  } 
  12.  }
  13. ?>


--------------------
Good programming is 99% sweat and 1% coffee.
Make it idiot proof and someone will make a better idiot...
Go to the top of the page
+Quote Post
Black-Berry
post 13.02.2008, 11:26:21
Post #8





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


@LonelyKnight MAsz u mnie piwo:)


--------------------
Go to the top of the page
+Quote Post
webdice
post 13.02.2008, 12:02:27
Post #9


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Dodam że singleton jest porównywany z globalami tylko w ładniejszym opakowaniu.
Go to the top of the page
+Quote Post
em1X
post 13.02.2008, 12:12:54
Post #10





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


po prostu napisz sobie jakiś obiekt podstawowy, który wszystkie inne klasy będą rozszerzać.

  1. <?php
  2. class Object {
  3.  
  4.  public function & getDB() {
  5. // zwraca obiekt mysql
  6.  }
  7.  
  8.  // i tak dalej
  9.  
  10. }
  11. ?>


i w następnych klasach nie będzie problemów:
  1. <?php
  2. class myClass extends Object {
  3.  
  4.  public function display()
  5.  {
  6. $db = $this->getDB();
  7.  
  8. print $db->result('select field from table where id = 1');
  9.  }
  10.  
  11. }
  12. ?>


Ten post edytował em1X 13.02.2008, 12:13:07


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
Black-Berry
post 13.02.2008, 12:15:45
Post #11





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


@webdicepl Tak sobie myślę... że skoro różnica ma polegać tylko na opakowaniu to już chyba zostanę przy "globalach" i przy kazdym wywołaniu $db dopiszę sobie to global. Nie chcę za dużo komplikować.


--------------------
Go to the top of the page
+Quote Post
webdice
post 13.02.2008, 12:26:27
Post #12


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Tak jak Ci mówiłem, tu najlepszym rozwiązaniem będzie dziedziczenie. I tak w metodach używasz funkcji z klasy DB, więc będzie ona nierozłączną częścią Twoich klas.
Go to the top of the page
+Quote Post
em1X
post 13.02.2008, 16:09:25
Post #13





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


Cytat(Black-Berry @ 13.02.2008, 12:15:45 ) *
@webdicepl Tak sobie myślę... że skoro różnica ma polegać tylko na opakowaniu to już chyba zostanę przy "globalach" i przy kazdym wywołaniu $db dopiszę sobie to global. Nie chcę za dużo komplikować.


Używanie globali jest bardzo nieeleganckie, bardzo niepraktyczne i świadczy o niskim poziomie programisty wstydnis.gif . PHP ma całkowicie usunąć w przyszłości funkcję global z języka.


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
Black-Berry
post 13.02.2008, 16:29:09
Post #14





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Rozumiem, W takim razie zrobię tak jak sugerujesz. Obiekt główny i dziedziczące po nim wszystkie inne. To lepszy sposób niż SINGLETON ? Jak uważacie. Zależy mi na dobrym profesjonalnym i przyszłościowym rozwiązaniu, tak żebym mógł pozniej do sterownika bazy dopisać np cache.


--------------------
Go to the top of the page
+Quote Post
em1X
post 13.02.2008, 16:49:11
Post #15





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


Zauważ, że jeżeli będziesz chciał wprowadzić jakieś modyfikacje do sterownika bazy danych to zrobisz to zupełnie niezależnie od systemu.
Myślę, że rozsądnie jest użyć Singletona w przypadku obsługi bazy danych. Masz wtedy pełną kontrolę nad tym połączeniem z bazą. Ale też (w przypadku innych klas) z nim nie przesadzaj, ostatnio jakaś taka dziwna moda jest na walenie tego Singletona w każdą klasę, gdzie popadnie, a przecież przeważnie ten Singleton wcale nie jest w niej potrzebny.

A więc z głową wszystko, z głową smile.gif

ps. siedzisz dalej w PHP4 ?

Ten post edytował em1X 13.02.2008, 16:49:51


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
Black-Berry
post 13.02.2008, 21:01:49
Post #16





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


Tak, jakoś tak wyszło, że zaczynałem w PHP4 i się go trzymam. Wiem, że wychodzi już z użycia i nie ma sensu tego ciągnąć, a co do pełnej obiektowości to trochę ona do mnie nie przemawia. Wiem, ze teraz moda na obiekty i wogóle ale kiedy to wszystko się zaczynało to klasa znaczyła grupę obiektów i nikt nie budował całej klasy dla tylko jednego obiektu. Moim zdaniem to trochę nadużycie ale pewnie nie idę z duchem czasu... ale nie o tym:

Przyszło mi do głowy jeszcze jedno rozwiązanie. Co o nim myślicie?

  1. <?php
  2. class c_my_sql_database_driver()
  3. {
  4. function query( $query )
  5. {
  6. //ciało funkci
  7. }
  8. }
  9.  
  10. $object_my_sql_database_driver = new c_my_sql_database_driver();
  11.  
  12. function db_query($query)
  13. {
  14. // ta funkcja będzie mogła w przyszłości przełaczać na inne drivery bazy za pomocą
     switch();
  15. // więc dodatkowo storzę pomost między driverem bazy a klasami.
  16. global $object_my_sql_database_driver;
  17. $object_my_sql_database_driver->query($query);
  18. }
  19.  
  20.  
  21. class c_page_creator()
  22. {
  23. function body_drop()
  24. {
  25.  db_query( 'select coś tam' );
  26. }
  27. }
  28. ?>


Ten post edytował Black-Berry 13.02.2008, 21:04:50


--------------------
Go to the top of the page
+Quote Post
em1X
post 13.02.2008, 21:12:55
Post #17





Grupa: Zarejestrowani
Postów: 984
Pomógł: 41
Dołączył: 16.03.2002
Skąd: Płock

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


1) Bez sensu.... i skończ z tym globalem w końcu sciana.gif

2) Napisałem Ci jak poprawniej to powinno wyglądać:
http://forum.php.pl/index.php?showtopic=87...rt=#entry441695

Możesz sobie tylko zamienić metodę getDB() na np. query(), która będzie wykonywać zapytania SQL.

3) Poczytaj jak wyglądają klasy w PHP5. Stwarzają masę nowych możliwości. Ludzie jeżdzą samochodami, a Ty dalej razem z Flinstonami na kwadratowych kołach jedziesz snitch.gif

4) przykład:
  1. <?php
  2. abstract class Object {
  3.  
  4. public function getDB()
  5. {
  6. return DB::getInstance();
  7. }
  8.  
  9. }
  10.  
  11. class DB {
  12.  
  13. /**
  14.  * Pola
  15.  */
  16. private static $instance = null;
  17.  
  18. /**
  19.  * Metody
  20.  */
  21. private function __construct() {
  22. $this->connect();
  23. }
  24.  
  25. public function __destruct()
  26. {
  27. $this->disconnect();
  28. }
  29.  
  30. public function getInstance()
  31. {
  32. $class = __CLASS__;
  33. return self::$instance == null ? self::$instance = new $class : self::$instance;
  34. }
  35.  
  36. public function connect()
  37. {
  38. // polacz sie z baza danych
  39. }
  40.  
  41. public function disconnect()
  42. {
  43. // rozlacz sie z baza danych
  44. }
  45.  
  46. public function query($qry)
  47. {
  48. return mysql_query($qry);
  49. }
  50.  
  51. }
  52.  
  53. class TwojaKlasa
  54. extends Object
  55. {
  56. public function display()
  57. {
  58. return $this->getDB()->query('select pole from tabela where pole_id = 1');
  59. }
  60. }
  61.  
  62. /**
  63.  * Przyklad
  64.  */
  65.  
  66. $object = new TwojaKlasa();
  67.  
  68. print $object->display();
  69. ?>


Ten post edytował em1X 14.02.2008, 12:23:06


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
Black-Berry
post 14.02.2008, 01:06:52
Post #18





Grupa: Zarejestrowani
Postów: 663
Pomógł: 6
Dołączył: 3.06.2007
Skąd: Kraków

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


smile.gif Dobra przekonałes mnie. Postęp musi być biggrin.gif Dzis w nocy zabieram się do analizy tego wszystkiego. Dzięki.


4 godziny później...
Zrobiłem to według schematu. Wszystko działa jak należy:) Jesteś dziś moim bogiem biggrin.gif Jeszcze raz wielkie dzięki!

i jeszcze...
Tak apropo globalsów smile.gif Czy takie coś wchodzi w grę?
  1. <?php
  2. $this->connect_id = @mysql_connect( $GLOBALS["db_host"], $GLOBALS["db_user"], $GLOBALS["db_password"] );
  3. ?>


Ten post edytował Black-Berry 14.02.2008, 01:16:02


--------------------
Go to the top of the page
+Quote Post
Tubis
post 16.02.2008, 11:57:16
Post #19





Grupa: Zarejestrowani
Postów: 44
Pomógł: 2
Dołączył: 27.03.2007
Skąd: Sufczyn

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


Lepiej by było jakby te db_host, db_user i password były stałymi. Nie miałbyś problemy z ich dostępnąścią w klasach, bo stałe mają widoczność globalną.
Go to the top of the page
+Quote Post
Cysiaczek
post 16.02.2008, 12:08:40
Post #20





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




Może tak jednak nie globale i stałe, a jakiś obiekt konfiguracji?


--------------------
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

2 Stron V   1 2 >
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 Wersja Lo-Fi Aktualny czas: 13.06.2025 - 05:17