Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dostęp do obiektu A z obiektu B, gdzie oba są w obiekcie C
Forum PHP.pl > Forum > PHP > Object-oriented programming
SpokoJny_
Witam!

Oto kod:

  1. <?php
  2. class A{
  3.  
  4.  
  5. }
  6. class B{
  7. //Jak uzyskać dostęp do obiektu klasy A w obiekcie klasy B, gdzie oba są polami obiektu klasy C?
  8. }
  9. class C{
  10. private $A;
  11. private $B;
  12.  
  13. public function __construct(){
  14. $this->A = new A();
  15. $this->B = new B();
  16. }
  17. }
  18. ?>




Na myśl przyszedł mi sposób:
  1. <?php
  2. class A{
  3.  
  4. }
  5. class B{
  6.  
  7. public function __construct($obj){
  8. //piszemy $obj i mamy dostęp do publicznych metod i pól obiektu klasy A,
  9. //który jest polem obiektu klasy C
  10. }
  11. }
  12. class C{
  13. private $A;
  14. private $B;
  15. public function __construct(){
  16. $this->A = new A();
  17. $this->B = new B($this->A); //Przekazujemy konstruktorowi obiektu B dostęp do obiektu A,
  18. // gdzie oba są polami obiektu C
  19. }
  20.  
  21. }
  22. $obj = new C();
  23.  
  24. ?>


Czy istnieje jakaś inna możliwość?
W moim skrypcie będę korzystał z obiektu klasy A w wielu innych obiektach, gdzie wszystkie są zawarte w obiekcie klasy
C i nie chciałbym za każdym razem przekazywać do konstruktora innych obiektów referencji do obiektu A.

Innym rozwiązaniem może być stała klasowa w postaci obiektu, wtedy mógłbym się odwoływać A::obj->costam.
Crozin
W zależności od tego jaka jest Twoja sytuacja możesz skorzystać z kilku metod:

1. Przekazanie obiektu C:
  1. class C {
  2. private $a;
  3. private $b;
  4.  
  5. public function __construct() {
  6. $this->a = new A($this);
  7. $this->b = new B($this);
  8. }
  9.  
  10. public function getA() {
  11. return $this->a;
  12. }
  13.  
  14. public function getB() {
  15. return $this->b;
  16. }
  17. }
  18.  
  19. class A {
  20. private $c;
  21.  
  22. public function __construct(C $c) {
  23. $this->c = $c;
  24.  
  25. //...
  26. echo $this->c->getB()->execSomeBMethod();
  27. }
  28. }


2. Dependency Injection z wykorzystaniem "kontenera": http://components.symfony-project.org/dependency-injection/ (czy ogólnie IoC)
3. Bezpośrednie przekazywanie wszystkich niezbędnych obiektów
webmaniak
Witam. Mam podobny problem(nie identyczny).
Mianowicie mam strona.inc.php
  1. class Strona{
  2. //atrybuty
  3. //metody
  4. public function WyswietlWszystko()
  5. {
  6. ...
  7. }
  8. }


Następnie mam baza.inc.php:
  1. class sql extends mysqli{
  2. public function polaczenie()
  3. {
  4. echo ...
  5. }
  6. }




i plik index.php:
  1. $stronaglowna = new Strona();
  2. $b=new sql();
  3. $stronaglowna->tytul= "Witam na mojej stronie";
  4. $stronaglowna->tresc= 'Tu chce sie obwolac do metody klasy sql'; //nie wiem jak
  5. $stronaglowna->WyswietlWszystko();


Problem w tym że w tresc chce się odwołać do metody klasy sql, ale coś źle kombinuje. Proszę o pomoc.
Crozin
  1. $stronaglowna = new Strona();
  2. $b=new sql();
  3. $stronaglowna->tytul= "Witam na mojej stronie";
  4. $stronaglowna->tresc= $b->abcDefGhi();
  5. $stronaglowna->WyswietlWszystko();
?
webmaniak
Robiłem tak i nie działało mi ponieważ miałem błąd w innym miejscu. Teraz jednak mi działa, ale nie tak jak chce. Mianowicie ta tresc powinna być na środku strony a niestety jest na samej górze.
Crozin
Pytanie za 100 punktów: co ma PHP wspólnego z tym jak jest wyświetlana strona?
Odpowiedź: Kompletnie nic.

Wygeneruj sobie odpowiedni kod HTML, później dopisz CSS, który zajmie się "pierdołami" typu wyświetlaniem czegoś na środku.
webmaniak
Pytanie za 1000punktów? A kto twierdzi że php ma wpływ na sposób wyświetlania strony?? Na pewno nie ja, dlatego nie wklejałem tu kodu. Napisałem po prostu że to co napisałeś działa bo komuś innemu też może się przydać. A odpowiedni html i css mam dlatego mnie to dziwi, że źle mi wyświetla.
Jak dam:
  1. $stronaglowna->tresc= 'Jakiś tekst';

