Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: klasy (kolejny raz)
Forum PHP.pl > Forum > PHP
Thaal
Witam!!

Pisze sobie własnie taki mały system do obsługi artykułów. Do systemu maja dostęp dwie kategorie użytkowników: user i admin.
Do obsługi artykułów jest stworzona klasa 'articles', w ktorej mam takie metody jak:
- wyświetl liste
- wyswietl artykul
- dodaj artykuł
- zablokuj artykuł
I teraz pytanie:
Czy dziedziczenie (klsay 'admin' i 'user' dziedziczą z klasy 'articles') jest dobrym rozwiązaniem?? Bo w takim przypadku obiekt 'user' ma dostęp do metod, które nie są mu przeznaczone (i w rzeczywistości niewiele się różni od obiektu klasy 'admin', a w takim przypadku nie ma sensu tworzyc osobnej klasy 'user'). I żeby to obejść nalezy jeszcze raz zdefiniować metody 'dodaj artykuł' i 'zablokuj artykuł' w klasie user.
Drugie co mi do głowy przyszło to przekazanie utworzonego obiektu 'articles' do obiektów klas 'user' i 'admin'', a tam będą metody odpowiedzialne za wyświetlanie/edycje artykulów w zalezności od potrzeb (beda wywoływały metody obiektu 'articles').

Czy ktoś lepiej znający ode mnie temat mógłby jakos ustosunkować się do powyższego?? snitch.gif

W drugim rozwiązaniu mozna jeszcze wyprowadzic klasę 'admin' z klasy 'user' - ale nad tym się jeszcze zastanowię biggrin.gif


P.S. jakby były problemy ze zrozumieniem tego co napisałem to przepraszam biggrin.gif
scanner
Użytkownik dziedziczy po artykułach?
E... Wątpię.

Zamiast tego, lepiej w okreslonej metodzie np. Articles->Add() sprawdizć poziom dostepu. Ot, choćby:
  1. <?php
  2. class Articles
  3. {
  4. // ...
  5. function Add()
  6. {
  7. if( !$User->CheckLvl( 'admin' ) )
  8. {
  9. die( 'Nie masz uprawnien' );
  10. }
  11. }
  12. // ...
  13. }
  14. ?>
Ocaywiście obiekt User przechowuje w swoich właściwościach daną:
  1. <?php
  2. $User->accessLevel = '';
  3. ?>
Która przytbiera wartość pobraną z bazy.

Tworzenie dwu obiektów "admnin", "user" jest nielogioczne. Przeciez to ten sam obiekt. tylko że jedna z jego właściowści ma różna wartość.
byther
Tutaj całkiem nieźle może zadziałać coś takiego:
  1. <?php
  2. // Operujemy na elementach, których cechy reprezentują metody.
  3. class element
  4. {
  5. function wyswietl()
  6. {
  7. // nadpisywane przy dziedziczeniu
  8. }
  9. function dodaj()
  10. {
  11. // nadpisywane przy dziedziczeniu
  12. }
  13. function zablokuj()
  14. {
  15. // nadpisywane przy dziedziczeniu
  16. }
  17. }
  18.  
  19. // Użytkownik może wyświetlić, dodać lub zablokować element.
  20. class rola
  21. {
  22. function wyswietl( &$element )
  23. {
  24. $element->wyswietl();
  25. }
  26. function dodaj( &$element )
  27. {
  28. $element->dodaj();
  29. }
  30. function zablokuj( &$element )
  31. {
  32. $element->zablokuj();
  33. }
  34. }
  35.  
  36. // Użytkownik (rola \"User\") nie może zablokować posta.
  37. class user extends rola
  38. {
  39. function zablokuj()
  40. {
  41. die( &#092;"Nie masz uprawnień!\" );
  42. }
  43. }
  44.  
  45. // Użytkownik (rola \"Admin\") może zablokować.
  46. // Przykład minimum kodu do stworzenia nowej roli.
  47. class admin extends rola
  48. {
  49. }
  50.  
  51. // Artykuł to element...
  52. class artykul extends element
  53. {
  54. function wyswietl()
  55. {
  56. // tutaj zaimplementuj metodę wyswietl()
  57. }
  58. function dodaj()
  59. {
  60. // tutaj zaimplementuj metodę dodaj()
  61. }
  62. function zablokuj()
  63. {
  64. // tutaj zaimplementuj metodę zablokuj()
  65. }
  66. }
  67.  
  68. // Lista artykułów również jest elementem.
  69. class listaArtykulow extends element
  70. {
  71. function wyswietl()
  72. {
  73. // wyświetlenie listy artykułów
  74. }
  75. function zablokuj()
  76. {
  77. // zaimplementuj blokowanie listy artykułów
  78. }
  79. function dodaj()
  80. {
  81. // dodanie wielu artykułów?
  82. }
  83. }
  84.  
  85. ?>


Full OOP. winksmiley.jpg Rozwiązanie nie jest efektywne, bo stworzenie nowej roli użytkownika wymaga stworzenia klasy dziedziczącej po klasie osoba. Wprawka w OO-php? smile.gif
scanner
Jeszcze raz zapytam.
Po grzyba atomowego dwie klasy "Admin" i "User" skoro admin to user, tylko ma inną wartość jednej właściwosci?

Czemu user ma metodę DodajArtykuł? Czy jego rola.. co ma rola usera do opcji artykułu? tylko poziom dostepu.

Już to kiedyś pisałem...
"Nie sztuką jest pisac obiektowo. Sztuką jest obiektowo myśleć"
Thaal
Cytat
Użytkownik dziedziczy po artykułach?
E... Wątpię.

ciii... mnie tak na uczelni uczyli...
chyba że Rzeszów nie jest potęgą informatyczną winksmiley.jpg


a wracajac do tematu: to w takim razie 'admin' dziedziczy po 'user', dodać do niego kilka metod, i sprawa powinna być załatwiona biggrin.gif
scanner
Po co admin dziedziszy po uiser?
Ludzie...
ratunku!!!!



User wywołuję metode dodaj obiektu Artykuł.
Sam takej jmetody nie posiada, bo człowiek nie ma mołziwosci wysunięcia papieru z siebie, tylko z drukarki... Czyli to drukarka ma metodę "wysuń" i Zenek jej nie dziedziczy - Zenek ją używa. A drukarka sprawdza, czy zenek może jej użyć.
byther
Cytat(scanner @ 2004-07-05 14:50:42)
[...] bo człowiek nie ma mołziwosci wysunięcia papieru z siebie [...] Zenek jej nie dziedziczy - Zenek ją używa. A drukarka sprawdza, czy zenek może jej użyć.

Scanner? Zastanawiałeś się nad prowadzeniem warsztatów? smile.gif
Thaal
Cytat
User wywołuję metode dodaj obiektu Artykuł.
Sam takej jmetody nie posiada, bo człowiek nie ma mołziwosci wysunięcia papieru z siebie, tylko z drukarki... Czyli to drukarka ma metodę "wysuń" i Zenek jej nie dziedziczy - Zenek ją używa. A drukarka sprawdza, czy zenek może jej użyć.

nic dodać nic ująć winksmiley.jpg

natomiast mam pytanie do:
Cytat
Po co admin dziedziszy po uiser?
Ludzie...
ratunku!!!!


więc:

user ma metody:
wyświetl listę (user zenek używa drukarki winksmiley.jpg )
wyświetl artykuł

admin, oprócz powyzszych posiada także:
dodaj artykuł
usuń artykuł

wobec czego kod może wygladać tak:
  1. <?php
  2.  
  3. //klasa user
  4. class user
  5. {
  6. function wyświetl listę()
  7. {
  8. //wyświetla listę artykułów
  9. }
  10.  
  11. function wyświetl artykuł()
  12. {
  13. //wyświetla artykuł
  14. {
  15. }
  16.  
  17. //klasa admin
  18. class admin extends user
  19. {
  20. function dodaj artykuł()
  21. {
  22. //dodaje artykuł
  23. }
  24.  
  25. function usuń artykuł()
  26. {
  27. //usuwa artykuł
  28. }
  29. }
  30.  
  31. ?>


i teraz dwa pytania:
1) czy powyższy kod jest zły??
2) co dokładnie oznacza okreslenie 'dziedziczy po' - bo być może ja źle je pojmuję
byther
Cytat(Thaal @ 2004-07-05 15:34:05)
i teraz dwa pytania:
1) czy powyższy kod jest zły??
2) co dokładnie oznacza okreslenie 'dziedziczy po' - bo być może ja źle je pojmuję

