Fatal error: Cannot inherit previously-inherited constant

  • Hi,
    ich habe zu diesem Problem schon viele threads in Google gefunden, aber nichts hat mein Problem gelöst. In den diesen ist das Problem meist auf APC zurückzuführen, aber ich benutze hier Windoof zum entwicklen und die Windows-Binarys sind nciht in den aktuellen versionen erhälrlich. Im gegensatz zu den meisten Problemen ist meins eher simpel. Ich habe ein Interface Page:

    PHP
    <?php
    interface Page {
        const NAME=null;
        // weitere Elemente
    }
    // das = null nur, weil PHP da einen Wert wollte
    ?>

    und eine Klasse, die das Interface vollständig implementiert.

    PHP
    class Page_unavailable implements Page {
        const NAME="Nicht-Verfügbar-Seite";
        // weitere implementierung
    }

    und das ergebnis ist eine Fehlermeldung:

    Code
    [B]Fatal error[/B]:  Cannot inherit previously-inherited constant NAME from interface Page in [B]unavailable.php[/B] on line [B]2[/B]

    Hat jmd. eine Idee? Seit wann ist es ein problem Konstanten zu vererben? Auf statische Variablen kann ich nicht ausweichen, die mag PHP noch weniger...

    Code
    [B]Fatal error[/B]:  Interfaces may not include member variables (...)

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Ich will in der Klasse Informationen speichern, auf die ich zugreiffen kann, ohne sie instatiieren zu müssen - statische variablen will PHP nicht und Konstanten auch nicht.
    Sind Konstante nicht Konstant in ihrer Klasse? Ein Interface ist doch keine Klasse, oder?

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Ein Interface ist die Schablone für einen Typ (=Klasse). Wenn die Schablone eine Konstante vorschreibt, dann muss jede Implementation diese Konstante, und damit auch mit dem im Interface definierten Wert, haben.
    Generell sind Konstanten aber die Ausnahme, da in Interfaces keine Membervariablen erlaubt sind, da diese immer konkret sind.
    Was du ab php 5.3 aber machen kannst, sind statische Funktionen. Wenn du also bei Klassen immer sicher sein willst, dass sie eine bestimmte Info lieferen können ohne instanziert zu werden, verpass dem Interface eine statische Funktion, welche diese Werte dann liefert.
    Oder mach ne abstract-class und vererbe, da kannste auch normale statische Membervariablen vergeben.


  • Ok, dann werd ich wohl auf die Statischen Funktionen zurückgreiffen, für meine Zweck ist eine abstakte klasse semantisch unpassend. In meinem Java-Buch war das beispiel mit vererbung anhand von Tieren


    Daran stört mich aber, dass abstrakte Klassen ja nicht beschreiben sollen, wie Objekte aufgebaut sind, sondern eher Grundfunktionen bereitstellen, die aber im ganzen nicht ausreichebn, ein Objekt ihres Typs zu nutzen. Man kann ja nicht einfach irgendein Tier auf den Heap setzten.
    Trotzdem danke ;)

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!