to mi dobrze wyświetla. Natomiast :
  1. $stronaglowna->tresc= $b->abcDefGhi();

powoduje że tekst ląduje na samą górę.
Muszę chyba jeszcze raz przeanalizować treść kodu.
Dziękuję za pomoc.
rzymek01
to założę się, chociaż nie widze Twojego kodu, że w tej twojej metodzie z b, masz zamiast return $result, echo $result i to powoduje, że ta treść jest pierwsza wysłana do przeglądarki, przed tym, jak zapewne gdzieś ładnie to wyświetlasz w metodzie WyswietlWszystko smile.gif

PS. wszedłem specjalnie na to forum w związku z tematem o zmianie nazwy działu, a tutaj kwiatki smile.gif
webmaniak
Metoda z "b" zawiera rzeczywiście echo a to dlatego że łączy się ona z baza danych i z niej pobiera odpowiednie rekordy. Teraz zmieniłem na return i okazuje się że masz 100% racji.
Do Crozin: jednak i Ty i ja się mylimy. Bo na tym przykładzie ewidentnie widać że kod php ma wpływ na wyświetlanie strony.
Oj, jeszcze bardzo dużo czeka mnie nauki.
Dziękuję Wam obu za pomoc.
rzymek01
Cytat(webmaniak @ 1.09.2010, 18:10:23 ) *
Do Crozin: jednak i Ty i ja się mylimy. Bo na tym przykładzie ewidentnie widać że kod php ma wpływ na wyświetlanie strony.

to nie do końca jest tak jak piszesz.

Masz sobie kod PHP, z którego możesz sobie wywołać funkcje, a własciwie instrukcje języka takie jak echo czy print, ale kiedy je wywołasz i co przekażesz leży wyłącznie po Twojej stronie

de facto, PHP nie ma w ogóle wpływu na wyświetlanie strony, on tylko przekazuje przeglądarce jakieś bliżej nie określone (od strony PHP) dane tekstowe, a to że przeglądarka interpretuje HTML/XML to inna kwestia smile.gif

Pozdrawiam
webmaniak
No pewnie masz rację. Tylko że z drugiej strony w tym przypadku interpretacja zależy od tego co wpiszę jako kod php: echo czy return.
Wiem jednak, patrząc na Twój staż na tym forum że to Ty masz rację smile.gif
Grand93
@webmaniak - PHP wykonuje się po stronie serwera - ma wiec pośredni wpływ na stronę klienta ( to co widzisz w przeglądarce )

@rzymek1 - bliżej nieokreślone ? Wysyła na ogół bardzo określony kod (x)HTML ( chociaż nie rozdrabniajmy tego bo zaraz ktoś "inteligentny" zacznie wymieniać co jeszcze można wysłać - albo walnie link do mimr type) winksmiley.jpg

myśle jednak ze kod jaki dostanie przeglądarka jest zależny od php - to tu ( czyt. W kodzie php - wiem, wiem są szablony których sam zresztą używam ) decyduje się gdzie co się wyswietli. ( do "proroków" - wiem co to pozycjonowanie w css )

sorki ze pisze takimi wyrażeniami, ale niektórzy użytkownicy nie są pro, uważają sie za nich i próbują się popisac offtpoujac każdy temat
SpokoJny_
Ja używam tego:

  1. <?php
  2.  
  3. class Connector{
  4.  
  5. static private $host;
  6. static private $user;
  7. static private $password;
  8. static private $database;
  9.  
  10. static public $connection;
  11.  
  12.  
  13. public static function connect($host, $user, $password, $database){
  14.  
  15. self::$host = $host;
  16. self::$user = $user;
  17. self::$password = $password;
  18. self::$database = $database;
  19.  
  20. if(self::$connection)
  21. return false;
  22.  
  23. $tempconnection = new mysqli(self::$host, self::$user, self::$password, self::$database);
  24.  
  25. if(mysqli_connect_errno())
  26. throw new Exception("Database connection error.");
  27.  
  28. self::$connection = $tempconnection;
  29.  
  30.  
  31. }
  32.  
  33. public static function convertresult(&$result){
  34.  
  35. $arr = Array();
  36.  
  37. while($row = $result->fetch_row()){
  38. $arr[] = $row;
  39.  
  40. }
  41.  
  42. return $arr;
  43.  
  44. }
  45.  
  46.  
  47. }
  48. ?>


Trochę staroświecki sposób łączenia się z bazą no ale to nie jest głównym wątkiem:

Używasz tego po prostu w momencie, gdy twój kontroler (np. główny plik index.php) otrzymuje żądanie, w którym trzeba bazy danych użyć, wtedy:

  1. ...
  2. Connector::connect('localhost', 'user', 'pass', 'db');
  3. ...


i w każdej innej funkcji/klasie masz swobodne dojście do połączenia.
  1. ...
  2. $result = Connector::$connection->query("moje zapytanie");
  3. //i ewentualnie
  4. $result = Connector::convertresult($result);
  5. ...


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.