Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Odniesienie się do obiektu przez inny w nim powstały
l0ud
post
Post #1





Grupa: Zarejestrowani
Postów: 1 387
Pomógł: 273
Dołączył: 18.02.2008

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


Witam. Właśnie sobie uświadomiłem że dopiero raczkuję w programowaniu obiektowym, bo nie wiem nawet czy to jest możliwe: mam zamiar odnieść się do $zmienna znajdującej się w $obiekta w innym utworzonym przez niego obiekcie.

  1. <?php
  2. class A {
  3.  
  4. public $zmienna;
  5.  
  6. public function __construct() {
  7. $this->zmienna = asd;
  8. $obiektb = new B;
  9. }
  10.  
  11. }
  12.  
  13. class B {
  14.  
  15. public function __construct() {
  16. //czy da się teraz odnieść do $zmienna w obiekta?
  17. }
  18.  
  19. }
  20.  
  21. $obiekta = new A;
  22. ?>


Czy to jest w ogóle możliwe? (IMG:http://forum.php.pl/style_emoticons/default/wstydnis.gif)

Pozdrawiam

Ten post edytował l0ud 29.03.2008, 21:28:03
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Kicok
post
Post #2





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Dlaczego miałoby się nie udać?
  1. <?php
  2.  
  3.  
  4. class DB
  5. {
  6. public $connected = false;
  7. protected $prefix = 'abc_';
  8.  
  9.  
  10. public function __construct( )
  11. {
  12. echo "Połączono z bazą danych<br />";
  13. $this->connected = true;
  14.  
  15. }
  16.  
  17. public function query( $query )
  18. {
  19. echo "Wykonujesz zapytanie:<pre>$query</pre><br />";
  20. }
  21.  
  22. }
  23.  
  24.  
  25. class QueryMaker extends DB
  26. {
  27.  
  28. public function makeSelect( $table, $cols = '*' )
  29. {
  30. if( $this->connected )
  31. {
  32. echo "OK, jesteś połączony<br />";
  33.  
  34. $query = "SELECT $cols FROM {$this->prefix}{$table}";
  35. $this->query( $query );
  36. }
  37.  
  38. }
  39.  
  40. }
  41.  
  42.  
  43. $query = new QueryMaker();
  44. $query->makeSelect( 'tabela' );
  45.  
  46. $query->makeSelect( 'tabela2', 'a, b, c' );
  47.  
  48. ?>


Różnica jest taka, że tworzymy tylko obiekt klasy QueryMaker. Jako że klasa ta nie ma swojego konstruktora to wywoływany jest konstruktor rodzica i nawiązywane jest połączenie z bazą danych. Takie rozwiązanie ma jednak sporo wad, np.: nie da się teraz sensownie przekazać parametrów połączenia z bazą - musiałbyś przerobić klasę DB na statyczną. Trzeba także zrobić z QueryMakera Singleton bo każda nowa instancja będzie nawiązywała nowe połączenie z bazą danych.

Ja proponowałbym coś takiego:
  1. <?php
  2.  
  3.  
  4. class DBConfig
  5. {
  6. public static $DBhost  = 'localhost';
  7. public static $DBuser  = 'root';
  8. public static $DBpass  = '';
  9. public static $DBname  = 'test';
  10. public static $DBprefix = '';
  11.  
  12. public static function setConfig( array $configValues )
  13. {
  14. self::$DBhost  = $configValues['host'];
  15. self::$DBuser  = $configValues['user'];
  16. self::$DBpass  = $configValues['pass'];
  17. self::$DBname  = $configValues['name'];
  18. self::$DBprefix = $configValues['prefix'];
  19. }
  20. }
  21.  
  22.  
  23.  
  24. class DB
  25. {
  26. private $connID = null;
  27.  
  28.  
  29. public function __construct()
  30. {
  31. echo "Następuje połączenie z serwerem '" . DBConfig::$DBuser . ":" . DBConfig::$DBpass ."@" . DBConfig::$DBhost . "' i wybranie bazy '" . DBConfig::$DBname . "'<br />";
  32. }
  33.  
  34. public function __destruct()
  35. {
  36. echo "Koniec połączenia z serwerem<br />";
  37. }
  38.  
  39.  
  40. public function query( Query $query )
  41. {
  42. echo "Wykonuje zapytanie:<pre>$query</pre><br />";
  43. }
  44.  
  45. }
  46.  
  47.  
  48.  
  49. interface Query
  50. {
  51. public function __toString();
  52. }
  53.  
  54.  
  55.  
  56. class Select implements Query
  57. {
  58. private $queryParts = array();
  59.  
  60.  
  61. public function __construct( $table, array $cols = array() )
  62. {
  63. $this->queryParts['cols'] = empty( $cols ) ? '*' : implode( ', ', $cols );
  64. $this->queryParts['table'] = $table;
  65. }
  66.  
  67.  
  68. public function where( $where )
  69. {
  70. $this->queryParts['where'] = $where;
  71. return $this;
  72. }
  73.  
  74. public function order( $order, $direction = 'ASC' )
  75. {
  76. $this->queryParts['order'][] = "$order $direction";
  77. return $this;
  78. }
  79.  
  80. public function limit( $a, $b = null )
  81. {
  82. $this->queryParts['limit'] = is_null( $b ) ? "$a" : "$a, $b";
  83. return $this;
  84. }
  85.  
  86.  
  87. public function __toString()
  88. {
  89. $query = "SELECT {$this->queryParts['cols']}\nFROM " . DBConfig::$DBprefix . "{$this->queryParts['table']}";
  90.  
  91. if( !empty( $this->queryParts['where'] ) ) {
  92. $query .= "\nWHERE ( {$this->queryParts['where']} )";
  93. }
  94. if( !empty( $this->queryParts['order'] ) ) {
  95. $query .= "\nORDER BY " . implode( ', ', $this->queryParts['order'] );
  96. }
  97. if( !empty( $this->queryParts['limit'] ) ) {
  98. $query .= "\nLIMIT {$this->queryParts['limit']}";
  99. }
  100.  
  101.  
  102. return $query;
  103. }
  104.  
  105. }
  106.  
  107.  
  108. class Update implements Query
  109. {
  110. // ...
  111.  
  112. public function __toString()
  113. {
  114. }
  115.  
  116. }
  117.  
  118. class Insert implements Query
  119. {
  120. // ...
  121.  
  122. public function __toString()
  123. {
  124. }
  125.  
  126. }
  127.  
  128.  
  129.  
  130.  
  131. $DBconfig = array(
  132. 'host'  => 'localhost',
  133. 'user'  => 'root',
  134. 'pass'  => 'pass',
  135. 'name'  => 'baza',
  136. 'prefix' => 'abc_'
  137. );
  138. DBConfig::setConfig( $DBconfig );
  139.  
  140.  
  141.  
  142. $DB = new DB;
  143.  
  144.  
  145. $query = new Select( 'tabela', array( 'col1', 'col2', 'col3' ) );
  146. $DB->query( $query );
  147.  
  148. $query = new Select( 'tabela' );
  149. $query->where( 'col1 = 'abcde' AND ( col2 = 321 OR col3 IN ( 0, 2, 4, 6, 8 ) )' )
  150. ->order( 'col1' )
  151. ->order( 'col3', 'DESC' )
  152. ->limit( 50, 25 );
  153. $DB->query( $query );
  154.  
  155. ?>


Warto też poczytać o:
Criteria
http://www.php.net/manual/pl/language.oop5.static.php
http://www.php.net/manual/pl/language.oop5...nekudotayim.php
http://www.php.net/manual/pl/language.oop5.interfaces.php
http://www.php.net/manual/pl/language.oop5.typehinting.php
Go to the top of the page
+Quote Post

Posty w temacie
- l0ud   [PHP] Odniesienie się do obiektu przez inny w nim powstały   29.03.2008, 21:27:22
- - Cysiaczek   Nie, ale możesz przekazać referencję obiektu A do ...   29.03.2008, 21:29:01
- - pyro   Cytat(l0ud @ 29.03.2008, 21:27:22 ) W...   29.03.2008, 21:41:40
- - l0ud   Rozumiem, że masz na myśli coś takiego? [PHP] pob...   29.03.2008, 21:51:55
|- - pyro   Cytat(l0ud @ 29.03.2008, 21:51:55 ) R...   29.03.2008, 22:09:33
- - Moli   Możesz dać np. [PHP] pobierz, plaintext <?php$t...   29.03.2008, 22:07:33
- - l0ud   @pyro, nie wiem do czego Twoja odpowiedź się odnos...   29.03.2008, 22:13:53
- - Moli   No to jak dasz [PHP] pobierz, plaintext <?phpc...   29.03.2008, 22:17:58
- - l0ud   @Moli, ale ja chcę się odnieść do konkretnego obie...   29.03.2008, 22:37:49
|- - pyro   Cytat(l0ud @ 29.03.2008, 22:37:49 ) @...   29.03.2008, 23:00:26
- - l0ud   Cytatdziedziczysz tez zmienne i inne dane od rodzi...   29.03.2008, 23:10:12
|- - pyro   Cytat(l0ud @ 30.03.2008, 00:10:12 ) A...   30.03.2008, 11:25:27
- - Kicok   Dlaczego miałoby się nie udać? [PHP] pobierz, plai...   30.03.2008, 11:08:19
- - l0ud   Kicok, dzięki wielkie Twoja odpowiedź na pewno mi ...   30.03.2008, 15:12:14
- - Cysiaczek   Przenoszę na OOP Nie będzie to jakiś antywzorzec,...   30.03.2008, 15:25:17
- - l0ud   Bo za każdym razem przekazujemy wszystko do wszyst...   30.03.2008, 15:53:17
- - Cysiaczek   Pamiętaj, że przechowujesz tylko referencje do obi...   30.03.2008, 15:57:32
- - l0ud   Problemów z kopiami raczej nie będzie, bo klasa je...   30.03.2008, 16:12:48
- - Sedziwoj   Nie wiem dlaczego, ale w trakcie czytania na myśl ...   30.03.2008, 17:06:39


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

 



RSS Aktualny czas: 3.10.2025 - 02:04