Was spricht gegen Java?

7 Kommentare

Also wenn ich Artikel wie „Was fehlt dir an PHP?“ (hier vom PHP Gangsta) lese und die Kommentare dazu, frag ich mich: Warum nicht gleich Java nehmen? Was spricht gegen Java?

PHP scheint ja wirklich immer mehr in Richtung Java zu tendieren, vielleicht haben wir bald auch einen Java Zwilling der dann den Vorteil hat, dass er bei fast allen Hostern standardmäßig läuft.
Aber „Hoster“ ist doch nicht so ein großes Argument gegen Java? Einen Root oder vServer (mit Root Rechten) gibt es doch schon ab 10-15 Euro und da lässt sich ja dann auch Java drauf installieren und ich wette, dass es bestimmt einen Java-Hoster gibt, der ein bisschen Platz umsonst anbietet.

Das Problem ist (und da bin ich lange nicht der erste der das sagt), dass PHP keine klare Richtung hat: soll es objektorientierter werden oder weiterhin die einfache Erlernbarkeit und Verwendung fördern?
Wenn OOP gewünscht ist, dann kann man gleich auf Java umsteigen. Wenn PHP weiterhin „Duck-Typing“ und sonstige „fehlertolerante“ Features bietet, dann sollte dieser Stil vielleicht etwas weiter ausgebaut werden (keine Ahnung wie).
Vielleicht ist aber auch gerade dieser OOP-Prozedur-Hybrid Stil das, was PHP so besonders macht?

Ja, auch mir fehlt meistens die feste Typisierung in PHP oder „finally“ beim try-catch und weitere „OOP“ Features. Aber wenn ich das benötige, programmiere ich eben in Java (außer ich bin wie in den meisten Fällen vom System zu PHP gezwungen ;) ).
PHP bevorzuge ich, gerade weil ich damit schnell was zusammen gehackt bekomme.

Aus welchem Grund verwendet ihr lieber PHP als Java?

Advertisements

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!

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!