OOP - Probleme mit Instanzvariablen
schildi
- php
0 XaraX2 Andreas Korthaus
Hallo,
ich habe ein Problem mit einem Konstrukt folgender Art:
<?php
class A
{
var $id = NULL;
function A($id)
{
$this->id = $id;
}
function set_id($id)
{
$this->id = $id;
}
function get_id()
{
return $this->id;
}
}
class B
{
var $my_a = NULL;
function B($a)
{
$this->my_a = $a;
}
function show_my_a_id()
{
echo($this->my_a->get_id() ."<br>");
}
}
$a = new A("1");
$b = new B($a);
$b->show_my_a_id();
$a->set_id("2");
$b->show_my_a_id();
?>
Wieso wird der Wert von $a nicht auch in der Klasse $b aktualisiert???
Die Variable $this->my_a in der Klasse B zeigt doch auf $a!
Das heisst, wenn ich a direkt verändere, müssten auch alle verweise auf a den neuen Wert (hier:2) anzeigen.
So was ist doch enorm wichtig für oop-programmierung!?
Oder steh ich auf dem Schlauch?
Hallo,
<?php
class A
{
var $id = NULL;
# http://de3.php.net/manual/de/language.oop.php#keyword.class
# bitte die Anmerkung zu PHP 4.x lesen
function A($id)
{
$this->id = $id;
}function set_id($id)
{
$this->id = $id;
}
function get_id()
{
return $this->id;
}
}class B
{
var $my_a = NULL;function B($a)
{
$this->my_a = $a;}
function show_my_a_id()
{
echo($this->my_a->get_id() ."<br>");
}
}$a = new A("1");
# prin_r($a); zum Testen rein
$b = new B($a);
# dann hier mit new B($a->get_id()) arbeiten
$b->show_my_a_id();
$a->set_id("2");
$b->show_my_a_id();
?>
Gruß aus Berlin!
eddi
Hallo,
[...]
$a = new A("1");
# prin_r($a); zum Testen rein
hm... da prin_r keine Standardfunktion ist,
solltest du mal deine Funktion prin-r() hier posten :-D
mfg
Twilo
Hallo,
solltest du mal deine Funktion prin-r() hier posten :-D
soll natürlich so lauten
solltest du mal deine Funktion prin_r() hier posten :-D
mfg
Twilo
hab die antworten grad überflogen.
super! vielen dank!
werd alles genau angucken.
dachte mir schon, dass eben nur kopiert wird, statt referenziert - so wie sich das eigentl. gehört.
php5 will ich momentan noch nicht anwenden. ab der stable version dann - wenn möglich mit provider des kunden etc.
die alte schreibweise sollte doch auch in den kommenden versionen unterstüzt bleiben oder?
Hallo!
php5 will ich momentan noch nicht anwenden.
warum nicht?
ab der stable version dann - wenn möglich mit provider des kunden etc.
Welche stabile Version? PHP5 ist ja schon seit einem halben Jahr stabil, und ich setze es fast überall ein. Und auch die meisten halbwegs guten Provider bieten das inzwischen an. Hat wirklich viele Vorteile, nicht nur die neuen OOP-Features(Exceptions, private/public, Interfaces...), z.B. auch XML-Support wurde erheblich verbessert.
die alte schreibweise sollte doch auch in den kommenden versionen unterstüzt bleiben oder?
Zum großen Teil schon, einige Dinge funktionieren aber etwas anders. Kopieren von Objekten geht nur noch explizit durch "clone". Oder auch Zuweisung eines Wertes zu $this ist nich mehr möglich. Einen Überblick bekommst Du bei der folgenden Präsentation: http://talks.php.net/show/migrating-ffm2004/ (und den übrigen Links aus meinem Posting oben).
Gerade bei neuen Projekten würde ich auf PHP5 setzen. Lässt sich doch viel angenehmer objektorientiert programmieren! Und wie gesagt habe ich nirgendwo Webspace wo ich PHP5 nicht nutzen könnte.
Grüße
Andreas
Hallo Twilo,
http://de3.php.net/manual/de/function.print-r.php; ich hoffe das ist Dir dann auch Standard genug ;)
Gruß aus Berlin!
eddi
Hallo!
Wieso wird der Wert von $a nicht auch in der Klasse $b aktualisiert???
Die Variable $this->my_a in der Klasse B zeigt doch auf $a!
Das heisst, wenn ich a direkt verändere, müssten auch alle verweise auf a den neuen Wert (hier:2) anzeigen.
So was ist doch enorm wichtig für oop-programmierung!?Oder steh ich auf dem Schlauch?
Nein, das ist einer der Gründe warum die OOP für PHP5 gründlich überarbeitet wurde. In PHP4 werden per Default die Werte kopiert und nicht referenziert. Bei PHP5 müsste das so funktionieren wie Du das versuchst. In PHP4 musst Du extra Referenzen verwenden.
http://tut.php-q.net/referenzen.html
http://de3.php.net/manual/en/migration5.oop.php
http://talks.php.net/show/migrating-ffm2004/1
http://talks.php.net/show/migrating-ffm2004/2
http://www.zend.com/php5/articles/engine2-php-oo.php#Heading3
Ich würde nach Möglichkeit mit PHP5 arbeiten, das bieten sehr viele Provider inzwischen an.
Grüße
Andreas