Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wywolanie metod prywatnych/chronionych/publicznych
Forum PHP.pl > Forum > Przedszkole
Milczar
Mam może lamerski problem...
Mam klase w której mam zadeklarowane metody, częśc metod jest PUBLIC a czesc PRIVATE (zeby potomek klasy nie mial dostepu do nich). Powiedzmy niech klasa nazywa sie TEST. a metoda prywatna METODA_TESTOWA.

W kodzie tworze obiekt klasy test (wrzucam go w zmienna sesyjna).
$_SESSION['aaa'] = new TEST();
Nastepnie pare linijek niżej wywoluje:
$_SESSION[aaa']->METODA_TESTOWA().

Efektem na stronie jest:
Fatal error: Call to private method TEST::METODA_TESTOWA() from context '' in c:\wamp\www\index2.php on line 18

Taki sam efekt jest jak mam metode PROTECTED. Poprawnie wywołuja się jedynie metody PUBLIC. Czemu? Co robie źle, ze nie moge wywolac metod prywatnych/chronionych z obiektu klasy, w ktorej sa one zdefiniowane? nie można ich wywoływac wogóle?

Pozdrawiam i z góry dzięki za odpowiedź.
ennics
Cytat
nie można ich wywoływac wogóle?

nie można. Dlatego że są prywatne, tzn nie są dostępne dla klas dziedziczących
i z zewnątrz. Rozwiązania są dwa, oznaczyć metodę jako public, lub zdefiniować metodę akcesora:
  1. <?php
  2.  
  3. class Foo {
  4. private function metoda() {
  5. return 1;
  6. }
  7.  
  8. public function getMetoda() {
  9. return $this -> metoda();
  10. }
  11. }
  12.  
  13.  
  14. ?>
dtb
ennics: klsa dziedziczaca nie ma dostepu do metoda() ale ma dostep do getMetoda() ktora ja wywoluje wiec twoje rozwiazanie nic nie da.
Ustaw metode jako public i daj wewnatrz jej warunek sprawdzajacy w jakiej klasie sie znajduje. kiedy nazwa klasy w ktorej sie znajdu == nazwa klasy rodzica to wykonuje kod, inacze rzuca wyjatek
ennics
Cytat
klsa dziedziczaca nie ma dostepu do metoda() ale ma dostep do getMetoda() ktora ja wywoluje wiec twoje rozwiazanie nic nie da.

nie kumam... a miało coś dać poza dostępem do metody prywatnej ?

Cytat
Ustaw metode jako public i daj wewnatrz jej warunek sprawdzajacy w jakiej klasie sie znajduje. kiedy nazwa klasy w ktorej sie znajdu == nazwa klasy rodzica to wykonuje kod, inacze rzuca wyjatek


Nie wyraziłeś się zbyt jasno, masło maślane... Deklarując metodę jako public jawnie zgadzasz się żeby była wywoływana w klasach pochonych i z zewnątrz. Chcesz definiować dwie klasy o takich samych nazwach ? Po co ? rzuć jakiś kod...
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.