Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: dostęp do klasy
Forum PHP.pl > Forum > PHP > Object-oriented programming
mareczek2
  1. <?php
  2. class klasa {
  3. public function zrobcos() {
  4. //kod
  5. }
  6. }
  7. class klasaPierwsza {
  8. public function wykonaj() {
  9. $tmp = new klasa();
  10. $tmp->zrobcos();
  11. }
  12. }
  13. class klasaDruga {
  14. public function wykonaj() {
  15. $tmp = new klasa();
  16. $tmp->zrobcos();
  17. }
  18. }
  19. ?>

Witam,
potrzebuję zrobić coś takiego, żeby klasaPierwsza miała dostęp do 'klasa', a klasaDruga już nie, czyli potrzebuje czegoś takiego:
  1. <?php
  2. class klasa {
  3. function __construct() {
  4. if(wywolane z != klasaPierwsza) exit;
  5. }
  6. public function zrobcos() {
  7. //kod
  8. }
  9. }
  10. class klasaPierwsza {
  11. public function wykonaj() {
  12. $tmp = new klasa();
  13. $tmp->zrobcos();
  14. }
  15. }
  16. class klasaDruga {
  17. public function wykonaj() {
  18. $tmp = new klasa();
  19. $tmp->zrobcos();
  20. }
  21. }
  22. ?>

macie może jakiś pomysł jak to zrobić?


EDIT (co do wyjaśnienia):
mam kod taki jak ten u góry:
jest sobie klasa o nazwie "klasa" i problem jest w tym, że instancję tej klasy można robić z każdego miejsca, a chciałbym, aby jej instancję można było robić tylko z określonych innych klas.
sticker
nie rozumiem co chcesz zrobić smile.gif Popraw treść i postaraj sie lepiej wytłumaczyć przypuszczam że chodzi Ci o dziedziczenie ale to moze tylko mydlą mi sie oczy smile.gif
menic
Jedyne co możesz zrobić to skorzystać z dziedziczenia. Ustawic konstruktor jako protected i wtedy tylko klasa ktora dziedziczy bedzied mogla wywolac ta klase. Innego sposobu nie ma.
devnul
da się da - troche pomyślunku winksmiley.jpg
  1. <?php
  2. class klasa {
  3. function __construct(){
  4. try {
  5. throw new Exception("asd",1234);
  6. } catch (Exception $e){
  7. var_dump($e);//tej linijce się przyjzyj o rozszerz
  8. }
  9. }
  10. public function zrobcos() {
  11. //kod
  12. }
  13. }
  14. class klasaPierwsza {
  15. public function wykonaj() {
  16. $tmp = new klasa();
  17. $tmp->zrobcos();
  18. }
  19. }
  20. class klasaDruga {
  21. public function wykonaj() {
  22. $tmp = new klasa();
  23. $tmp->zrobcos();
  24. }
  25. }
  26. $k1=new klasaPierwsza();
  27. $k1->wykonaj();
  28.  
  29. $k2=new klasaDruga();
  30. $k2->wykonaj();
  31. ?>

pewnie da się to zrobić inaczej - ale jakoś tylko to mi w tej chwili do głowy przychodzi. oczywiscie gotowca nie ma ale jest wskazówka winksmiley.jpg

//edit : dla jasności - nie chodzi mi o wykorzystanie wyjątków - tylko mozliwości trasowania która jest zaimplementowana między innymi tam debug_backtrace()
menic
No pomysł ciekawy smile.gif
A inaczej mozesz zrobic dodajac przy wywołaniu $this i za pomocą instanceof sprawdzac czy ta klasa moze tworzyc nowy obiekt. Ale to jest metoda troche bardziej uciążliwa od tej devnull'a.
mareczek2
Cytat
A inaczej mozesz zrobic dodajac przy wywołaniu $this i za pomocą instanceof sprawdzac czy ta klasa moze tworzyc nowy obiekt

to nic mi nie da, bo wystarczy, że zamiast $this klasa wrzuci mi instancję jakiejś uprawnionej klasy - tak wiem klasy nie są żywe i same tego nie zrobią, ale poszczególne klasy nie są z "autoryzowanego" źródła

devnul, wielkie dzięki
devnul
A prosze smile.gif
@menic: czy rozwiązanie o którym mówisz nie wymagałoby dziedziczenia? chyba że coś źle zrozumiałem. Poza tym dziedziczenie nie daje gwarancji na poprawne działanie. Przynajmniej tak mi się zdaje
menic
NIe wymagałoby. Poprostu sprawdzasz w konstruktorze czy przekazany obiekt jest typu ktory jest dozwolony. Mozesz to wlasnie osignac za pomocą instanceof smile.gif

Tylko własnie w tym przypadku istnieje mozliwosc "podlozenia" jakiegos bubla.
devnul
czyli chcesz jako parametr przekazywac, no to faktycznie troche za duże zaufanie do potencjalnego usera
faster
Tylko zastanawiam się co takie zabezpieczenie mogłoby wnieść w logikę aplikacji? I tak w zasadzie nie zabezpieczysz się przez niewłaściwym użyciem danej klasy. Jeżeli trafisz na "specjalistę" to jest w stanie i klasę Drzewo wykorzystać jako List smile.gif. Natomiast wróćmy do Twojego problemu. co powiesz na takie rozwiązanie?

  1. <?php
  2.  
  3. class Klasa
  4. {
  5.  
  6. private function __construct()
  7. {
  8. }
  9.  
  10. public static function DoForKlasaPierwsza(KlasaPierwsza $klasa)
  11. {
  12. $klasa = new Klasa();
  13. $klasa->zrobcos();
  14. }
  15.  
  16. public function zrobcos()
  17. {
  18. //kod
  19. print('do it');
  20. }
  21. };
  22.  
  23. class KlasaPierwsza
  24. {
  25. public function wykonaj()
  26. {
  27. Klasa::DoForKlasaPierwsza($this);
  28. }
  29. };
  30.  
  31. class KlasaDruga
  32. {
  33. public function wykonaj()
  34. {
  35. Klasa::DoForKlasaPierwsza($this);
  36. }
  37. };
  38.  
  39.  
  40. $k1 = new KlasaPierwsza();
  41. $k1->wykonaj();
  42.  
  43. $k2 = new KlasaDruga();
  44. $k2->wykonaj();
  45.  
  46. ?>



Pozdrawiam
devnul
@faster: Twoje rozwiązanie wymaga przekazania parametru, który może być dowolny (bo równie dobrze zamiast $this możęsz przekazać instancję obiektu który pasuje do wzorca, ew dziedziczyć po klasie pierwszej i nadpisać odpowidnie metody. IMHO sposób zły
prond
A może tak :
  1. <?php
  2. function foo()
  3. {
  4. }
  5.  
  6. function bar()
  7. {
  8. foo();
  9. }
  10.  
  11. bar();
  12.  
  13. echo "------n";
  14.  
  15. foo();
  16. ?>


Zobacz co to zwraca - masz informację dot. co wywołało co i w jakiej kolejności.
devnul
@prond: przeczytaj wątek od początku, wspominałem o tym w sowim pierwszym poscie.
prond
Sorki, wcześniej nie zauważyłem EDIT'a tylko wykorzystanie wyjątków.
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.