Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Klasa główna i podklasy
Forum PHP.pl > Forum > PHP
busterek
Witajcie.
Dręczy mnie jeden problem, natury projektowej. Stowrzyłem jakiś czas temu zbiór funkcji, głównie dla siebie, które pomagają mi przy towrzeniu różnych projektów. Funkcje te, połączyłem w klasy. Wszystko działa, jednak gdy towrzę moduły, to środowisko IDE (NetBeans) nie podpowiada mi funkcji. Może przytoczę przykład:

  1. <?php
  2.  
  3. class site
  4. {
  5. var $class1;
  6. var $class2;
  7.  
  8. function site()
  9. {
  10. $this->class1 = new class1();
  11. $this->class2 = new class2();
  12. }
  13. }
  14.  
  15. class class1
  16. {
  17. function klasa1funkcja1()
  18. {
  19. echo 'To jest funkcja 1 w klasie 1.<br />';
  20. }
  21. function klasa1funkcja2()
  22. {
  23. echo 'To jest funkcja 2 w klasie 1.<br />';
  24. }
  25. }
  26.  
  27. class class2
  28. {
  29. function klasa2funkcja1()
  30. {
  31. echo 'To jest funkcja 1 w klasie 2.<br />';
  32. }
  33. function klasa2funkcja2()
  34. {
  35. echo 'To jest funkcja 2 w klasie 2.<br />';
  36. }
  37. }
  38.  
  39. $site = new site();
  40.  
  41. $site->class1->klasa1funkcja1();
  42. $site->class1->klasa1funkcja2();
  43. $site->class2->klasa2funkcja1();
  44. $site->class2->klasa2funkcja2();
  45.  
  46. ?>


W momencie kiedy piszę kod i nacisnę kombinację ctrl + spacja po napisaniu $site-> podpowiada mi zmienne i funkcje klasy site. Kiedy wybiorę podklasę class1, czyli w kodzie mam następującą konstrukcję: $site->class1-> i nacisnę wyżej wspomnianą kombinację klawiszy, wtedy NetBeans stwierdza, że nie może mi nic podpowiedzieć. Po wpisaniu funkcji z palca wszystko działa. Jednak jest to uciążliwe, gdyż muszę pamietać kilkadziesiąt funkcji zapisanych w podklasach. Czy da się jakoś to zrobić, aby to działało??
nospor
A niby skad Twoj edytor ma wiedziec, ze akurat obiekt class1 jest obiektem klasy Class1? Takie rzeczy mowi sie poprzez odpowiednie komentarze przy deklaracji wlasciwosci klasy.

Poczytaj o PHPDoc
Tuminure
Zamień
  1. function site()
na
  1. function __construct()

i gotowe wink.gif.

Cytat
A niby skad Twoj edytor ma wiedziec, ze akurat obiekt class1 jest obiektem klasy Class1?

Stąd, że tworzy przecież te obiekty.
Sephirus
Jeśli korzystasz z NB to PHPDoc bardzo ładnie będzie CI podpowiadał metody klas o ile tylko dobrze użyjesz annotacji/komentarzy czyli /** @costam costam */ - nie chcę za dużo podpowiadać.

Dodam jedynie, że NB sam ładnie generuje PHPDoc'a jeśli zaczniesz wpisywać /** i dasz [enter] nad deklaracją funkcji/klasy/metody/zmiennej itd - musisz tylko wówczas uzupełnić dany komentarz. Fajnym i przydatnym skrótem do dokumentowania zmiennych wewnątrz kodu jest kombinacja klawiszy "vdoc[tab]" nad zmienną, którą chcesz opisać.
)
Trochę razi mnie w oczy przedpotopowa obiektówka jaką tu pokazałeś. Na dzień dzisiejszy trzeba by przepisać klasę "site":

  1. class site
  2. {
  3. public $class1;
  4. public $class2;
  5.  
  6. function __construct()
  7. {
  8. $this->class1 = new class1();
  9. $this->class2 = new class2();
  10. }
  11. }


i trzymać się tego wink.gif

