Bug?: Vermengung Klassen und Objekte

Bug?: Vermengung Klassen und Objekte

am 29.06.2006 10:31:59 von thornythegod

Hallo,

ich bin gerade in PHP4 über ein seltsames Verhalten gestoßen, welches
auch in PHP5 (getestet auf PHP 4.3, 4.4.1 und 5.5.1) auftritt. Folgender
Code:


class CStatic {

function mstatic() {

print $this->oVar . "
";

print "Sind in mstatic";

}

}

class Objekt {

public $oVar = "Variable von Objekt";

function Methode() {

CStatic::mstatic();

}

}

$objO = new Objekt();
$objO->Methode();

?>

Die Ausgabe ist erstaunlicherweise:

---
Variable von Objekt
Sind in mstatic
---

Ich kann mir dieses Verhalten weder logisch noch mit längerem Suchem im
Handbuch erklären. Wie kann CStatic auf die Klassenvariablen des
Objektes "Objekt" zugreifen? Wird CStatic innerhalb des Objektkontents
ausgeführt?

Definiert man die Methode mstatic als static, wird (wie erwartet) ein
Fataler Error auf Grund der Nutzung von $this außerhalb eines
Objekt-Kontextes geworfen.

Mir stellt sich jetzt die Frage, ob ich es einfach nicht verstehe, ob es
gewollt ist oder ob es sich hierbei um einen Bug handelt.

Gruß,
Torsten

Re: Bug?: Vermengung Klassen und Objekte

am 29.06.2006 14:10:24 von Ulf Kadner

Torsten Zühlsdorff wrote:

> ich bin gerade in PHP4 über ein seltsames Verhalten gestoßen, welches
> auch in PHP5 (getestet auf PHP 4.3, 4.4.1 und 5.5.1) auftritt. Folgender
> Code:

Das nehme ich Dir so nicht ab! Nachfolgend von Dir geschriebener Code
ist halbherziger PHP5-Code, der auf PHP4 einen Fehler erzeugt! (public
kennt PHP4 nicht)

> class CStatic {
> function mstatic() {

Wenn es denn PHP5 Code sein soll gehört da static hin. Wenn es auf
PHP4+PHP5 laufen soll ists so OK.

> print $this->oVar . "
";

Wenns auf PHP 4+5 laufen soll must Du hier pruefen ob $this auf ein
Objekt vom Typ CStatic verweist.

> class Objekt {
>
> public $oVar = "Variable von Objekt";

wenns auf PHP5 laufen soll ists so OK, Wenns auch auf PHP4 laufen soll
muss da ein var stehen.

> Die Ausgabe ist erstaunlicherweise:
>
> ---
> Variable von Objekt
> Sind in mstatic
> ---

Nö, das ist normal! Da PHP4 noch keine statischen Methoden kannte, bzw.
jede Methode wie eine statische angesprochen werden konnte und ich
annehme, das Du Code entwickeln willst, der auf beiden läuft, bleiben
Dir nur 2 Möglichkeiten.

Entweder Du entwickelst gleich doppelt für 4+5 und bindest die jeweilig
notwendige Klasse über eine "Switch-Datei" ein oder Du berücksichtigst
derartige Altlasten im Code.

class CStatic {
function mstatic() {
if (!isset($this) || (get_class($this) != __CLASS__))
echo "statischer Aufruf\n";
else echo "Kein statischer Aufruf\n";
}
}
class Obj {
function abc() { CStatic::mstatic(); }
function def() {
$stat = new CStatic();
$stat->mstatic();
}
}

$obj = new Obj();
$obj->abc();
$obj->def();

> Ich kann mir dieses Verhalten weder logisch noch mit längerem Suchem im
> Handbuch erklären.

Das Verhalten ist sozusagen histrorisch bedingt. :-)
Allerdings wuest ich jetzt auf Anhieb auch keine Stelle im Manual, die
genau Dein Problem behandelt.

> Definiert man die Methode mstatic als static, wird (wie erwartet) ein
> Fataler Error auf Grund der Nutzung von $this außerhalb eines
> Objekt-Kontextes geworfen.

Ja, aber dann isses ja nicht mehr portabel auf PHP4. Oder ist das nicht
notwendig?

> Mir stellt sich jetzt die Frage, ob ich es einfach nicht verstehe, ob es
> gewollt ist oder ob es sich hierbei um einen Bug handelt.

Kein Bug! Definitiv nicht!

MfG, Ulf

Re: Bug?: Vermengung Klassen und Objekte

am 29.06.2006 14:30:12 von thornythegod

Ulf Kadner schrieb:

>> ich bin gerade in PHP4 über ein seltsames Verhalten gestoßen, welches
>> auch in PHP5 (getestet auf PHP 4.3, 4.4.1 und 5.5.1) auftritt. Folgender
>> Code:
>
> Das nehme ich Dir so nicht ab! Nachfolgend von Dir geschriebener Code
> ist halbherziger PHP5-Code, der auf PHP4 einen Fehler erzeugt! (public
> kennt PHP4 nicht)

Ich halte die Mitlesen für intelligent genug, aus dem public ein var zu
machen ;)

Außerdem: Es ist nur ein Beispiel und soll den fehler demonstrieren. Das
hat nichts mit halbherzigen Code zu tun.

[Beiträge, die meine Intention nicht beachten]


>> Ich kann mir dieses Verhalten weder logisch noch mit längerem Suchem im
>> Handbuch erklären.
>
> Das Verhalten ist sozusagen histrorisch bedingt. :-)
> Allerdings wuest ich jetzt auf Anhieb auch keine Stelle im Manual, die
> genau Dein Problem behandelt.

