2013-03-18 12 views
5

kod w klasie nadrzędnej:Sprawdź, czy istnieje własność statyczna w klasie potomnej z klasy nadrzędnej (późne wiązanie statyczne)?

foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
    // Do something 
} 

To działa, gdy $ _aReadOnlyDatabaseTables jest zdefiniowana w klasie dziecka, ale zgłasza błąd podczas $ _aReadOnlyDatabaseTables jest nieobecny. Muszę sprawdzić, czy ta właściwość istnieje wcześniej.

myślę, że powinno iść tak:

if(property_exists(static,$_aReadOnlyDatabaseTables)){ 
    foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
     // Do something 
    } 
} 

Ale to generuje błąd składni, unexpected ',', expecting T_PAAMAYIM_NEKUDOTAYIM. Używanie $this w miejsce static również nie działa, zawsze zwraca wartość false.

Jaka jest prawidłowa składnia tego?

Odpowiedz

7

Należy Spróbuj tego:

if(property_exists(get_called_class(), '_aReadOnlyDatabaseTables')) { 
    foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
     // Do something 
    } 
} 
+0

Tak można to zrobić w przypadku późnych wiązań statycznych. – nickb

+3

@Nick Prawdopodobnie szybsze i bardziej wydajne byłoby zadeklarowanie tablicy w klasie nadrzędnej i nadpisanie jej w elementach potomnych. Następnie możesz pominąć sprawdzanie właściwości. Zastąpienie zostanie wykonane raz podczas kompilacji i nie będzie powodowało dodatkowego obciążenia za każdym razem, gdy metoda zostanie wywołana. –

+0

@ColinMorelli, dziękuję, zrobię to również, ale moim celem na razie było wykrycie jakichkolwiek klas dzieci, w których ta właściwość nie została jeszcze zaimplementowana. – Nick

3

Poprawną metodą byłoby zainicjowanie wartości z rozsądną wartością domyślną (pusta tablica) w klasie nadrzędnej. W ten sposób możesz mieć pewność, że nieruchomość będzie istnieć.

Wszystko, do czego masz dostęp w jednej klasie, powinno być dostępne poprzez odpowiednie zdefiniowanie go, gdy używasz klasy samodzielnie.

+0

To dobra rada w ogóle, ale to nie robi odpowiedzieć na zadane pytanie. Dobrą praktyką jest także sprawdzenie, czy tablica istnieje, i że jest to tablica przed próbą zapętlenia się nad nią. – Nick

0

Powinieneś być w stanie zrobić to szybko i brudne użyciu get_class() zamiast static słów kluczowych:

if (property_exists(get_class($this), '_aReadOnlyDatabaseTables')) { ... } 
+0

'$ this' nie powinno być dostępne w statycznych metodach, gdzie zgaduję, że OP umieścił kod w swoim pytaniu –

+0

Nie wspomniałem w OP, ale jest to instancja klasy i niestatyczna metoda, dostęp nieruchomość statyczna. – Nick

+0

W takim przypadku dostępne jest odwołanie '$ this'. –

Powiązane problemy