Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> 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
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 27)
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
Black-Berry
post 16.02.2008, 12:18:52
Post #21





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

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


Taki obiekt konfiguracyjny były również singletonem prawda? Podobnie jak driver bazy danych ?


--------------------
Go to the top of the page
+Quote Post
Cysiaczek
post 16.02.2008, 12:36:45
Post #22





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




To już od Ciebie zależy. Może być sigletonem, ale nie musi


--------------------
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
Cotter
post 17.02.2008, 00:10:37
Post #23





Grupa: Zarejestrowani
Postów: 57
Pomógł: 12
Dołączył: 6.01.2008
Skąd: Wrocław

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


Ja w tym celu tworzę sobie obiekt globalny w tablicy GLOBALS i w celu skrócenia kodu odwołuję się do niego przez funkcję (nie będącą w żadnej klasie):
  1. <?php
  2. $GLOBALS['sql'] = new Sql();
  3.  
  4. function sql()
  5. {
  6. return $GLOBALS['sql'];
  7. }
  8.  
  9. //i teraz można już używać ten obiekt wszędzie tak:
  10. sql()->query(...);
  11. ?>


Jeżeli zależy nam na singletonie to można oczywiście zastosować zwykły singleton i dopisać sobie taką funkcję:
  1. <?php
  2. function sql()
  3. {
  4. return Sql::getInstance();
  5. }
  6. ?>


Idea polega na tym aby skrócić kod odwołania. Prościej i szybciej jest używać sql()->query() niż Sql::getInstance()->query();

Jeżeli chodzi o tworzenie obiektu nadrzędnego, po którym będą dziedziczyły wszystkie inne to nie polecam tego rozwiązania. W pewnym sensie zmusza ono programistę do dziedziczenia po tej klasie co może czasami okazać się niewygodne.
Go to the top of the page
+Quote Post
Black-Berry
post 17.02.2008, 12:30:36
Post #24





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

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


no to teraz mi już namieszałeś totalnie smile.gif Znacznie bardziej podoba mi się Twoje rozwiązanie, ale poprzednicy twierdzili zupełnie inaczej.

Przy okazji nasuwa mi się pytanie. Skoro znacznik global ma zostać usunięty z PHP w przyszłości to jak to się ma do tablicy $GLOBALS? tez ma zostać usunięta ?


--------------------
Go to the top of the page
+Quote Post
em1X
post 17.02.2008, 12:48:57
Post #25





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

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


No pewnie, że namieszał.

Jeżeli chcesz przechowywać dane konfiguracyjne to zapoznaj się ze wzorcem Registry.

Jeżeli chcesz skrócić sobie notację, możesz utworzyć metodę-osłonkę w swojej klasie:
  1. <?php
  2. class X {
  3.  public function query($sql)
  4.  {
  5.  // przykład
  6.  return $this->getDatabase()->query($sql);
  7.  }
  8. }
  9. ?>


Ten post edytował em1X 17.02.2008, 12:49:50


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
Black-Berry
post 17.02.2008, 15:16:46
Post #26





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

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


@em1X tego typu osłonka sprawdza się świetnie. Wielkie dzięki za sugestie. @Cotter Za pomysł ze skróceniem notacji też dziękuję. Wydaje mi się jednak, że obiekt po którym dziedziczą wszystkie inne obiekty to dobry pomysł bo mogę sobie podpinać wtyczki do całego systemu w bardzo wygodny sposób. O to co udało mi się sklecić. Proszę o komentarze.

  1. <?php
  2. abstract class edc_object
  3. {  
  4. /* Pobieranie instancji singletona */
  5. public function db_driver(){ 
  6. return mysql_db_driver::get_instance();
  7. }
  8.  
  9. /* Pomost dla query */
  10. public function query($sql){ 
  11. return $this->db_driver()->query($sql);
  12. }
  13.  
  14. /* Pomost dla result */
  15. public function fetch_row($result=""){ 
  16. return $this->db_driver()->fetch_row($result);
  17. }
  18.  
  19. /* Tutaj zbiór przydatnych funkcji też jako singleton. Nie wiem czy to dobry sposób. */
  20. public function db_functions(){ 
  21. return db_functions::get_instance(); 
  22. }
  23. }
  24. ?>


Ten post edytował Black-Berry 17.02.2008, 15:38:05


--------------------
Go to the top of the page
+Quote Post
em1X
post 17.02.2008, 16:44:50
Post #27





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

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


1) dużo lepiej niż było na początku czarodziej.gif
Trzeba pisać, pisać i pisać.. wszystko opiera się na doświadczeniu.

2) proponuję kupić sobie tą książkę. Na pewno Ci się przyda, bo wszystko u czym tutaj pobieżnie pisaliśmy, w tej książce jest opisane od podstaw, zaczynając od wzorców projektowych i ciekawych metod programowania obiektowego.


--------------------
eh, co polska wódka to polska wódka
Go to the top of the page
+Quote Post
Black-Berry
post 17.02.2008, 17:00:23
Post #28





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

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


boje się że mi życia na naukę braknie smile.gif Dzięki wielkie. Zaopatrzę się w nią bo doszedłem chyba do etapu w którym trzeba zmienić swój punkt widzenia o programowaniu w PHP.

Pozdrawiam.

Ten post edytował Black-Berry 17.02.2008, 17:01:24


--------------------
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: 15.06.2025 - 13:56