2010-10-28 10 views
13

Chciałbym wykorzystać je do realizacji factory wzór, na przykład:PHP - dlaczego nie mogłem zadeklarować zmiennej stałej statycznej?

class Types{ 
    static const car = "CarClass"; 
    static const tree = "TreeClass"; 
    static const cat = "CatClass"; 
    static const deathstar = "DeathStarClass"; 
} 

I chciałbym z nich korzystać jak:

$x = new Types::car; 

Czy to możliwe?

A co jeśli moja klasa ma parametr w construcor, że nie działa:

$x = new Types::car(123); 
+3

Masz na myśli stałą statyczną w przeciwieństwie do stałej dynamicznej? :) –

+0

Sprawdź edytuj plz;) –

+0

@John Wciąż nie rozumiem twojego przykładu. Dlaczego deklarujesz tę samą stałą cztery razy? Jaki byłby oczekiwany rezultat? Słowo kluczowe 'const' powinno działać, po prostu wyłącz' static'. To nie ma sensu dla stałej. –

Odpowiedz

21

Twój kod powinien być:

class Types{ 
    const car = "CarClass"; 
    const tree = "TreeClass"; 
    const cat = "CatClass"; 
    const deathstar = "DeathStarClass"; 
} 

Zauważ, że ponieważ są stałe przywiązany do definicji klasy, z definicji są statyczne.

Od Docs:

Od PHP 5.3.0, jest to możliwe do odniesienia klasa użyciu zmiennej. Wartość zmiennej nie może być słowem kluczowym (np. Self, parent i static).

http://www.php.net/manual/en/language.oop5.static.php

Więcej informacji:

http://php.net/manual/en/language.oop5.constants.php

+0

OOO, exacly! To chciałbym osiągnąć! Ale co, jeśli moja klasa zaszkodzi w construcotr? Nie mogę tego zrobić tak: '$ x = nowe typy :: samochód (123);' ...:( –

+3

@John: Utwórz instancję klasy zmiennej, najpierw przypisując wartość stałą do zmiennej: '$ type = Typy :: samochód; $ x = nowy typ $ (123);' – BoltClock

+0

Jedyne, co chciałbym dodać, to to, że nazywanie Konwencja dla stałych to wszystkie czapki – Ice76

1

Jest to stała. Nie możesz tego zmienić. Więc nie ma sensu, żebyś miał niestałego stałego członka. Więc nie musisz zadeklarować ich jako zmiennych statycznych lub klasowych.

4

Stałe są już statyczne w tym sensie, że nie są powiązane z wystąpieniem klasy. Oto, jak je zdefiniować i jak chcesz:

class Types{ 
    const car = "CarClass"; 
    const tree = "TreeClass"; 
    const cat = "CatClass"; 
    const deathstar = "DeathStarClass"; 
} 

$x = Types::car; 
+0

Masz na myśli 'Typy :: samochód'. Poza tym +1 –

Powiązane problemy