phpbar.de logo

Mailinglisten-Archive

[php] Zeiger bei Klassen

[php] Zeiger bei Klassen

Tobias Ratschiller tobias_(at)_dnet.it
Mon, 29 May 2000 20:15:36 +0200


[Kopie von Objekten]
> Ich will natuerlich auch spaeter noch auf $abschnitte... zugreifen
> koennen. Ist wohl doch kein Zeiger? Geht sowas in PHP ueberhaupt
> oder muss ich da umdenken?

Richtig, PHP macht keinen Zeiger sondern eine Kopie. Till sagt dazu
ungefähr: "Entweder Du kennst PHP sehr gut, oder Du bist überrascht."

Perl macht es wie erwartet:
package my_class;
    my($class)  = shift;
    my(%params) = _(at)__;

    bless {
            "var1" => $params{"var1"},
            "var2" => $params{"var2"},
            "var3" => $params{"var3"}
    }, $class;

package main;

$my_object = my_class;

%{$my_object}->{'var1'} = 1;
%{$my_object}->{'var2'} = 2;
%{$my_object}->{'var3'} = 3;

$new_object = $my_object;

%{$new_object}->{'var1'} = 3;
%{$new_object}->{'var2'} = 2;
%{$new_object}->{'var3'} = 1;

print("My object goes ".%{$my_object}->{'var1'}.",
".%{$my_object}->{'var2'}.",
print("New object goes ".%{$new_object}->{'var1'}.",
".%{$new_object}->{'var2'}.

Dieser Code definiert ein Package (vergleichbar mit PHPs Klassen) und
erstellt eine Instanz. Dieser Instanz weist das Skript einige Variablen zu.
Die Instanz wird einer neuen Variable zugewiesen, wo die Instanzvariablen
verändert werden. Bei der Ausgabe der Originalinstanz und der "Kopie" sieht
man, daß beide Variablen auf dasselbe Objekt zeigen:
My object goes 3, 2, 1
New object goes 3, 2, 1

Nun dasselbe mit PHP:
<?
class my_class
{
    var $var1, $var2, $var3;
}

$my_object = new my_class;

$my_object->var1 = 1;
$my_object->var2 = 2;
$my_object->var3 = 3;

$new_object = $my_object;

$new_object->var1 = 3;
$new_object->var2 = 2;
$new_object->var3 = 1;

print("My object goes $my_object->var1, $my_object->var2,
$my_object->var3\n");
print("New object goes $new_object->var1, $new_object->var2,
$new_object->var3\n");
?>

(Übrigens sieht man hier auch, wie herrlich einfach PHP doch ist.)
Zur Überraschung aller gibt dieser Code diese Ausgabe:
My object goes 1, 2, 3
New object goes 3, 2, 1

Also entstehen durch die Variablenzuweisung $new_object = $my_object;
Kopien - Du hast das auch bemerkt. Abhilfe schafft wie bei vielen Problemen
nur PHP 4.0. Erst diese Version kann ordentliche Referenzen ("Zeiger"). [1]
Damit kannst Du diesen Code schreiben:
$new_object = &$my_object
Und schwups, es entsteht ein Zeiger auf das Objekt. Alles wird gut. [2]

Mit freundlichen Grüßen,
  Tobias Ratschiller

[1] Siehe auch:
    Andi Gutmans. /PHP 4: Reference Counting and Aliasing./
    Zend.com http://www.zend.com/zend/art/ref-count.php
[2] Viele weitere Lösungen und Muntermacher findet man ab 22. Juni in:
    Ratschiller, Gerken. Web Application Development with PHP.
    Indianapolis: New Riders Publishing, in press.



php::bar PHP Wiki   -   Listenarchive