Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Tworzenie obiektu na podstawie innego obiektu
ayeo
post 11.04.2008, 12:37:07
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Witam!
Mam taki problem... (skąd my to znamy? winksmiley.jpg )

Mam obiekt USER i dziedziczący po nim STUDENT. Obiekt USER tworzy się automatycznie w mechanizmie sesji. Czasem jednak zachodzi potrzeba "rozbudowania" tego obiektu do STUDENT'a biggrin.gif I teraz jest takie pytanie jak zmienić istniejący obiekt USER na dziedziczący po nim STUDENT?

Z góry dzięki. Pozdrawiam!


--------------------
Go to the top of the page
+Quote Post
Cysiaczek
post 11.04.2008, 12:40:22
Post #2





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




Zrób 2 obiekty i twórz instancje tego, który jest potrzebny. Aby to uprościć, wykorztstaj jakis trzeci obiekt, które będzie fabryką konkretnych obiektów User.

Przenoszę na OOP


--------------------
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
ayeo
post 11.04.2008, 12:45:50
Post #3





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Dziękuję za szybką odpowiedź! Factory nie wchodzi w grę ponieważ, jak pisałem, obiekt USER siedzi w sesji. Mi chodzi o to czy można "rozbudować" istniejący obiekt winksmiley.jpg Mam na myśli coś takiego np $user = new Student($user); Tylko jakby to sprytnie zaimplementować?


--------------------
Go to the top of the page
+Quote Post
Sedziwoj
post 11.04.2008, 21:37:30
Post #4





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


STUDENT ma mieć ten sam interfejs, czy ma dodawać nowe metody?

Ten post edytował Sedziwoj 11.04.2008, 21:37:47


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
ayeo
post 12.04.2008, 11:54:42
Post #5





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Student dziedziczy po User i dodaje nowe metody i właściwości.


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post 12.04.2008, 12:05:48
Post #6





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


ayeo:

1. czy bedziesz robil cos takiego

  1. <?php
  2. $u = new User();
  3. ...
  4.  
  5. $student = new Student( $u );
  6.  
  7. ...
  8.  
  9. if ( $student == $jakis_user ) // czyli porownanie obiektow
  10. bo $student != $u wiec ci sie to wysypie,
  11. ?>

jesli natomiast porownujesz, powiedzmy, ID userow, to nie ma problemu, kopiujesz ID do studenta itd.

2. a przeniesienie wartosci z usera do studenta:

  1. <?php
  2. public function __construct( User $user )
  3. {
  4. $this->id = $user->getID();
  5.  $this->firstNae = $user->getName();
  6. // itd.
  7. }
  8. ?>


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
ayeo
post 12.04.2008, 12:14:27
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Student jest tworzony zawsze na podstawie Usera np

$user = new Student(User::getUserById(12323));

Konstruktor Studenta pobiera automatycznie wszystkie wartości właściwości Usera i usuwa go. Realizowane to jest za pomocą get_object_vars(); ale muszę to przerobić na print_r() + regexp bo tamta funkcja nie pokazuje właściwości prywatnych.

Z manuala:
  1. <?php
  2. function get_private_properties($obj, $inside=false)
  3.  {
  4.  $obj_dump = print_r($obj, 1);
  5.  preg_match_all('/^s+[(w+):private]/m', $obj_dump, $matches);
  6.  if ($inside)
  7.  {
  8.  $output = array();
  9.  foreach ($matches[1] as $property)
  10.  {
  11.  $output[$property] = $obj->$property;
  12.  return $output;
  13.  }
  14.  }
  15.  else return $matches[1];
  16.  }
  17. ?>


Ten post edytował ayeo 12.04.2008, 12:16:18


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post 12.04.2008, 12:19:33
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


masakra, to nie lepiej walnac sobie wetodke getPrivVars() i zwrocic wszystko w tablicy? przynajmniej nie bedzie to taki hak


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
ayeo
post 12.04.2008, 12:23:11
Post #9





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


właśnie lepiej smile.gif

  1. <?php
  2. public function getArray()
  3.  {
  4.  return get_object_vars($this);
  5.  }
  6. ?>


biggrin.gif


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post 12.04.2008, 12:25:40
Post #10





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Eh, nie mozna bylo tak od razu? smile.gif


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
Sedziwoj
post 12.04.2008, 14:07:18
Post #11





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Ja tak sobie czytam, chyba muszę zmienić język... bo wyciąganie danych prywatnych z obiektów to trochę nie jest podejście obiektowe.
To jest raczej unikanie czegoś co daje obiektowość, bo po to jest kapsułkowanie aby było łatwiej, a tu się to omija, zamiast agregować obiekt i w miarę potrzeb pobierać informacje, jest... no dobra nie będę tego nazywać.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
ayeo
post 12.04.2008, 19:59:39
Post #12





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Prywatne właściwości są po to, żeby uniemożliwić zmianę ich wartości z zewnątrz. Ja je poprostu przepisuję do instancji klasy dziedziczącej...

