2011-12-07 12 views
7

Dzień dobry wszystkim!PHP: Statyczna właściwość Readonly w klasie

Mój problem: potrzebuję przeciążenia standardowego pobierania i ustawiania dla zmiennych statycznych w klasie ... ale nie ma takiej funkcjonalności podanej w php ... zadawano ją w 2008 roku i nadal nie zaimplementowano ... To samo dotyczy tylko do odczytu ...

Moje pytanie: czy istnieje sposób na udostępnienie statycznej właściwości do czytania z zewnątrz, ale przed modyfikacją?

echo aaa::$qwe; //<--- echoes value of $qwe 
aaa::$qwe = '666'; //<--- throws an error because variable is protected from modification 

Nie mogę użyć stałej, ponieważ niektóre zmienne zawierają tablice.

Być może są jakieś obejścia?

Tak, wiem, że mogę zrobić to jak aaa :: Get („qwe”), ale to nie jest dobre ...

+2

Dlaczego nie jest dobrze? – Artefacto

+0

Ponieważ potrzebowałbym zmienić 2mb istniejącej bazy kodu, a także nie jest ona czysta, plus są inne przyczyny niezwiązane ze mną :) – NewProger

+1

Dlaczego nie używać stałej klasy? Czy zmienna może być wewnętrznie modyfikowana? – mAu

Odpowiedz

1

Jeżeli wartość nie zmienia się, można użyć zamiast const. W przeciwnym razie nie ma sposobu, aby spełnić twoje ograniczenia (brak wywołań funkcji hook w PHP przez rozszerzenie, ale nawet wtedy musiałbyś zmienić swój dostęp statyczny do wywołań funkcji, w przeciwnym razie musiałbyś załatać PHP).

Oczywiście jest wysoce wątpliwe, że to, co robi aplikacja, to dobry projekt. Poleganie na zmianie właściwości statycznych jest mniej więcej takie samo jak poleganie na zmiennych globalnych.

+0

No cóż, z tym muszę żyć :) Istniejąca baza kodów ... I niestety nie mogę używać const, ponieważ niektóre zmienne przechowują tablice ... – NewProger

+1

Jeśli konstrukcja pozwala na taką zmianę, możesz zapisać tablice jako CSV, a może kodowane JSON: 'const $ qwe = '[" 666 "]'' – KingCrunch

+0

Hm, to jest naprawdę interesujący pomysł! – NewProger

4

Bezpośrednio odpowiadając na pytanie: Nie, nie możesz oznaczyć zwykłych właściwości jako przeczytanych. Jeśli chcesz ustawić prymitywne typy (oprócz array), które nigdy nie ulegnie zmianie, należy użyć stałych

const QWE = '666'; 

to nie działa dla obiektów i tablic. Widzę dwa (powiedzmy) „rozwiązania”

  1. Zastosowanie Getter

    private $qwe; 
    public function getQwe() { return $this->qwe; } 
    protected function setQwe($value) { $this->qwe = $value; } 
    

    nie lubię ich bardzo dużo („Properties określić państwo, a nie zachowanie, podobnie jak metody zrobić”) . Zawsze dostajesz dwa razy więcej dodatkowych metod niż właściwości, a jeśli masz wiele właściwości, będzie to bardzo wysadzić w powietrze twoją klasę. Jednak jest to tak daleko, jak widzę jedyny sposób na wdrożenie tego, co chcesz osiągnąć.

  2. Zaufaj swoim użytkownikom;) Skomentuj swoją nieruchomość i powiedz coś w stylu "Jeśli zmienisz tę wartość, prawdopodobnie coś się zepsuje, a to będzie twoja wina".

    /** 
    * QWE 
    * 
    * This property should be treatened as "readonly". If you change this value 
    * something scary will happen to you. 
    * 
    * @readonly 
    * @var string 
    */ 
    public $qwe = '666'; 
    

    To nie jest świetne, ale przynajmniej można powiedzieć "powiedziałem".

+0

Tylko opcja 2 byłaby możliwa :) Ale pozostawienie bardzo ważnych zmiennych nie jest dobre :) – NewProger

+0

Zaufaj swoim użytkownikom ... (czytaj dalej)!?! (Poczekaj chwilę, po prostu przeczytam ??!) .. (Facepalm). To jest najfajniejsza rzecz, którą czytałem cały dzień !! – Sebastien

+0

@Sebastien Nie wiem ... jaka jest zabawna część? Wiesz, że z "użytkownikami" mam na myśli innych programistów, a nie odwiedzających aplikację? I wiesz, że jeśli nie są "godni zaufania", zastrzelili się na własnych nogach. Nic, o co musisz zadbać;) – KingCrunch

0

To jest trochę łatwiej:

class aaa{ 
private static $qwe='rty'; 
public static function qwe() { return self::$qwe; } 
} 

Nie pozwala zmian i nadal jest łatwo dostępny:

aaa::$qwe = 'something'; // fails 
echo aaa::qwe(); // success 

wiem, że to nie jest idealne, ale można można zastąpić wszystkie

aaa::$qwe() 
+1

-1 Nie można użyć '$ this' poza kontekstem obiektu. – Leri

+0

Dzięki Leri, naprawiłem pierwszy fragment kodu z '$ this-> qwe;' na 'self :: $ qwe'. proszę ponownie ocenić moją odpowiedź, jeśli uważasz, że jest lepsza. –

Powiązane problemy