Przy wykorzystywaniu obiektów tych klas musisz pamiętać, który jakie ma metody. Chodzi o to, żeby wywołanie wyglądało mniej więcej tak:
  1. <?php
  2. $user->zablokuj( new artykul( $_GET['id'] ) );
  3. // lub
  4. $artykul->zablokuj( $user, $_GET['id'] );
  5. ?>

W pierwszym wypadku, jeżeli obiekt $user będzie instancją klasy user, to php zwróci błąd podczas kompilacji. Na pocieszenie: chcesz zabrać użytkownikowi uprawnienia do postowania, musisz przenieść metodę z klasy user do klasy admin. No i pozamiatane.
Drugie rozwiązanie jest "jakoś bardziej udane". W tym wypadku nie masz problemu ze zmianą uprawnień, bo obiekt klasy artykul samodzielnie sprawdzi uprawnienia.
DeyV
Thaal - a mi się wydaje, że ty nadal nie zreozumiałeś przykładu scannera dotyczącego drukarki.

Ja zrobiłbym to chyba tak
  1. <?php
  2.  
  3. class User
  4. {
  5. function isAdmin() { ... }
  6. }
  7.  
  8. class Article
  9. {
  10. function Article( &$User )
  11. {
  12.  $this->User =& $User ;
  13. }
  14. function add() 
  15. { 
  16. if( NOT $this->User->isAdmin() ) // forum nie wyświetla wykrzyknika questionmark.gif
  17. {
  18.  trigger_error( 'No access ');
  19. }
  20. }
  21. function edit() { ... }
  22. function wyswietl liste() { ... }
  23. function wyświetl artykuł() { ... }
  24. ?>
Sh4dow
Thaal czy ty przy urodzeniu dziecka wiesz ktory jest strazakiem, ktory ksiegowym a ktory redaktorem?
To dyskryminacja 'obiektowa'. tongue.gif
Moze tak to ci przedstawie, Jestem obiektem User, mam swoje nazwisko imie, adres i powiedzmy zawod. Obiektem artykul jest "Gazeta", ale Gazeta ma metode(straznik), ktora sprawdza czy moj zawod to redaktor, a ze nie jestem redaktorem to gazeta odmawia dodania mi artykulu. A Moj kolga jest takrze obiektem User, ale jego zawod rozni sie od mojego bo jest redaktorem, i jego metoda sprawdzajaca(straznik) dopuszcza do biurka z maszyna do pisania i on moze taki artykul napisac do Gazety.
Swiat sklada sie z obiektow, tak jak dom z cegiel.
Nastepna lekcja bedzie na klockach tongue.gif
Thaal
graduated.gif
człowiek uczy się całe życie


czyli z tego co zrozumiałem chciałem to wszystko zrobić "od du..." to znaczy "drugiej strony"...

dzięki....

i nie denerwujcie się za bardzo na mnie bo co jakiś czas będę jakies głupie pytanie zadawał tongue.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.