EDIT:
ehh, trochę się wygłupiłem. biggrin.gif Żeby poustawiać prywatne właściwości i tak muszę mieć jakąś metodę dostępową co rzeczywiście nie pasuje do podejścia obiektowego. Tak to wygląda:
  1. <?php
  2. class A
  3. {
  4. private $a;
  5. protected $b;
  6. public $c;
  7.  
  8. function __construct($a, $b, $c)
  9. {
  10. $this->a = $a;
  11. $this->b = $b;
  12. $this->c = $c;
  13. }
  14.  
  15. protected function getVariables()
  16. {
  17. return get_object_vars($this);
  18. }
  19.  
  20. protected function setVariable($var,$value)
  21. {
  22. $this->$var = $value;
  23. }
  24. }
  25.  
  26. class B extends A
  27. {
  28. public function __construct($objA)
  29. {
  30. foreach($objA->getVariables() as $key => $value)
  31. {
  32. $this->setVariable($key, $value);
  33. }
  34.  
  35. }
  36.  
  37.  
  38. }
  39.  
  40.  
  41. $obj= new A('pierwsza', 'druga', 'trzecia');
  42. $obj = new B($obj);
  43.  
  44. var_dump($obj); // ["a:private"]=>"pierwsza" ["b:protected"]=>"druga" ["c"]=>"trzecia"
  45. ?>


Brakuje mi możliwości tworzenia obiektu klasy dziedziczącej na podstawie instancji klasy rodzica z zachowaniem wartości wszystkich właściwości (ale zdanie) więc musi tak to zostać... jednak rozumiem bezsens tego rozwiązania :/

Pozdrawiam i czekam na ewentualne wnioski/propozycje/sugestie/rady/bluzgi

Ten post edytował ayeo 12.04.2008, 21:26:07


--------------------
Go to the top of the page
+Quote Post
Sedziwoj
post 12.04.2008, 21:51:09
Post #13





Grupa: Zarejestrowani
Postów: 793
Pomógł: 32
Dołączył: 23.11.2006
Skąd: Warszawa

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


Ogólnie po to są właściwości prywatne, aby nawet dziedziczące klasy nie wpychały do nich nosa. Reprezentować powinny wewnętrzny stan obiektu, który powinien być tylko dla niego dostępny. Więc próba dostępu do nich przez obiekt dziedziczący jest, z punktu widzenia teoretycznego, bezsensowna.
Tak więc moim zdaniem powinno się dać to inaczej rozwiązać, np. przez pobieranie potrzebnych informacji przez metody. Jeśli nie możesz się do nich dostać inaczej nie przez normalny interfejs, to znaczy że 1) próbujesz zrobić coś czego nie powinieneś 2) klasa którą chcesz wykorzystać jest źle napisana.


--------------------
Algorytmy w PHP, czy ktoś o tym słyszał?
Dlaczego tak mało kobiet programuje? ponieważ nie zajmują się głupotami.
Go to the top of the page
+Quote Post
ayeo
post 12.04.2008, 21:56:16
Post #14





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Chodzi o to, że konstruktor klasy A pobiera dane z bazy danych. Klasa wykorzystuje właściwości prywatne, żeby określić czy dane zostały załadowane czy nie (to tylko przykład). Cały ten cyrk jest po to, żeby tworząc obiekt B nie musieć powtarzać tego zapytania do bazy. Jednak wyraźnie widać, że nawet właściwości prywatne muszą zostać przepisane... W sumie jakby zrobić taki mini-cache w warstwie abstrakcji dla bazy to dodatkowe (takie samo) zapytanie nie robi nikomu krzywdy. Sam już nie wiem biggrin.gif


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post 12.04.2008, 23:24:12
Post #15





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


A nie mozesz od razu utworzyc tego Studenta?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
ayeo
post 12.04.2008, 23:38:19
Post #16





Grupa: Przyjaciele php.pl
Postów: 1 202
Pomógł: 117
Dołączył: 13.04.2007
Skąd: 127.0.0.1

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


Długa historia biggrin.gif User jest tworzony automatycznie i siedzi w sesji... Myślałem na fabryką, ale no się nie da biggrin.gif Chociaż muszę to chyba zrobić inaczej wszystko bo strasznie mi się to nie podoba teraz :/


--------------------
Go to the top of the page
+Quote Post

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: 18.06.2025 - 19:10