Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> dostęp do klasy
mareczek2
post
Post #1





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 30.04.2007

Ostrzeżenie: (0%)
-----


  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.

Ten post edytował mareczek2 30.04.2007, 21:21:51
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
sticker
post
Post #2





Grupa: Zarejestrowani
Postów: 611
Pomógł: 19
Dołączył: 28.02.2005
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


nie rozumiem co chcesz zrobić (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) Popraw treść i postaraj sie lepiej wytłumaczyć przypuszczam że chodzi Ci o dziedziczenie ale to moze tylko mydlą mi sie oczy (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
menic
post
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
devnul
post
Post #4





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


da się da - troche pomyślunku (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/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()

Ten post edytował devnul 30.04.2007, 22:44:30
Go to the top of the page
+Quote Post
menic
post
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


No pomysł ciekawy (IMG:http://forum.php.pl/style_emoticons/default/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.
Go to the top of the page
+Quote Post
mareczek2
post
Post #6





Grupa: Zarejestrowani
Postów: 4
Pomógł: 0
Dołączył: 30.04.2007

Ostrzeżenie: (0%)
-----


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

Ten post edytował mareczek2 30.04.2007, 22:53:07
Go to the top of the page
+Quote Post
devnul
post
Post #7





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


A prosze (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
menic
post
Post #8





Grupa: Zarejestrowani
Postów: 493
Pomógł: 0
Dołączył: 14.06.2003
Skąd: Tomaszów Lubelski/Rzeszów

Ostrzeżenie: (0%)
-----


NIe wymagałoby. Poprostu sprawdzasz w konstruktorze czy przekazany obiekt jest typu ktory jest dozwolony. Mozesz to wlasnie osignac za pomocą instanceof (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Tylko własnie w tym przypadku istnieje mozliwosc "podlozenia" jakiegos bubla.

Ten post edytował menic 1.05.2007, 10:51:12
Go to the top of the page
+Quote Post
devnul
post
Post #9





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


czyli chcesz jako parametr przekazywac, no to faktycznie troche za duże zaufanie do potencjalnego usera
Go to the top of the page
+Quote Post
faster
post
Post #10





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 9.09.2002
Skąd: Pszczyna

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/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
Go to the top of the page
+Quote Post
devnul
post
Post #11





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


@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
Go to the top of the page
+Quote Post
prond
post
Post #12





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.

Ten post edytował prond 4.05.2007, 11:53:43
Go to the top of the page
+Quote Post
devnul
post
Post #13





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

Ostrzeżenie: (0%)
-----


@prond: przeczytaj wątek od początku, wspominałem o tym w sowim pierwszym poscie.
Go to the top of the page
+Quote Post
prond
post
Post #14





Grupa: Zarejestrowani
Postów: 254
Pomógł: 10
Dołączył: 8.11.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Sorki, wcześniej nie zauważyłem EDIT'a tylko wykorzystanie wyjątków.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 06:46