Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] prototype like in JavaScript - jedna własność...
Forum PHP.pl > Forum > PHP > Object-oriented programming
zegarek84
jak w tytule - chodzi mi bardziej o pewną własność - wiem, że można to zastosować przez iniekcję obiektów oraz magiczne __call i __get ale może da się jeszcze prościej np. jakoś dodatkowo wykorzystując funkcje anonimowe które w końcu są obiektami a więc przekazywane przez referencjęquestionmark.gif... i teraz meritum i fragmenty kodu dla tych co rozumieją JavaScript - chodzi mi o uzyskanie funkcjonalności z dziedziczonych obiektów gdzie nie znajduje własności u potomnych szuka u rodziców w gorę puki nie jest przesłoniona lub zdeklarowana własność po drodze - ale mam na myśli dynamiczną własność która by także się zmieniała w stworzonych obiektach... jeśli nie będzie jakichś wskazówek obuduję inne obiekty ale kodziki z js....:
[JAVASCRIPT] pobierz, plaintext
  1. p = {a:3};
  2. c = function(){};
  3. c.prototype = p;
  4. d = new c;
  5. console.log(d); //d.a===3
[JAVASCRIPT] pobierz, plaintext

[JAVASCRIPT] pobierz, plaintext
  1. p = {a:3};
  2. c = function(){};
  3. c.prototype = p;
  4. d = new c;
  5. p.a = 6;
  6. console.log(d); //d.a===6
[JAVASCRIPT] pobierz, plaintext

[JAVASCRIPT] pobierz, plaintext
  1. p = {a:3};
  2. c = function(){};
  3. c.prototype = p;
  4. d = new c;
  5. p.a = 6;
  6. d.a = 5;
  7. console.log(d); //d.a===5
[JAVASCRIPT] pobierz, plaintext

[JAVASCRIPT] pobierz, plaintext
  1. p = {a:3};
  2. c = function(){};
  3. c.prototype = p;
  4. d = new c;
  5. p.a = 6;
  6. d.a = 5;
  7. delete d.a;
  8. console.log(d); //d.a===6
[JAVASCRIPT] pobierz, plaintext


Czyli dokładniej chodzi mi o dynamiczną podmianę pewnej własności u dzieci już stworzonych - może ktoś coś podobnego implementował - nie chcę podawać kodów gdyż może od php 5.3 jest jakiś naturalniejszy sposób od tego co ja widzę - a dróg jest kilka - albo skorzystać z zmiennych statycznych i odpowiednio to obudować, albo przez iniekcję innych obiektów, albo przez metody dostępowe prywatne i publiczne - ogólnie chciałbym zobaczyć kilka możliwych rozwiązań działających podobnie w php jak kod powyżej - mogą być linki do angielskich lub rosyjskich blogów...

i jeszcze raz podkreślam, że nie chodzi mi o sam wzorzec prototype a o jedną własność występującą w JavaScript gdzie dynamicznie jeśli potomek nie nadpisze czy to w swoim prototypie tej własności lub w już stworzonym obiekcie własności tihs.a to odwołujemy się do najbliższego przodka, gdzie ta własność [nie tylko zmienna ale i funkcja] jest zdefiniowana - trochu to przypomina zmienne statyczne gdzie podmienimy w jednej z klas a zmienia się we wszystkich powiązanych jednak nie o to chodzi ;]

wiem, że ktoś może powiedzieć, że to szukanie dziury w całym skoro wiem jak to zaimplementować ale może można prościej niż ja to widzę i czekam na jakiekolwiek odpowiedzi ^^

pozdrawiam zegarek84
Crozin
Cóż... dlatego wyróżniamy te dwa typy modelu obiektowego (class-based i prototype-based) ponieważ oferują one na dobrą sprawę zupełnie inne właściwości i sposób pracy. To co chcesz osiągnąć nie jest takie łatwe do uzyskania w modelu opartym o klasy.

1. Mógłbyś napisać jaki jest cel takiej struktury? Może da się ją inaczej zaprojektować w bardziej naturalny dla modelu klasowego sposób?
2. Olej PHP ? użyj Node.js smile.gif
Fifi209
Mniej więcej rozumiem o co chodzi, wymodziłem coś takiego:
  1. class A {
  2.  
  3. private $a = 'a';
  4. private $parent = false;
  5.  
  6. public function __get($name) {
  7. if (isset($this->$name)) {
  8. return $this->$name;
  9. }else{
  10. if ($this->parent == true)
  11. return parent::__get($name);
  12. }
  13. }
  14.  
  15. }
  16.  
  17. class B extends A{
  18.  
  19. private $b = 'b';
  20. private $parent = true;
  21.  
  22. public function __get($name) {
  23. if (isset($this->$name)) {
  24. return $this->$name;
  25. }else{
  26. if ($this->parent == true)
  27. return parent::__get($name);
  28. }
  29. }
  30.  
  31. }
  32.  
  33. class C extends B{
  34.  
  35. private $c = 'c';
  36. private $parent = true;
  37.  
  38. public function __get($name) {
  39. if (isset($this->$name)) {
  40. return $this->$name;
  41. }else{
  42. if ($this->parent == true)
  43. return parent::__get($name);
  44. }
  45. }
  46.  
  47. }
  48.  
  49. $obj = new C;
  50. echo $obj->a;
  51. echo $obj->b;
  52. echo $obj->c;


Sprawdza czy zmienna istnieje, jeżeli nie to szuka w rodzicu. Główną wadą jest potrzeba zaznaczenia czy posiada rodzica.
Crozin
@fifi209: Gratulacje! Prawdopodobnie nigdy w życiu nie widziałem lepszego przykładu do czego prowadzi nadużywanie magii w PHP - pomińmy już fakt, że nie ma to kompletnie nic wspólnego z tematem.
zegarek84
@fifi209 - tyle, że mi chodziło o dynamiczną własność także dla istniejących obiektów...
Cytat(Crozin @ 6.03.2011, 01:29:36 ) *
1. Mógłbyś napisać jaki jest cel takiej struktury? Może da się ją inaczej zaprojektować w bardziej naturalny dla modelu klasowego sposób?

Właśnie na razie konkretnego celu nie mam - tylko po prostu też materiałów nie mogę znaleźć jak robią to inni - zawsze lepiej porównać kilka rozwiązań... torche podobnie jak raz ktoś wspomniał o połączeniach asynchronicznych - pomijając curl'a php na socketach także wspiera połączenia asynchroniczne - potem jakoś ubzdurała mi się "zdarzeniówka" i połączenia asynchroniczne z bazą danych - większość materiałów co znalazłem przypominały moje obejścia gdyż wcześniej w php nie było to możliwe - jednak jak pogrzebałem dłużej okazało się, że php od wersji 5.3 umożliwia połączenia asynchroniczne z bazą mysql ;]

niby po części do tego problemu na szybko trochę pasuje własność zmiennych statycznych - z tym, że nie można ich przesłonić nie zmieniając wartości u rodziców - przesłoniecia można zaimplementować przez odpowiednią iniekcję żywych obiektów np. do tablicy/"stosu" i obudowanie tego stosu lub na kilka innych sposobów...

po prostu zadałem pytania by zobaczyć jak to robią inni jeśli w ogóle robią gdyż albo nie wiem co wpisywać w tych wyszukiwarkach albo nic nie ma w sieci na ten temat - ale jako, że w sieci jest wszystko to może ktoś akurat zna linki lub może się okaże, że jest jakiś "naturalniejszy" sposób na to wink.gif
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.