Case sensitive Class Names
hotti
- php
s. Thema,
aus der Doku werde ich nicht so recht schlau, kurzum: Wie kann ich PHP dazu bringen, dass ein Klassenname case-sensitive angesprochen wird, als ein class Body;
nicht mit $b = new body;
tut?
Viele Grüße!
Hi,
Wie kann ich PHP dazu bringen, dass ein Klassenname case-sensitive angesprochen wird, als ein
class Body;
nicht mit$b = new body;
tut?
Direkt glaube ich gar nicht.
Du könntest dir höchstens einen Autoloader basteln, der die zum Klassennamen zugehörige Datei in einem case-sensitiven Dateisystem sucht …
MfG ChrisB
hi danke Dir!
Du könntest dir höchstens einen Autoloader basteln, der die zum Klassennamen zugehörige Datei in einem case-sensitiven Dateisystem sucht …
AL wäre eine Möglichkeit, ich habe jedoch mittlerweile eine andere Idee:
Da ich ohnehin mit einer Konfigurationsdatei arbeite, werde ich bei dieser Gelegenheit neben dem Klassennamen ein zusätzliches Attribut 'Dateiname' einführen, damit ist später auch auf einen Blick zu sehen, in welcher include-Datei die Klasse steht; eine Sache, die mich an Java schon oft genervt hat, weil der Dateiname nichts über die darin enthaltenen Klassen aussagt ;)
Viele Grüße,
Hotti
Hallo,
ich frage mich gerade, warum du soetwas vorhast. Das hört sich nicht sehr vernünftig an.
Kannst du mir ein Beispiel nennen, wo das sinnvoll sein könnte?
Viele Grüße Novi
hi,
Kannst du mir ein Beispiel nennen, wo das sinnvoll sein könnte?
Jow, wenn meine Klasse 'Body' heißt und es in der Klasseninstanz ein Attribut 'BODY' sowie eine Methode body() gibt, knallt es ;)
class Body{
function __contruct(){
$this->BODY = 123;
}
function body(){
return $this->BODY;
}
}
$b = new Body;
PHP Notice: Undefined property: Body::$BODY in ....
Da wirs wohl doch noch was zum 'Basteln' geben ;)
Hotti
Tach.
Ich hab weder Deine ursprüngliche Fragestellung noch diese Erklärung verstanden, aber Dein Problem ...
PHP Notice: Undefined property: Body::$BODY in ....
... liegt darin begründet, daß Du in der Klasse kein $BODY definiert hast, obwohl Du es zu verwenden versuchst.
Tach.
Ich hab weder Deine ursprüngliche Fragestellung noch diese Erklärung verstanden, aber Dein Problem ...
PHP Notice: Undefined property: Body::$BODY in ....
... liegt darin begründet, daß Du in der Klasse kein $BODY definiert hast, obwohl Du es zu verwenden versuchst.
Warum sollte ich in meiner Klasse eine Variable $BODY definierten (die ich selbst nicht brauche)?
Hotti
Tach.
Ich hab weder Deine ursprüngliche Fragestellung noch diese Erklärung verstanden, aber Dein Problem ...
PHP Notice: Undefined property: Body::$BODY in ....
... liegt darin begründet, daß Du in der Klasse kein $BODY definiert hast, obwohl Du es zu verwenden versuchst.
Warum sollte ich in meiner Klasse eine Variable $BODY definierten (die ich selbst nicht brauche)?
Wieso benutzt Du sie mit $this->BODY
, wenn Du sie selbst nicht brauchst?
Offenbar kommt die Notice tatsächlich nur von dem falsch geschriebenen Konstruktor, der mir gar nicht aufgefallen war. Daß die Eigenschaft $BODY
in der Klasse gar nicht explizit definiert ist, sondern nur durch das Schreiben im Konstruktor angelegt wird, ist PHP (zumindest in der eben getesteten Version 5.3.3) keine Meldung wert. Ich halte es zumindest für schlechten Stil, das so zu machen, auch wenn es nicht das eigentliche Problem war.
Moin,
Offenbar kommt die Notice tatsächlich nur von dem falsch geschriebenen Konstruktor, der mir gar nicht aufgefallen war. Daß die Eigenschaft
$BODY
in der Klasse gar nicht explizit definiert ist, sondern nur durch das Schreiben im Konstruktor angelegt wird, ist PHP (zumindest in der eben getesteten Version 5.3.3) keine Meldung wert. Ich halte es zumindest für schlechten Stil, das so zu machen, auch wenn es nicht das eigentliche Problem war.
Attribute im Konstruktor vorbelegen: Was ist daran ein schlechter Stil?
Hotti
Hi,
Daß die Eigenschaft
$BODY
in der Klasse gar nicht explizit definiert ist, sondern nur durch das Schreiben im Konstruktor angelegt wird, ist PHP (zumindest in der eben getesteten Version 5.3.3) keine Meldung wert. Ich halte es zumindest für schlechten Stil, das so zu machen, auch wenn es nicht das eigentliche Problem war.Attribute im Konstruktor vorbelegen: Was ist daran ein schlechter Stil?
laut deiner Definition hat die Klasse dieses Attribut nicht. Erst durch das Schreiben (hier: im Konstruktor) wird es dynamisch angelegt. Also nicht das Zuweisen eines Werts im Konstruktor ist das Problem, sondern dass du nicht ein private $BODY;
in die Klasse gepackt hast.
Bis die Tage,
Matti
Hello,
Attribute im Konstruktor vorbelegen: Was ist daran ein schlechter Stil?
Es kommt ziemlich häufig vor, dass man Eigenschaften der Klasse während der Lebensdauer der Instanz zurücksetzen muss auf Standardwerte. Dann ist es ungünstig, wenn diese Belegung im Konstruktor festgelegt ist. Das bedarf einer separaten init()-Methode, die dann aber gerne im Konstruktor aufgerufen werden darf.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
hi,
Es kommt ziemlich häufig vor, dass man Eigenschaften der Klasse während der Lebensdauer der Instanz zurücksetzen muss auf Standardwerte.
Möglich. Ich arbeite mit Subklassen, konkret sind das Klassen, die eine HTTP-Response auszugeben haben. Beispiel
class RolfRost_Body extends Manager{}
erbt von der Basisklasse (Manager) den Kontruktor. Die Seite für den Status 404 ist ein typischer Fall für die Default-Werte, hierzu gibts auch den richtigen HTTP-Header und im Attribut BODY steht alles drin, was dem Besucher weiterhilft ;)
Bei einem Status 404 wird das ResponseObjekt also als Instanz der Basisklasse erstellt.
Andernfalls (Status 200) werden über den geerbten Kotruktor alle diejenigen Attribute eingebaut, welche für eine ordentliche Response gebraucht werden (z.B. der BODY), das Responseobjekt wird in diesem Fall als Instanz der Subklasse erstellt.
Es ist also nicht so, dass sich die Attribute über die Lebensdauer einer Instanz ändern, es ist jedoch so, dass Requests auf verschiedene URLs auch verschiedene Responsen zur Folge haben und das Responseobjekt folgerichtig mit anderen Attributen bestückt wird.
Hotti
Tach!
Daß die Eigenschaft
$BODY
in der Klasse gar nicht explizit definiert ist, sondern nur durch das Schreiben im Konstruktor angelegt wird, ist PHP (zumindest in der eben getesteten Version 5.3.3) keine Meldung wert.
Ja, das war schon immer so und ist Teil der PHP-Philosophie, Variablen beim Erstgebrauch anzulegen, ohne sie vorher erst deklarieren zu müssen.
Das ist auch mit Hinzufügen der OOP nicht grundlegend anders geworden. Warum auch sollten Objekte weniger flexibel sein als der Rest des Systems?
Eine Meldung kam - wie bei anderen Variablen üblich in Form einer Notice beim Zugriffsversuch.
Ich halte es zumindest für schlechten Stil, das so zu machen, auch wenn es nicht das eigentliche Problem war.
Das sehe ich auch so. Dynamische Objektmitglieder sind jedoch auch im Hinblick auf Property Overloading sinnvoll. Wenn man jedoch genau weiß, welche festen Eigenschaften eine Klasse haben soll, ist es schon zu Dokumentationszwecken nützlich, sie anzuführen (und dabei gleich zu dokumentieren).
dedlfix.
hi,
function __contruct(){
^
Oh mann, da habe ich wohl was verschleppt (verschleppt mit pp wie Depp) ;)
Vielen Dank Euch, Problem ist gelöst.
Hotti
Hi,
Jow, wenn meine Klasse 'Body' heißt und es in der Klasseninstanz ein Attribut 'BODY' sowie eine Methode body() gibt, knallt es ;)
arbeite an deinen Variablennamen. Ein Klassen- und ein Variablenname mit dem Namen 'body' bzw. 'Body' kann ich mir gut vorstellen. Zusammengenommen wäre die 'body'-Eigenschaft einer 'Body'-Klasse aber der Körper eines Körpers. Und dann wird es krude. Ist es vielleicht der Körperwert, -inhalt oder ähnliches? Dann nenne die Eigenschaft 'bodyValue', 'bodyContent' uswusf.
Bei verschachtelten Strukturen muss man eben etwas kreativ werden. Das Menus eines Menus ist z.B. ein submenu oder childmenu.
Der Sinn einer Methode mit dem Namen 'body' wiederum ist mir nicht klar. Ich halte mich an die Richtlinie, dass Methodennamen ein Verb beinhalten sollten, welches aussagt, was die Methode macht. Und dann heißt die Methode eben getBody() o.ä..
Bis die Tage,
Matti
hi,
Der Sinn einer Methode mit dem Namen 'body' wiederum ist mir nicht klar. Ich halte mich an die Richtlinie, dass Methodennamen ein Verb beinhalten sollten, welches aussagt, was die Methode macht. Und dann heißt die Methode eben getBody() o.ä..
Es ist noch nicht zu spät, darüber nachzudenken ;)
Viele Grüße!