Das ist jetzt eine sehr unbefriedigende Antwort. Steckt da eine Logik
hinter? Selbst im Handbuch für PHP4 steht geschrieben, dass Klassen
nicht auf Objektvariabeln zugreifen können. Daher erscheint es noch
unsinniger, dass eine Klasse plötzlich auf die Objektvariablen des
Objektes zugreifen kann, in welchem der Aufruf geschieht.
Und überhaupt, macht dieses Verhalten keinen Sinn.

>> Definiert man die Methode mstatic als static, wird (wie erwartet) ein
>> Fataler Error auf Grund der Nutzung von $this außerhalb eines
>> Objekt-Kontextes geworfen.
>
> Ja, aber dann isses ja nicht mehr portabel auf PHP4. Oder ist das nicht
> notwendig?

Wie gesagt: Das ist ein Beispiel. Ich entwickle schon lange nicht mehr
auf PHP4. In meine Projekte fließt kein PHP4 Code mehr ein, kein Pear,
kein nichts.
Aber durch die Arbeit darf ich gerade für Typ3 Extensions entwicklen.
Und das funktioniert nur ordnungsgemäß unter PHP4. Und daher bin ich
dadrüber gestolpert.

>> Mir stellt sich jetzt die Frage, ob ich es einfach nicht verstehe, ob es
>> gewollt ist oder ob es sich hierbei um einen Bug handelt.
>
> Kein Bug! Definitiv nicht!

Warum?
Wie kann es sein, dass man eine Klasse auf Objektvariablen zugreifen
kann, die nur im Kontext des Aufrufes stehen? Du möchtest mir doch jetzt
nicht erklären, dass es so gewollt ist ;)
Wenn ich in PHP5 eine Funktion nicht als static deklariere, funktioniert
es auch da. Die berühmte Rückwärtskompatibiltät oder doch gewollt?

Gruß,
Torsten

Re: Bug?: Vermengung Klassen und Objekte

am 29.06.2006 14:42:41 von Ulf Kadner

Torsten Zühlsdorff wrote:

> Ich halte die Mitlesen für intelligent genug, aus dem public ein var zu
> machen ;)

:-o

> Außerdem: Es ist nur ein Beispiel und soll den fehler demonstrieren. Das
> hat nichts mit halbherzigen Code zu tun.

Ich als Lesender kann mit derartigen gewurstel ab nix anfangen. Woher
soll ich bitte wissen das Du den Code nicht so nutzt?

>>Das Verhalten ist sozusagen histrorisch bedingt. :-)
>>Allerdings wuest ich jetzt auf Anhieb auch keine Stelle im Manual, die
>>genau Dein Problem behandelt.

> Wie gesagt: Das ist ein Beispiel. Ich entwickle schon lange nicht mehr
> auf PHP4. In meine Projekte fließt kein PHP4 Code mehr ein, kein Pear,
> kein nichts.

Kein Pear! Freut mich zu hören, das meine Meinung zu PEAR auch von
Anderen geteilt wird.

> Aber durch die Arbeit darf ich gerade für Typ3 Extensions entwicklen.
> Und das funktioniert nur ordnungsgemäß unter PHP4. Und daher bin ich
> dadrüber gestolpert.

Mein Mitleid.

>>Kein Bug! Definitiv nicht!
>
> Warum?

http://bugs.php.net/bug.php?id=33980&edit=1

MfG, Ulf

Re: Bug?: Vermengung Klassen und Objekte

am 29.06.2006 14:50:56 von thornythegod

Ulf Kadner schrieb:

