Ist ein String ein Objekt in PHP?

Hinterlasse einen Kommentar

Gerade gesehen, dass jemand mit der Suche nach „strings sind in php 5 objekte wie in java“ auf meinem Blog gelandet ist. Ich war mir auf Anhieb sicher, dass in PHP Strings keine Objekte sind, hab aber bisschen gebraucht, um auch wieder genau zu wissen, warum das so ist bzw. wie ich das beweisen kann.

1. Ein String ist ein Skalar – also ein „einfacher“ Wert oder besser: Eine Variable die nur einen Wert enthält. In Java Beispielsweise enthält ein String Objekt auch weitere Werte.
In PHP kann man mit „is_scalar“ überprüfen, ob eine Variable ein Skalar ist: ^^

$string = "hello world";
var_dump(is_scalar($string)); // bool(true)

2. Über einen String kann man keine Methode aufrufen – dies geht aber zum Beispiel in Java:

System.out.println("hello world".length()); //11

3. Dieser Punkt hängt zusammen mit Punkt 2: In PHP gibt es keine String Klasse.
$s = new String(); führt zu einem fatal error: Class ‚String‘ not found.

So, ich glaube das sollten genug Beweise gewesen sein.

Noch eine nachträgliche Anmerkung:
Anfangs wollte ich diese Tatsache beweisen indem ich ein Objekt einer Methode mitgebe, darin einen Wert ändere und nach der Methode zeige, dass sich das Objekt geändert hat. Das gleiche wollte ich dann noch mal mit einem String ausprobieren und dann zeigen, dass sich dieser nicht verändert hätte.

Bei diesem Vorgehen gibt es aber einen Denkfehler: Objekte werden verändert, Strings werden überschrieben! Wenn man in PHP ein Objekt einer Methode übergibt, es überschreibt und dann verändert, hat sich an dem ursprünglichen Objekt genauso wenig getan wie bei einem String.

Auch in Java ist es nicht viel anders: Die String-Klasse und damit auch String-Objekte sind „immutable“ (unveränderlich). Gibt man einen String an eine Methode weiter, kann diese ihn nicht verändern sondern höchstens überschreiben. Davon bleibt aber der ursprüngliche String unberührt.
Verändern kann man ein Objekt nur über Methoden oder public Properties. (Reflection ausgenommen.)

Um Strings durch Methoden doch „indirekt“ zu verändern, kann man diese in PHP als Referenz übergeben:

$s = "";
modify($s);
echo $s; //hello world
function modify(&$s){
    $s = "hello world";
}

In Java gibt es (meines Wissens nach) keine Referenzen!

Advertisements

Call By Reference in PHP5 wie in Java

3 Kommentare

Es ist ja mittlerweile bekannt, dass Objekte ab PHP5 als Referenz an Methoden und Funktionen übergeben werden. Was ich aber heute feststellen musste: Dies ist so nicht ganz richtig! Es wird nämlich wie in Java verfahren und es wird eine Kopie der Referenz auf das Objekt als Parameter übergeben! (siehe dieser Beitrag bei stackoverflow.com)

Was bedeutet das genau?
Wenn ein Objekt an eine Funktion übergeben wird und dann eine Methode dieses Objektes aufgerufen wird, welche das Objekt verändert, so ist auch das ursprüngliche Objekt verändert:
/* modifizierende Funktion */
function addString(ArrayObject $a, $string){
$a->append($string);
}
$x = new ArrayObject();
addString($x, "hello");
echo $x->count(); //1

Bis dahin ist (mir) alles klar (gewesen).
Wenn in der Funktion aber das Objekt überschrieben und dann verändert wird, ändert sich das ursprüngliche Objekt nicht!
/* modifizierende Funktion */
function addString(ArrayObject $a, $string){
$a = new ArrayObject();
$a->append($string);
}
$x = new ArrayObject();
addString($x, "hello");
echo $x->count(); //0

Letztere Funktion würde das Objekt nur dann verändern, wenn man den bekannten „Reference Operator“ & verwendet (nennt man den so?):
/* modifizierende Funktion */
function addString(ArrayObject &$a, $string){
$a = new ArrayObject();
$a->append($string);
}
$x = new ArrayObject();
addString($x, "hello");
echo $x->count(); //1

Was lernen wir daraus? =) Wird ein Objekt als Funktions Parameter übergeben, wird in Wirklichkeit eine Kopie der Referenz übergeben. Überschreibt man diese Referenz, wird nicht das Objekt selbst überschrieben.

Übrigens: In Java kenne ich keine Möglichkeit, ein Objekt als „echte“ Referenz zu übergeben. In der Hinsicht ist PHP also ein kleines bisschen überlegen! *gg*

An dieser Stelle möchte ich übrigens auf stackoverflow.com hinweisen. Eine super Community, in der Fragen rund um die Computerwelt super beantwortet werden. (Man kann natürlich auch selbst Fragen beantworten) Das Frage-Antwort System ist dabei etwas ausgeklügelter als in einem „normalen“ Forum.
Auf jeden Fall empfehlenswert!