Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Tworzenie metod dostępowych przy użyciu komentarzy
Forum PHP.pl > Forum > PHP
ZiaRek
Witam serdecznie, przerabiam książkę o zaawansowanym programowaniu w PHP, i utkwiłem w jednym miejscu.

Jak programuje się funkcję która korzysta z komentarzy, tzn:

  1. class Example
  2. {
  3. /**
  4.  *@readwrite
  5.  */
  6. protected $_pierwsza;
  7.  
  8. /**
  9.  *@read
  10.  */
  11. protected $_druga
  12. }
  13.  
  14. $example = new Example();
  15. $example->setPierwsza("obojetnie")->setDruga("nieistotne");
  16. echo $example->getPierwsza();


Jak napisać do tego metodę która "czyta" komentarze i w zależności od flagi @read lub @readwrite sprawdza czy można użyć automatycznej metody dostępowej za pomocą __call bez pisania dla każdej zmiennej oddzielnych metod dostępowych.
Crozin
Przede wszystkim dlaczego nie zrobisz normalnych getterów/setterów? Będą pod każdym względem lepsze od tego co próbujesz tutaj osiągnąć.

Wracając do tematu. Da się to częściowo osiągnąć. Musiałbyś stworzyć narzędzie, które byłoby wstanie wyciągnąć adnotacje z kodu, utworzyć nową klasę która dziedziczyła by po bazowej, a która posiadałaby metody dostępowe. Oczywiście wiązałoby się to z pewnymi ograniczeniami, ale jako tako zapewne działałoby. Ostateczne użycie kodu wyglądałoby tak:
  1. $someFactory = ...;
  2.  
  3. $example = $someFactory->newInstance('Example');
  4. $example->setPierwsza('...')->setDruga('...');
  5.  
  6. var_dump($example); // jakaś klasa typu ABCDEF___AUTOGENERATED___Example
Jednak będzie to powodowało jedynie więcej problemów niż pożytku.
Pyton_000
2 pytania
1. W książce nie napisali?
2. Na cho... Ci takie dziwactwa? Symfony się naoglądałeś ?
ZiaRek
W książce opisali ale jest na takim poziomie że ciężko mi to zrozumieć. Nie znalazłem żadnego fragmentu (autor niestety przyjmuje tą sprawę za oczywistość) który ściśle odnosiłby się do metody która czyta te komentarze, myślałem że ktoś tutaj będzie wiedział o co chodzi.

Można oczywiście zrobić normalne gettery i settery ale zmusza to programistę do powielania kodu. A dzięki temu rozwiązaniu oczyszczasz klasę i skupiasz się na logice biznesowej zamiast na wywoływaniu atrybutów.

Szczerze mówiąc, trochę dziwi mnie wasze podejście, ja np. lubię się rozwijać a nie stać w miejscu, sorry ale moim celem nie jest zostanie "klepaczem kodu".
Crozin
W PHP takie mechanizmy nie istnieją, a ich realizacja jest nietrywialna, autor raczej nie przyjął tego za oczywistość - być może miał coś innego na myśli?
Cytat
Można oczywiście zrobić normalne gettery i settery ale zmusza to programistę do powielania kodu.
I tak właśnie powinieneś zrobić. Nie będzie tam żadnego powielonego kodu, ponieważ każda metoda będzie robić coś innego. Co najwyżej można tutaj mówić o tzw. boilerplate code, ale od tego masz dowolne IDE z możliwością wygenerowania tych getterów/setterów. Także nie musisz się na tym skupiać.
Cytat
Szczerze mówiąc, trochę dziwi mnie wasze podejście, ja np. lubię się rozwijać a nie stać w miejscu, sorry ale moim celem nie jest zostanie "klepaczem kodu".
Tylko, że tutaj nie ma żadnego rozwoju. Tak, pełnoprawne właściwości na kształt tych z C# skróciłby nieco kod, ale same w sobie niczego specjalnie rozwojowego nie wprowadzają. Tutaj jest to zwyczajnie ograniczenie języka i używanie klasycznych getterów/setterów jest najlepszym rozwiązaniem w PHP.
Cytat
Na cho... Ci takie dziwactwa? Symfony się naoglądałeś ?
A co Symfony ma tutaj do rzeczy?
Pyton_000
Symfony bardzo lubuje się w różnych zaklętych własnościach zapisanych w komentarzu przed metodami/klasami stąd moje porównanie.

Ad tematu. Ja osobiście nie widzę w tym nic rozwojowego. Ot tworzenie nowego mechanizmu który pozwoli zastąpić coś co jest i działa. Nie chcesz tworzyć set i get? Możesz używać __get i __set. Nie jest to idealne rozwiązanie ale pozwoli Ci nie "klepać kodu" jak to określiłeś.

Osobiście mam wrażenie że część autorów piszących książki o PHP (a może raczej wydawcy?) skupiają content książki dookoła Java i mianują to jako książka do PHP.
by_ikar
Cytat(Pyton_000 @ 9.05.2014, 19:51:37 ) *
2. Na cho... Ci takie dziwactwa? Symfony się naoglądałeś ?


Odniosę się tylko do tego fragmentu, który już o podobnej treści w kilku miejscach w internecie poprostu wyłożył mnie doszczętnie. Najlepszym tego przykładem był jakiś news z informacją o tym że phpBB będzie bazować na symfony. Nagle masa komentarzy:

Cytat
Szkoda że Symphony a nie Laravel, najlepszy, według wielu programistów PHP, framework. Ale na szczęście FluxBB przechodzi na niego. I znacznie łatwiej go zintegrować z nim.


Cytat
i czemu na taki kombajn.. CakePHP by wzięli czy właśnie jak wyżej Laravel. szkoda


Cóż pomijając fakt że laravel bazuje na komponentach symfony, to podpisuje się pod tym co napisał autor tematu. w symfony to nie tylko jeden słuszny sposób na zapisywanie regułek do routingu jako komentarze do akcji kontrolera.. Przecież jak sobie skonfigurujesz, tak używasz, nikt cię nie zmusza do czegoś takiego, jest to tylko feature, dzięki czemu można sobie ułatwić pracę, zamiast grzebać przykładowo w 2 plikach (routing + kontroler), a tak piszemy dokumentacje w postaci komentarzy + logikę a efekt jest podobny. Tyle że też nikt do tego nie zmusza i w sumie prócz symfony standard vendors nie spotkałem się żeby ktoś usilnie tego próbował używać. Co nie oznacza że nie można o tym wiedzieć.

ZiaRek
ok znalazłem rozwiązanie :

http://www.php.net/manual/en/reflectioncla...tdoccomment.php
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.