>> Außerdem: Es ist nur ein Beispiel und soll den fehler demonstrieren. Das
>> hat nichts mit halbherzigen Code zu tun.
>
> Ich als Lesender kann mit derartigen gewurstel ab nix anfangen. Woher
> soll ich bitte wissen das Du den Code nicht so nutzt?

Naja. Da gibt es mehrere Möglichkeiten:
1. Man kennt mich
2. Glaskugel fragen
3. Die Teststruktur des Codes erkennen.

Aber ich werde das nächste mal darauf achten, dass ich wirklich "Test"
dran schreibe. Wenn man bedenkt, was man so täglich sieht, verstehe ich
deinen Einwurf vollkommen.

>>> Das Verhalten ist sozusagen histrorisch bedingt. :-)
>>> Allerdings wuest ich jetzt auf Anhieb auch keine Stelle im Manual, die
>>> genau Dein Problem behandelt.
>
>> Wie gesagt: Das ist ein Beispiel. Ich entwickle schon lange nicht mehr
>> auf PHP4. In meine Projekte fließt kein PHP4 Code mehr ein, kein Pear,
>> kein nichts.
>
> Kein Pear! Freut mich zu hören, das meine Meinung zu PEAR auch von
> Anderen geteilt wird.

Ich bin nicht alleine? Das erstaunt mich jetzt aber doch. HALLO :)

>> Aber durch die Arbeit darf ich gerade für Typ3 Extensions entwicklen.
>> Und das funktioniert nur ordnungsgemäß unter PHP4. Und daher bin ich
>> dadrüber gestolpert.
>
> Mein Mitleid.

Danke.

>>> Kein Bug! Definitiv nicht!
>>
>> Warum?
>
> http://bugs.php.net/bug.php?id=33980&edit=1

Die Begründung ist wirklich toll, aber danke für die Recherche. Ich
frage mich langsam, warum ich bei der Recherche nicht darüber gestolpert
bin. Nochmal danke.

Gruß,
Torsten

Re: Bug?: Vermengung Klassen und Objekte

am 29.06.2006 15:45:40 von Frank Schenk

Torsten Zühlsdorff wrote:
> Hallo,
>
> ich bin gerade in PHP4 über ein seltsames Verhalten gestoßen, welches
> auch in PHP5 (getestet auf PHP 4.3, 4.4.1 und 5.5.1) auftritt.
>
> Ich kann mir dieses Verhalten weder logisch noch mit längerem Suchem im
> Handbuch erklären. Wie kann CStatic auf die Klassenvariablen des
> Objektes "Objekt" zugreifen? Wird CStatic innerhalb des Objektkontents
> ausgeführt?

Das brachte mich auch zum Rätseln aber dann fand ich:

http://us2.php.net/manual/en/keyword.paamayim-nekudotayim.ph p

Zitat:
In the above example, class B redefines the function example(). The
original definition in class A is shadowed and no longer available,
unless you are referring specifically to the implementation of example()
in class A using the ::-operator. Write A::example() to do this (in
fact, you should be writing parent::example(), as shown in the next
section).

In this context, there is a current object and it may have object
variables. Thus, when used from WITHIN an object function, you may use
$this and object variables.




It's not a bug, it's a feature :-)


gruß, Frank

Re: Bug?: Vermengung Klassen und Objekte

am 30.06.2006 16:27:28 von Kay-Michael Voit

Was macht ihr dann? Alles selbst schreiben?

Re: Bug?: Vermengung Klassen und Objekte

am 30.06.2006 20:21:06 von Ulf Kadner

Torsten Zühlsdorff wrote:

> Die Begründung ist wirklich toll,

hehe :-) Sehe ich auch so. Aber was will man machen. Irgenwann hatte ich
keinen Bock mehr weiter zu suchen.

> frage mich langsam, warum ich bei der Recherche nicht darüber gestolpert
> bin.

Hatte ich schon rübergelegt. :-x

MfG, Ulf

Re: Bug?: Vermengung Klassen und Objekte

am 30.06.2006 20:26:23 von Ulf Kadner

Kay-Michael Voit wrote:

> Was macht ihr dann? Alles selbst schreiben?

Interessent wäre zu wissen von was Du sprichst!
(Quoting ist Dir bekannt?)

Liege ich richtig in der Annahme das Du evtl. PEAR meinst?

Selber schreiben ist nicht mehr nötig.

Mein Framework ist in den letzten Jahren vernünftig gewachsen.
Ist ehh sinnvoller etwas zur Hand zu haben, wo Du Dich nicht erst um
Lizenzrechtlichen Kram kümmern musst und keine Einarbeitung benötigst.
(Solange es möglich ist natürlich)

MfG, Ulf