EDIT: zmieniłem dostęp z private na public - ze względu na wykrozystanie przez autora tematu - proponowałbym tu jednak zastosować gettery.
nospor
@Tuminure do tego sluzy PHPDoc jak juz pisalem i jak pisal Sephirus.

A jak jakis geniusz zrobi tak:
$this->class1 = new class1();
a potem
$this->class1 = new class2();

To skad edytor ma wiedziec co podpowiadac?
Tuminure
Nie przeczę, że tworzenie PHPDoca to zły pomysł, jednak NB rozpoznaje metody bez tego.

Cytat
To skad edytor ma wiedziec co podpowiadac?

Na podstawie analizy kodu prawdopodobnie. Nie mam nic wspólnego z kodem źródłowym NB, więc nie wiem czemu to działa ale działa - powiedziałbym, że działa dokładnie tak jak chcę (i jak uważam, że powinien), podczas testowania przykładu podanego przez Ciebie.
webmaniak
Cytat(Sephirus @ 1.10.2013, 10:46:01 ) *
[...] Fajnym i przydatnym skrótem do dokumentowania zmiennych wewnątrz kodu jest kombinacja klawiszy "vdoc[tab]" nad zmienną, którą chcesz opisać.[...]

Mógłbyś bardziej to opisać? o jakie klawisze chodzi?
buliq
Cytat(Tuminure @ 1.10.2013, 14:52:32 ) *
Nie przeczę, że tworzenie PHPDoca to zły pomysł, jednak NB rozpoznaje metody bez tego.


A jaki jest zakres dla którego NB rozpoznaje?
Nie jest to system idealny, a odpowiednie udokumentowanie typów mu to ułatwia i nie ma opcji żeby źle podpowiedział.
Sephirus
@Tuminure - masz rację w przypadku konstruktora NB sobie poradzi i będzie wiedział co podpowiedzieć dla danej własności klasy/obiektu. Mimo to bardzo dobrą praktyką jest komentowanie i używanie PHPDoc. Jeśli własność będzie inicjalizowana w metodzie "x" a nie konstr. to po jej wywołaniu NB już tego nie załapie niestety bo nie może przetwarzać całego kodu wink.gif

@webmaniak

Masz np coś takiego:

  1.  
  2. $c = $registry['config']['dev']['cache']; // czysta teoria - ciężko żeby NB połapał się co jest na tym poziomie zagłębienia tablicy.
  3.  


Powiedzmy, że pod $c wrzuci Ci obiekt klasy My_Cache_Class do obsługi cacheowania czegośtam na stronie. Chcesz żeby po wpisaniu $c-> podpowiedziało Ci metody.

Robisz tak:

stawiasz kursor nad zmienną $x, naciskasz po kolei literki v,d,o,c (skrót - VDOC) i naciskasz [tab]. Inaczej mówiąc wpisujesz słowo vdoc i naciskasz TAB.

Pojawi Ci się coś takiego:

  1. /* @var $c ClassName */
  2. $c = $registry['config']['dev']['cache']; // czysta teoria - ciężko żeby NB połapał się co jest na tym poziomie zagłębienia tablicy.


podmieniasz "ClassName" na to co potrzebujesz i już (nazwa klasy itp):

  1. /* @var $c My_Cache_Class */ // ot taki przykład
  2. $c = $registry['config']['dev']['cache']; // czysta teoria - ciężko żeby NB połapał się co jest na tym poziomie zagłębienia tablicy.
webmaniak
Dzięki, nie zaczaiłem na początku z tym vdoc smile.gif jeśli znasz więcej takich skrótów, albo link do jakiś artykułów i chciałbyś się podzielić to będę wdzięczny za wiadomość na priv smile.gif - nie chce już tu robić off-topa smile.gif
busterek
A słuchajcie. Bo kiedy mam kod, jak zaprezentowany, to działa wyśmienicie. Zmienne podpowiadają się wspaniale. Ale kiedy klasy przerzucie do oddzielnych plików, a następnie w pliku index.php dołącze je poprzez require_once, to wtedy podpowiada tylko zmienną z klasy site, a dalej już nie. I teraz nie wiem, czy to jest wina NB, czy czegoś innego. Podpowiecie?
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.