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