Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Statyczna wlaściwość tylko do odczytu
Forum PHP.pl > Forum > PHP > Object-oriented programming
bigZbig
Czy jest jakiś sposób aby statyczną wlaściwość klasy (klasa ma tylko wlasciwosci i metody statyczne) uczynic publiczna do odczytu i chronioną do zapisu?
nospor
  1. <?php
  2. class Test {
  3.  
  4. private static $_zm = 2;
  5.  
  6. public static function GetZm(){
  7. return self::$_zm;
  8. }
  9. }
  10.  
  11.  
  12. echo Test::GetZm();
  13. echo Test::$_zm;
  14. ?>
dr_bonzo
Tylko getter:

  1. <?php
  2. static public function getX()
  3. {
  4. return self::$X;
  5. }
  6. // lub
  7. public function __get( $name )
  8. {
  9.  if ( $name == 'X' )
  10.  {
  11. return self::$X;
  12.  }
  13. }
  14. ?>


---
edit: no i nie weim o ile sekund sie spoznilem

brakuje ofkorz: static private|protected (o jaki typ chronienia ci chodzilo?questionmark.gif) $X
bigZbig
@nospor - chodzilo mi wlasnie o unikniecie funkcji. Cos aby mozliwe bylo
  1. <?php
  2. //mozliwe
  3. echo Test::$_zm;
  4. //ale juz niemozliwe
  5. Test::$_zm = 'cos';
  6. ?>

@dr_bonzo - funkcja magiczna w tym wypadku nie pomoze bo to dziala tylko z obiektami, a ja nie mam zamaru tworzyc obiektu.
dr_bonzo
@bigZbig:
1. nie unikniesz funkcji, nie ma mozliwosci okreslania odczytu i zapisu zmiennej osobno, tylko okreslasz dostep (oczyt i zapis na raz)
2. __call() biggrin.gif no coz, dawno nie uzywalem biggrin.gif
nasty
chyba tylko define() ma taka funkcjonalnosc ....
NuLL
  1. <?php
  2. class cos
  3. {
  4. const lol=1;
  5. }
  6. echo cos::lol;
  7. ?>

Inaczej sie nie da smile.gif
bigZbig
Z obiektami i funkcjami magicznymi da sie cos takiego zrobic. Mialem nadzieje, ze z wlasciwosciami statycznymi tez to mozna jakos uzyskac.

NuLL - To rozwiązanie mnie nie zadawala ponieważ ja zamierzam zmieniac zawartosc tej wlasciwosci tyle ze wewnatrz klasy, natomiast zalezy mi na maksymalnie uproszczonym odczycie z zewnatrz.
dr_bonzo
bigZbig: metodai nic wiecej, m.in. po to sie chowa zmienne za akcesorami zeby moc kontrolowac dostep do nich

W Rubym masz:
Kod
...
attr_reader :zmienna
attr_writer :zmienna

co robia: umozliwiaja kolejno odczyt i zapis zmiennej obiektu (niestety nie klasy)
Ale w rzeczywistosci ruby automatycznie tworzy prostego settera i gettera dla tej zmiennej.
Sh4dow
tylko statucznie nie da sie tego zrobic chyba. Musisz utworzyc obiekt. albo skozustac ze stałych. Jesli stwprzysz obiekt to juz banalnie proste. Prywatna tablica, gdzie klusze to znawy atrybutow, a ich wartosci to wartosci atrybutów.
metoda __get() bedzie zwracac wartosci, a __set bedzie odrzucac deklaracje.
Ale tak jak pisałem jedynie przy obiekcie.
bigZbig
Utworzenie obiektu mnie nie interesuje ponieważ ta wlasciwosc ma przechowywac obiekt rejestru, ktory ma byc dostepny z kazdego miejsca w skrypcie.

Idea mialo byc jak najprostsze poslugiwanie sie rejsestrem np.
  1. <?php
  2. MyClass::Registry->register($fooObject);
  3.  
  4. $fooObject = MyClass::Registry->get($fooObject);
  5. ?>


Problem w tym, ze jesli wlasciwosc Registry uczynie publiczna to dopuszcze mozliwosc przypisania jej czegokolwiek nie mowiac juz o zastapieniu rejestru w dowolnym miejscu, a chce miec pewnosc ze wlasciwosc ta bedzie przechowywala obiekt rejestru implementujacy odpowiedni interfejs.

W tej chwili moje rozwiazanie wyglada tak
  1. <?php
  2. MyClass::registry()->register($fooObject);
  3.  
  4. $fooObject = MyClass::registry()->get($fooObject);
  5. ?>

Niby niewielka roznica, ale jednak intuicja podpowiada mi, ze rejestr powinien byc wlasciwoscia.
hwao
niestety w php tak sie nie da, to nie c# z genialnymi wlasciwosciami smile.gif
mozna probowac stałe, ale ich wartosc jak sama nazwa wskazuje, musi byc... stala smile.gif
Sh4dow
W sumie to by sie dało, metody statyczny były by czymś w stylu 'Statycznego warpera' dla metod

w kazdej metodzie wywolujesz singletone i idpowiednie metody aby uzyskac wartosc i ja zwrocic.

  1. <?php
  2.  
  3. class A {
  4.  
  5. function getInstance() { ... }
  6.  
  7. ...
  8.  
  9. }
  10.  
  11. class A_static {
  12.  
  13. static public function test1() {
  14. $temp = A::getInstance();
  15. $temp->.....
  16. return ...;
  17. }
  18. }
  19. ?>


i kazda metode statyczna musisz zaopatrzyc w wywolanie singletona itd. Ze ja niepamietalem o tym wczesniej tongue.gif A w klasie rozwiazanie moze byc juz dowolne.

klasa moze miec prywatna tablice i uzywasz metode __get() i metode __set() gdzie set bedzie zwracac false i tyle.
Do zrobienia ale trzeba sie pobawic smile.gif
bigZbig
@Sh4dow - przeczytaj mój wczesniejszy post - jak myslisz, w jaki sposób uzyskałem efekt o ktorym piszesz? Problem w tym, ze ja bym chciał się odwoływac do A_static::test->cos, a nie do A_static::test()->cos.
Sh4dow
Sorki nie zwrocilem uwagi bo mi sie przypomnialo tongue.gif
Co do twojego wymogu tro troche dziwny wymóg.i nie sadze zeby był do przejscia z prostego powodu, chcesz za przeproszeniem z duby wziasc obiekt z metodami. chcesz wywolac metode ktora niejest metoda, nawet atrybutem to nie jest. Nie wiemj czy tak stałą da sie wywołać. Nawet jesli tak to nie da sie w atrybutach przypisac jej obiektu typu
  1. <?php
  2.  
  3. class A {
  4. const $xxx = New Test();
  5. }
  6. ?>

Jednym słowem nie i ... basta. Zastanawia mnie troche dlaczego akurat tak bo to nawet nie jest wygodne od strony programistycznej. Metoda statyczna zwraca obiekt, ktory od reki (chyba) traci wlasciwosci obiektu. O mało sie nie pogubiłem i nie zaczołem szukac rozwiazania guitar.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-2024 Invision Power Services, Inc.