PHP: Interface::Konstanten

Letzter POST mit lösung: http://forum.bplaced.net/viewtopic.php?f=10&t=17139&p=321060#p321060

Und wieder brauche ich die Hilfe von euch lieben forum-Leuten :hail:

Eigentlich wollte ich nichts anderes tun als ein Interface zu definieren dass die implementierende Klasse zu 4 Konstanten zwingt.

Der Sinn ist eigentlich der, dass ich nicht in jedem Plugin dass das »Plugin«-Interface implementiert eine extra-Funktion schreiben muss.[code]<?php

» interface
» {
» » » const $AUTHOR;
» » » const $LICENSE;
» » » […]
» }

?>[/code]

Aber das geht nicht !!!
Stattdessen wird der code schon so ausgeführt wie in einer Elternklasse.

Und final hat ja schon eine andere Bedeutung.

Außerdem zwingt PHP mich »public« und »static« wegzulassen.
Sind doch hoffentlich trotzdem »public static« - oder?

Für Alternativvorschläge wäre ich sehr dankbar :wink:

@All: ich hoffe doch ihr testet \ habt Erfahrung bei code den ihr postet
Dann bleibt der Thread schön übersichtlich :wink:

Warum machst du nicht eine Funktion:

function about() { return array( "author" => "...", "license" => "...", .... ) }

php.net/manual/en/language.o … stants.php
php.net/manual/en/language.o … rfaces.php (hat ein Beispiel dazu)

Ich will die Klasse dazu zwingen bestimmte Informationen zu implementieren.

Außerdem wird das Dann schwierig, wenn ich nur einen Wert will -> viel zu viel Skript für zu wenig Information.

Beispiel: Klassen mit dem Interface »Requestable« sollte eine Information über den angebotenen »Service« bieten.

Wenn ich jetzt aber eine »public static function SERVICE(){…}« mache, sind die Klammern bei Service doch ein Teil vom »guten« Code, aber ich will keine Klammern bei Konstanten werten haben ( Auch wenn es nur eine Code-Selbstdokumentation ist ).

Wenn ich jetzt noch ein Interface mit ein oder zwei solchen Funktionen habe das sich von einem anderen solchen Interface ableitet sind das doch auch schon vier unschöne Funktionen bei dem die Idee mit dem Array alleine schon wegen den unterschiedlichen Funktionsnamen schon unmöglich ist.

Deshalb suche ich keinen Workaround sondern eine Lösung

OK, dann nicht. Ich dachte, dass du nur keine Funktion pro Konstante willst, aber so ist es klar.

Mir ist keine Möglichkeit bekannt, Konstanten zu erzwingen. (Höchstens per Reflection die Klassen untersuchen und bei fehlenden Daten die Skriptausführung abbrechen)

Eine function ist ja auch ganz und gar keine Konstante.

[…]

Meine Meinung? Ich glaube bevor ich das jedesmal Poste, kommt die in die Signatur :wink:

Ich verstehe nicht, wo dein Problem liegt.
Wie man Konstanten in Interfaces einbaut, steht auf den Handbuchseiten beschrieben, die ich verlinkt habe.

Wenn du unter Konstanten irgendetwas anderes verstehst, dann erkläre das bitte erst mal klar und deutlich.

[quote=“chrisb”]Ich verstehe nicht, wo dein Problem liegt.
Wie man Konstanten in Interfaces einbaut, steht auf den Handbuchseiten beschrieben, die ich verlinkt habe.

Wenn du unter Konstanten irgendetwas anderes verstehst, dann erkläre das bitte erst mal klar und deutlich.[/quote]
Also ich habe es verstanden.
Er will im Interface eine Konstante vorsehen, die Später in der Implementierung der Klasse belegt werden soll. Das ist der Doku nach aber nicht möglich, man kann im Interface nur eine Konstante erstellen, die dann in der Klasse nicht überschrieben werden kann.

