2016-11-15 4 views
0

Ich bin fest mit einem Problem, das ich dachte, war leicht gelöst, aber mit einem Verlust. Ich habe eine abstrakte Klasse, die mehrere Konstanten hat, die Zeitinkremente definieren, die ungefähr so ​​aussehen.PHP Zugriff auf Konstanten dynamisch von abstrakten Klasse

abstract class DictionaryKeepAliveIncrements{ 

    CONST second  = 1; 
    CONST quarterminute = 15; 
    CONST halfminute = 30; 
    CONST minute  = 60; 

Ich versuche, sie von einer anderen Klasse dynamisch zuzugreifen wie so

public function getKeepAliveByUnit($timeUnit){ 
    return constant('DictionaryKeepAliveIncrements::'.$timeUnit); 
} 

Dies wird in dem Fehler resultierende

Warnung: constant(): nicht gefunden Konstante DictionaryKeepAliveIncrements :: Minute in

Die DictionaryKeepAliveIncrements ist im gleichen Namespace wie die Methode getKeepAliveByUnit so sollte es sehen. Ich habe auch versucht, den vollen Namensraum hinzuzufügen, aber das gleiche Ergebnis zu erhalten.

Was fehlt mir?

+0

Rufst du 'Sache- $> getKeepAliveByUnit ('zweiten');' statt nur Zugriff auf 'DictionaryKeepAliveIncrements :: second'? Sie scheinen hier die Dinge massiv zu überkomprimieren ... –

+0

Ja, ich rufe '$ instance-> getKeepAliveByUnit ('week')' Ich muss mit Legacy-Code umgehen, bei dem Konfigurationsoptionen in anderen Teilen des Codes dynamisch gesetzt werden und dann durchgegangen. Ansonsten würde ich es mit 'DictionaryKeepAliveIncrements :: minute' fest codieren, wo es benötigt wird. – SeaFuzz

+0

Gibt es eine abgeleitete Klasse aus dieser abstrakten Klasse, die überhaupt instanziiert wurde? Ich frage mich, ob die Konstanten, da sie Teil eines Abstracts sind, vielleicht nicht definiert wurden, wenn nichts Abstraktes verwendet. Wenn Sie das Schlüsselwort "abstract" entfernen, funktioniert es? – Graeme

Antwort

0

Sie müssen Namespace im constant() Aufruf enthalten - siehe code @ 3v4l.org

EDIT das Problem Hinzufügen von Namespace zu korrigieren war die Lösung. Das Folgende löste das Problem.

Um diese Lösung besser zu erklären, hier ist was benötigt wurde.

public function getKeepAliveByUnit($timeUnit){ 
    return constant('root\namespace\DictionaryKeepAliveIncrements::'.$timeUnit); 
} 
Verwandte Themen