Verständnisproblem mit Gültigkeitsbereichsoperator ::
Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 15:18:59 von Markus Kobligk
Hallo zusammen,
folgender Code sei gegeben:
class A {
public function doSomething() {
}
}
A::doSomething();
?>
Zitat aus dem Manual:
"...der Doppel-Doppelpunkt ist ein Kürzel, das Zugriff auf statische,
konstante und überschriebene Member oder Methoden einer Klasse erlaubt."
Nun in obigem ist nichts (speziell die Funktion doSomething())
konstant,statisch oder überschrieben. Daher nun meine Frage, warum
dieser Code einwandfrei ausgeführt wird (zumindest auf meinem Rechner)?
Vielen Dank.
Gruß,
..\\arkus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 15:38:52 von Niels Braczek
Markus Kobligk schrieb:
>
> class A {
> public function doSomething() {
> }
> }
> A::doSomething();
> ?>
>=20
> Zitat aus dem Manual:
> "...der Doppel-Doppelpunkt ist ein Kürzel, das Zugriff auf statische,=
=20
> konstante und überschriebene Member oder Methoden einer Klasse erlaub=
t."
>=20
> Nun in obigem ist nichts (speziell die Funktion doSomething())=20
> konstant,statisch oder überschrieben. Daher nun meine Frage, warum=20
> dieser Code einwandfrei ausgeführt wird (zumindest auf meinem Rechner=
)?
Doch, die Methode doSomething() ist in diesem Falle statisch, da die
Klasse A nicht instantiiert wurde. Du greifst auf die Methode
doSomething() der *Klasse* zu - das geht nur mit statischen Methoden.
Das stimmt also nicht immer mit der Deklaration (hier: public) überein.=
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 15:59:02 von Markus Kobligk
Niels Braczek schrieb:
> Doch, die Methode doSomething() ist in diesem Falle statisch, da die
> Klasse A nicht instantiiert wurde.
Also ist jede public-Methode einer noch nicht instanzierten Klasse
automatisch erstmal static? Was für einen Sinn macht das? Dann könnte
ich ja auf jede public-Methode von jeder beliebigen Klasse statisch
zugreifen, indem ich einfach kein Objekt erzeuge, sondern einfach den ::
verwende. Das widerspricht doch wohl jeglichem OO-orientierten Gedanken,
oder?
Übrigens funktioniert der Code auch, wenn ich vor dem Aufruf
A::doSomething() die Klasse instantiiere.
Gestossen bin ich darauf bei der Implementierung eines Singletons,
welches ich für meinen Datenbankzugriff verwende. Dort konnte ich
sämtliche public-Funktionen aufrufen, ohne mir über getInstance() die
Instanz dieser Klasse zu holen. Damit ist das Singleton doch dann
sinnlos, wenn ich auf die public-Methoden sowieso Zugriff habe über den
::Operator. Wie sieht es denn dann bei gleichzeitigem Zugriff auf die DB
aus?
Grüße,
..\\arkus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:09:19 von Peter Schmidt
Markus Kobligk schrieb:
> Nun in obigem ist nichts (speziell die Funktion doSomething())
> konstant,statisch oder überschrieben. Daher nun meine Frage, warum
> dieser Code einwandfrei ausgeführt wird (zumindest auf meinem Rechner)?
Solange die Methode doSomething() nicht auf irgendwas mit $this zugreift
(was ja eine Instanz der Klasse voraussetzen würde) ist sie sehr wohl
eine statische Klassenmethode. In PHP wird sowas leider nicht durch ein
gesondertes Schlüsselwort markiert.
Gruß
Pta
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:14:45 von Peter Schmidt
Markus Kobligk schrieb:
> Niels Braczek schrieb:
>> Doch, die Methode doSomething() ist in diesem Falle statisch, da die
>> Klasse A nicht instantiiert wurde.
>
> Also ist jede public-Methode einer noch nicht instanzierten Klasse
> automatisch erstmal static? Was für einen Sinn macht das? Dann könnte
> ich ja auf jede public-Methode von jeder beliebigen Klasse statisch
> zugreifen, indem ich einfach kein Objekt erzeuge, sondern einfach den ::
> verwende. Das widerspricht doch wohl jeglichem OO-orientierten Gedanken,
> oder?
Nein, sie ist nur solange static, wie sie nicht auf irgendwas mit
$this-> zugreift, weil es $this erst gibt, sobald du eine Instanz hast.
Ausnahmen sind hier Klassenattribute die mit static deklariert sind.
Und es widerspricht in keinster Weise dem Gedanke der OOP, anscheinend
hast du nur noch nicht richtig den Unterschied zwischen Klassen und
Objekten/Instanzen verinnerlicht.
Gruß
Pta
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:33:43 von Ulf Kadner
Peter Schmidt schrieb:
> Solange die Methode doSomething() nicht auf irgendwas mit $this zugreift
> (was ja eine Instanz der Klasse voraussetzen würde) ist sie sehr wohl
> eine statische Klassenmethode. In PHP wird sowas leider nicht durch ein
> gesondertes Schlüsselwort markiert.
Er spricht im gegensatz zu Dir von PHP5. (leicht am Code zu erkennen)
Dort muss zur Kenntlichmachung einer statischen Methode das
Schlüsselwort static genutzt werden.
MfG, Ulf
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:33:55 von Markus Kobligk
Peter Schmidt schrieb:
> Solange die Methode doSomething() nicht auf irgendwas mit $this zugreift
> (was ja eine Instanz der Klasse voraussetzen würde) ist sie sehr wohl
> eine statische Klassenmethode. In PHP wird sowas leider nicht durch ein
> gesondertes Schlüsselwort markiert.
Danke für die Aufklärung.
Wo im Manual findet man denn solche Feinheiten, dass eine Methode
automatisch static ist, solange keine Zugriff mit $this erfolgt?
Gruß,
..\\arkus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:38:14 von Markus Kobligk
Ulf Kadner schrieb:
> Er spricht im gegensatz zu Dir von PHP5.
Richtig, das hatte ich aber auch vergessen zuschreiben.
> Dort muss zur Kenntlichmachung einer statischen Methode das
> Schlüsselwort static genutzt werden.
Genau dies war der Grund meiner Frage. Warum habe ich Zugriff auf die
Methode doSomething mit dem ::-Operator, wenn sie nicht als static
gekennzeichnet ist?
Ist die Antwort von P. Schmidt denn nun falsch?
Gruß,
..\\arkus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:39:02 von Peter Schmidt
Ulf Kadner schrieb:
> Peter Schmidt schrieb:
>
>> Solange die Methode doSomething() nicht auf irgendwas mit $this zugreift
>> (was ja eine Instanz der Klasse voraussetzen würde) ist sie sehr wohl
>> eine statische Klassenmethode. In PHP wird sowas leider nicht durch ein
>> gesondertes Schlüsselwort markiert.
>
> Er spricht im gegensatz zu Dir von PHP5. (leicht am Code zu erkennen)
>
> Dort muss zur Kenntlichmachung einer statischen Methode das
> Schlüsselwort static genutzt werden.
Ohh, huch, das gibts endlich in PHP5? Mea culpa, bin leider noch
gezwungen vorhandenen PHP4-Projekte zu betreuen und konnte somit leider
noch nicht richtig in den Genuß von PHP5 kommen. Daher hab ich das
public oben übersehen und nicht geschaltet... :(
Gruß
Pta
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:39:36 von Ulf Kadner
Markus Kobligk schrieb:
> Danke für die Aufklärung.
> Wo im Manual findet man denn solche Feinheiten, dass eine Methode
> automatisch static ist, solange keine Zugriff mit $this erfolgt?
Das gilt nur für PHP4!
MfG, Ulf
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:45:28 von Ulf Kadner
Markus Kobligk schrieb:
>> Dort muss zur Kenntlichmachung einer statischen Methode das
>> Schlüsselwort static genutzt werden.
> Genau dies war der Grund meiner Frage. Warum habe ich Zugriff auf die
> Methode doSomething mit dem ::-Operator, wenn sie nicht als static
> gekennzeichnet ist?
>
> Ist die Antwort von P. Schmidt denn nun falsch?
In erster Linie kann dazu eine Einstellung in der php.ini zuständig sein
die angibt ob PHP5 im PHP4-Kompatibilitätsmodus läuft. Mir war auch noch
was mit eine Bug in erinnerung, aber da muste selbst mal suchen.
MfG, Ulf
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 16:52:19 von Michael Fesser
..oO(Peter Schmidt)
>Markus Kobligk schrieb:
>
>> Nun in obigem ist nichts (speziell die Funktion doSomething())
>> konstant,statisch oder überschrieben. Daher nun meine Frage, warum
>> dieser Code einwandfrei ausgeführt wird (zumindest auf meinem Rechner)?
>
>Solange die Methode doSomething() nicht auf irgendwas mit $this zugreift
>(was ja eine Instanz der Klasse voraussetzen würde) ist sie sehr wohl
>eine statische Klassenmethode.
Das ist unsauber.
>In PHP wird sowas leider nicht durch ein
>gesondertes Schlüsselwort markiert.
Das Schlüsselwort 'static' existiert. Der Code des OP sollte laut Manual
eine E_STRICT-Warnung auslösen.
Micha
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 17:00:51 von Michael Fesser
..oO(Ulf Kadner)
>Markus Kobligk schrieb:
>
>>> Dort muss zur Kenntlichmachung einer statischen Methode das
>>> Schlüsselwort static genutzt werden.
>> Genau dies war der Grund meiner Frage. Warum habe ich Zugriff auf die
>> Methode doSomething mit dem ::-Operator, wenn sie nicht als static
>> gekennzeichnet ist?
>>
>> Ist die Antwort von P. Schmidt denn nun falsch?
>
>In erster Linie kann dazu eine Einstellung in der php.ini zuständig sein
>die angibt ob PHP5 im PHP4-Kompatibilitätsmodus läuft.
Selbst ohne Kompatibilitätsmodus geht das unter PHP5 noch. Immerhin
gibt's aber eine E_STRICT-Warnung, daß nicht-statische Methoden nicht
statisch aufgerufen werden sollten.
Micha
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 17:04:01 von Markus Kobligk
Ulf Kadner schrieb:
> In erster Linie kann dazu eine Einstellung in der php.ini zuständig sein
> die angibt ob PHP5 im PHP4-Kompatibilitätsmodus läuft. Mir war auch noch
> was mit eine Bug in erinnerung, aber da muste selbst mal suchen.
Kompatibilitätsmodus ist ausgeschaltet bei mir.
Wie Michael Fesser bereits schrieb geht das unter PHP5 trotzdem.
Nun nachdem ich die Option E_STRICT eingebunden habe bekomme ich auch
eine E_STRICT-Warnung.
Gruß,
Markus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 17:36:30 von Ulf Kadner
Michael Fesser schrieb:
> Selbst ohne Kompatibilitätsmodus geht das unter PHP5 noch. Immerhin
> gibt's aber eine E_STRICT-Warnung, daß nicht-statische Methoden nicht
> statisch aufgerufen werden sollten.
Also geht nicht! :-) Ich dachte es wäre klar das ich das bereits
gedanklich einbeziehe. :-o
MfG, Ulf
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 17:39:27 von Ulf Kadner
Markus Kobligk schrieb:
> Kompatibilitätsmodus ist ausgeschaltet bei mir.
Gut
> Wie Michael Fesser bereits schrieb geht das unter PHP5 trotzdem.
Nein es geht nicht da es eine Warnung auslöst. Wenn etwas mit einem
Fehler endet geht es für gewöhnlich nicht.
> Nun nachdem ich die Option E_STRICT eingebunden habe bekomme ich auch
> eine E_STRICT-Warnung.
Wer hätte das gedacht! :-] Entsprechende Fehlerbehandlung setzt man
natürlich vorraus.
MfG, Ulf
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 03.11.2006 18:05:31 von Markus Kobligk
Ulf Kadner schrieb:
> Nein es geht nicht da es eine Warnung auslöst. Wenn etwas mit einem
> Fehler endet geht es für gewöhnlich nicht.
Mein Fehler, hatte mich falsch ausgedrückt, es ging solange E_STRICT
nicht eingeschaltet war im error_reporting...
> Wer hätte das gedacht! :-] Entsprechende Fehlerbehandlung setzt man
> natürlich vorraus.
Ich hatte bisher einfach schlicht übersehen, dass E_ALL nicht E_STRICT
beinhaltet.
Gruß,
..\\arkus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 04.11.2006 17:44:22 von Claus Reibenstein
Ulf Kadner schrieb:
> Nein es geht nicht da es eine Warnung auslöst. Wenn etwas mit einem
¯¯¯¯¯¯¯
> Fehler endet geht es für gewöhnlich nicht.
¯¯¯¯¯¯
Warnung und Fehler sind zwei verschiedene Dinge mit unterschiedlichen
Konsequenzen.
Gruß. Claus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 04.11.2006 18:23:30 von Ulf Kadner
Claus Reibenstein schrieb:
> Ulf Kadner schrieb:
>
>> Nein es geht nicht da es eine Warnung auslöst. Wenn etwas mit einem
> ¯¯¯¯¯¯¯
>> Fehler endet geht es für gewöhnlich nicht.
> ¯¯¯¯¯¯
> Warnung und Fehler sind zwei verschiedene Dinge mit unterschiedlichen
> Konsequenzen.
Hättest mal schön weitergelesen. :-)
| Entsprechende Fehlerbehandlung setzt man natürlich vorraus.
Oder hat ichs für Dich 2x schreiben sollen? Kann ja sein. Hat ja jeder
so seinen Fetisch. :-P
MfG, Ulf
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 04.11.2006 18:35:53 von Claus Reibenstein
Ulf Kadner schrieb:
> Claus Reibenstein schrieb:
>
>> Ulf Kadner schrieb:
>>
>>> Nein es geht nicht da es eine Warnung auslöst. Wenn etwas mit einem
>> ¯¯¯¯¯¯¯
>>> Fehler endet geht es für gewöhnlich nicht.
>> ¯¯¯¯¯¯
>
> Hättest mal schön weitergelesen. :-)
>
> | Entsprechende Fehlerbehandlung setzt man natürlich vorraus.
Habe ich gelesen. Und? Was hat das damit zu tun?
> Oder hat ichs für Dich 2x schreiben sollen? Kann ja sein. Hat ja jeder
> so seinen Fetisch. :-P
Mir scheint eher, dass ich es für Dich noch ein zweites Mal schreiben muss.
Aber vielleicht reicht es ja, wenn Du mein Posting einfach noch ein
weiteres Mal sorgfältig und in Ruhe durchliest und versuchst, seinen
Inhalt zu erfassen (Hinweis: es geht um die Begriffe "Warnung" und
"Fehler").
Gruß. Claus
Re: Verständnisproblem mit Gültigkeitsbereichsoperator ::
am 04.11.2006 18:45:42 von Niels Braczek
Claus Reibenstein schrieb:
> Aber vielleicht reicht es ja, wenn Du mein Posting einfach noch ein
> weiteres Mal sorgfältig und in Ruhe durchliest und versuchst, seinen
> Inhalt zu erfassen (Hinweis: es geht um die Begriffe "Warnung" und
> "Fehler").
Ich interpretiere auch Notices als Fehler. Auch falsch geschriebene
Labels sind Fehler, obwohl sie keine Auswirkung auf das
Laufzeitverhalten haben.
MfG
Niels
--=20
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------