[quote=“progandy”]Also ich habe es verstanden.
Er will im Interface eine Konstante vorsehen, die Später in der Implementierung der Klasse belegt werden soll.[/quote]
Ja, habe ich jetzt auch.

Das kann aber natürlich gar nicht gehen - weil Konstanten global gültig sind, und ein Interface ja durchaus von mehreren Klassen implementiert werden kann.

Das ist nun mal die Natur von Konstanten in PHP, egal ob im OO-Umfeld oder sonstwo.

@handykap++:

[quote]Lest den ersten Post und Antworten zwischen den Posts eines Users = weniger unnütze Posts.
Das ist keine Beleidigung, aber ich kenne Leute, die keine Lust auf tausende Seiten Posts zu lesen haben bis sie Verstehen[/quote]
Dann überlege bitte mal, ob es nicht besser wäre, auf solche Hinweise ganz zu verzichten, und dafür die Signatur schön kurz zu halten - dann muss man nämlich über weniger sinnloses Zeug hinwegscrollen, und kann auch den eigentlichen Inhalt der Postings besser und schneller erfassen.

Antwort

[quote=“chrisb”]dann muss man nämlich über weniger sinnloses Zeug hinwegscrollen, und kann auch den eigentlichen Inhalt der Postings besser und schneller erfassen.[/quote]1. Dafür sind die ja auch Grau. 2. Wenn jemand keine 15 Zoll hat sollte das ja nicht stören. 3. Könnte das Forum einen wichtigen Teil (3 Zeilen oder so) und einen Rest, was dann individuell angezeigt wird definieren ( nichts, wichtig oder alles ). 4. Kann jeder Signaturen deaktivieren. 5. Sind diese Ratschläge doch gerade wichtig um bei manchen so etwas [qoute=“chrisb”]Eine function ist ja auch ganz und gar keine Konstante.[/qoute] zu vermeiden. 6. ist das hier der falsche Topic -> der richtige wäre »PN«, da man so - siehe hier ganz viele unnütze Antworten vermeidet.

für #3: Ich persönlich finde Bilder gehören dann eher nur in den unwichtigen Teil und im wichtigen verboten.

Post

Die Natur eines Interfaces ist doch eigentlich nicht, inkompatibilitäten mit anderen Interfaces ( wegen Konstanten ) zu provozieren sondern abstrakte Dinge zu definieren die die Klasse dann überschreiben muss

Das hier wäre eher OOP-mäßig:interface CopyrightInterface { » const AUTHOR; » const NAME; » const LICENSE; } interface LibraryInterface { » const NAME; » const VERSION; } class LibraryClass implements CopyrightInterface, LibraryInterface { » const AUTHOR = 'handykap++'; » const NAME = 'Frameworld-CMS'; » const VERSION = '0.1.0'; }

Warum sollte NAME mit bereits in den Interfaces belegt werden, wo dann noch nicht einmal ein Author angegeben werden darf - und 3rd-Party-Plugins meinen Namen und meine Lizenz … hätten.

Und nebenbei noch NAME 2x Belegt wäre -> siehe Interfaces ( geht plötzlich doch eine Mehrfachvererbung? :wink: )

Klassenkonstanten haben in PHP eine andere Bedeutung. Diese sind nämlich nur über Klassenname::KONSTANTE ansprechbar.

So eine Überschreibung kann man in PHP aber ganz einfach mit static lösen:

class B
{
  static protected $value = "";
  
  public function test() { return $this->value; }
};

class D extends B
{
  static $value = "Hallo";
};

$d = new D;
echo $d->test();

Leider kann man es in PHP dann nicht konstant machen. PHP ist einfach schlecht in dieser Hinsicht :wink:

Ich frage mich auch was die bei PHP sich dabei gedacht haben:

interface i1 { const C = 1; } interface i2 { const C = 2; } class c implements i1, i2 {}

Das ist ja schon ein Verbrechen an der ganzen OOP-Idee ( was Interfaces betrifft ):

Die einzige alternative wäre eine Funktion:public static function CONSTANTE_NAME (){ return WERT; }