Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dostęp do obiektu A z obiektu B, gdzie oba są w obiekcie C
SpokoJny_
post
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.02.2010

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


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.

Ten post edytował SpokoJny_ 26.08.2010, 16:14:46
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 12)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


  1. $stronaglowna = new Strona();
  2. $b=new sql();
  3. $stronaglowna->tytul= "Witam na mojej stronie";
  4. $stronaglowna->tresc= $b->abcDefGhi();
  5. $stronaglowna->WyswietlWszystko();
?
Go to the top of the page
+Quote Post
webmaniak
post
Post #5





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


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





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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.

Ten post edytował webmaniak 1.09.2010, 13:23:18
Go to the top of the page
+Quote Post
rzymek01
post
Post #8





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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 (IMG:style_emoticons/default/smile.gif)

PS. wszedłem specjalnie na to forum w związku z tematem o zmianie nazwy działu, a tutaj kwiatki (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
webmaniak
post
Post #9





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


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 (IMG:style_emoticons/default/smile.gif)

Pozdrawiam
Go to the top of the page
+Quote Post
webmaniak
post
Post #11





Grupa: Zarejestrowani
Postów: 371
Pomógł: 30
Dołączył: 14.04.2010

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


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ę (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Grand93
post
Post #12





Grupa: Zarejestrowani
Postów: 58
Pomógł: 1
Dołączył: 2.08.2010
Skąd: Dębica

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


@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) (IMG:style_emoticons/default/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
Go to the top of the page
+Quote Post
SpokoJny_
post
Post #13





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.02.2010

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


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




Ten post edytował SpokoJny_ 2.09.2010, 21:09:39
Go to the top of the page
+Quote Post

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: 14.09.2025 - 13:43