PHP == Java == Javascript?

Aufgrund meines Studiums werde ich dazu genötigt verschiedene Programmiersprachen  kennen zu lernen. Anfangs war es für mich ein bisschen befremdlich die Konzepte von C oder C++ zu lernen.

In der Zwischenzeit finde ich es aber unglaublich interessant die Feinheiten bzw. die Unterschiede der verschiedenen Programmiersprachen zu erkennen und zu lernen. Der Vorteil liegt auf der Hand. Wenn man weiss, wie sich aktuelle Sprachen unterscheiden, sollte es einem auch in der Zukunft nicht schwer fallen, neue Sprachen und Konzepte zu lernen, weil man weiss, worauf man achten muss.

Momentan mag ich die drei Sprachen Java, PHP und Javascript am meisten und darum habe ich inzwischen als ausgewiesener FizzBuzz Fan das Coding Kata in allen 3 Sprachen gelöst. Ihr könnt übrigens die gelösten Katas auf meinem Github Account herunterladen.

Mit diesem Post möchte ich erreichen, dass man erkennt wie ähnlich Java und PHP inzwischen sind und wie sich Javascript von diesen 2 Sprachen deutlich unterscheidet.

Die Klasse FizzBuzz

Die FizzBuzz Klasse offenbart praktisch noch keine Unterschiede zwischen den 3 Sprachen.

Die Klasse FizzBuzzSequence

Auch in dieser Klasse unterscheiden sich Java und PHP nur unwesentlich. Dadurch das Java Typensicher ist und man auch die Array Grösse schon bei der Initialisierung kennen muss, gibt es minimal mehr zu schreiben, als bei PHP. Die Funktion implode gibt es meines Wissens in Java nicht, darum musste ich einen Helper dafür programmieren -> Dies ist meiner Meinung nach übrigens eine der grossen Stärken von PHP – sie bietet sehr viele einfache Helper Funktionen, die ich in anderen Sprachen vermisse.
Wenn man jetzt die PHP und die Java Klasse mit dem Javascript Example vergleicht, werden die Unterschiede schon deutlich. Und spätestens hier muss man erkennen, dass die Konzepte rund um Javascript sich deutlich von denen von PHP und Java unterscheiden. Das ist sicherlich auch einer der Gründe, warum Javascript einen so schlechten Ruf geniesst. Bei einfachen Beispielen, sieht der Syntax sehr ähnlich aus. Man kann schnell zum Schluss kommen, dass man die Sprache nicht noch extra lernen muss, sonder eigentlich schon fast alles im Griff hat. Wenn man sich aber tiefergreifend mit der Sprache beschäftigt, sieht man, dass es sehr grosse Unterschiede gibt.

Unit Testing mit JUnit / PHPUnit

Als letztes möchte ich das Unittesting zwischen Java und PHP vergleichen (für Javascript habe ich kein Example gemacht). Auch hier zeigen sich deutlich die Ähnlichkeiten. Einerseits ist der Syntax sehr ähnlich und zweitens lehnen sich sowohl JUnit als auch PHPUnit an den xUnit Standard. Wenn man also Unittesting erst einmal im Griff hat, ist der Wechsel zwischen Java / PHP absolut kein Problem.

18 Responses

  1. Dein Vergleich hinkt etwas. Das JavaScript Object FizzBuzz ist, so wie von dir definiert, ein Singleton und keine Klasse, wie es bei den anderen Sprachen der Fall ist.

    MfG Hase

  2. Es ist zwar nicht besonders hübsch, aber in PHP lässt sich in Aufgabe in 73 Zeichen lösen:
    for($i=0;$i<100;)echo(++$i%15?($i%5?($i%3?$i:'fizz'):'buzz'):'fizzbuzz');

  3. Wenn man weiter in OOP einsteigt, dann sieht man wie gewaltig die Unterschiede zwischen Java und PHP sind. Es mag sein, dass die Syntax ähnlich ist, aber das trifft auf viele moderne Programmiersprachen zu. Ob C++,C#,Java oder PHP, von der Syntax her haben sie viele Gemeinsamkeiten, aber konzeptionell muss bei jeder Sprache ein anderen Weg gefahren werden.
    Zum Beispiel, wer in C++ die Operatorenüberladung kennen gelernt hat, der will nie wieder darauf verzichten. In Java gibt es sie zum Beispiel nicht, aber zum Glück normale Methodenüberladung. In PHP gibts nicht mal das bzw. nur über “Hacks” erreichbar.
    Man könnte jetzt noch viele viele extreme Unterschiede aufzählen, aber dazu gibts im Inet genug zu lesen.
    Aber Sätze, wie “Java und PHP unterscheiden sich nur unwesentlich” machen den ganzen Beitrag kaputt.

  4. Hi Hase, Merci für’s Feedback.

    Wenn ich die Javascript Konzepte richtig verstanden habe, würde ich behaupten, dass FizzBuzz.js ein Object Literal ist. Sprich, es ist ein beim Aufruf bereits instanziertes Objekt, welches ausschliesslich public Functions und Attribute bietet.
    Wenn es ein Singleton wäre, müsste so etwas nicht gehen dürfen: var FizzBuzz2 = Object.clone(FizzBuzz). Aber ich lasse mich natürlich gerne eines Besseren belehren.

    Ich gebe Dir aber in dem Punkt recht, dass der Vergleich ein bisschen hinkt, weil ich unter Javascript keine Klasse definiert habe (Dieses Konzept gibt es ja gar nicht).

  5. @Sebastian n1! Das Ziel muss ja aber normalerweise sein, dass es ein normalsterblicher noch versteht 🙂

    @Peter
    Mir war klar, dass ich mich mit diesem Beitrag in die Nesseln setzen werde. Natürlich gibt es zwischen PHP / Java gewaltige Unterschiede, wenn man in’s Detail geht. Und trotzdem haben sich die Sprachen inzwischen sehr angenähert, so dass man als Java Programmierer relativ schnell nach PHP und umgekehrt wechseln kann.
    Eigentlich wollte ich mit diesem Beitrag auch ein bisschen die Java Programmierer ansprechen, welche von PHP häufig wenig bis gar nichts halten.

  6. Huch, mein Fehler. FizzBuzz.js ist kein Singleton im Sinne des Entwurfmusters. Es ist, wie du richtig sagst, ein bereits instanziertes Objekt und keine Klasse.

    Der Begriff “Klasse” ist in JavaScript anders zu gebrauchen als in Java. Es gibt zwar das reservierte Wort “class”, allerdings hat es keine Funktion. Nichtsdestotrotz gibt es Vererbung und insofern auch Klassen von ähnlichen Objekten.

    Damit das hier jetzt nicht den Rahmen sprengt, verlinke ich einfach auf ein Projekt von mir, wo ich die Klassenthematik in JavaScript schon platt getreten habe.

    http://github.com/Kambfhase/Din

    MfG Hase

  7. Ich kann gut verstehen, dass Java-Programmieren nicht viel von PHP halten. Ich bin mit C++ groß geworden, musste dann Java lernen und jetzt entwickle ich ein Webprojekt in PHP. Java ist C++ eindeutig unterlegen. In C++ man einfach viel mehr Möglichkeiten eine elegante Lösung zu entwickeln, obwohl ich hier Java nicht schlecht reden will. Jetzt nach zwei Jahren in denen ich mit PHP arbeite, kann ich nur sagen, dass PHP noch ein großer Stück schwächer ist als Java. Schon wenn es um Typsicherheit geht, so ist es in großen Projekten(OOP) einfach ein Vorteil, denn man nicht einfach wegreden kann. C++ bietet zum Beispiel eine elegante Möglichkeit mit dem Schlüsselwort “auto”. Dadurch wird bei der Variablendeklaration der Datentyp automatisch festgelegt und danach wird Typsicher verfahren.
    PHP hat hat zum Glück in letzten Jahren grundlegende OOP-Konzepte bekommen. Wer heutzutage auf OOP verzichtet, der hat meiner Meinung nach, einfach keine Ahnung von Softwareentwicklung.
    Ich bin gespannt wie es sich mit PHP entwickelt, aber momentan ist es verständlich, dass Leute, die sich mit C++/Java auskennen, einen großen Boden darum machen.

  8. @peter
    > Schon wenn es um Typsicherheit geht, so ist es in großen Projekten(OOP)
    >einfach ein Vorteil, denn man nicht einfach wegreden kann.

    abgesehen von der staendigen wiederholung und behauptung: welche vorteile hat sie denn?

  9. Dein Java-FizzBuzz-Code ist nur die Portierung eines PHP-Gedanken in die Java-Welt. Dies ist meiner Meinung nach vom Grundkonzept schon absolut falsch.

    Bleibt man dann bei Java-Sprachmitteln ohne eigene Helper zu bauen, sind sich PHP und Java auch nicht mehr sehr ähnlich:
    StringBuilder fizzbuzz = new StringBuilder();
    for (int i = start; i <= stop; i++) {
    fizzbuzz.append(_fizzBuzz.getFizzBuzzValueOf(i).append(',');
    }

    return fizzbuzz.substring(0, fizzbuzz.length() - 2);

    Für die Underscores der Attribute in Java wird dir auch jeder Java-Entwickler den Code um die Ohren hauen 😉

    Warum du in dem JavaScript-Code die Logik auch noch einmal in einen Closure packst frage ich mich ernsthaft. Hast du versucht die JavaScript-Version so zu verändern, dass deine Ursprungsthese funktioniert? Packst du den Codes des Closures nämlich in die getString-Methode, sehen sich auf einmal alle Sprachen ähnlich …

  10. @Tobias
    StringBuilder: Danke für den Tip. Habe nämlich auf die Schnelle nix gescheites gefunden, was dem implode ähnelt. Aber mit deinem Konstrukt lässt es sich wunderbar lösen. Wenn man z.B. in PHP Lösungswege kennt und in Java ein Problem hat, versucht man normalerweise ein ähnliches Konzept zu finden.

    CodeConventions: Das mit dem _ ist nur eine Namingconvention. Ich habe in Java schon alle Varianten gesehen – _fizzbuzz, mFizzBuzz oder auch nur fizzbuzz – Schlussendlich sollte man sich in einem Projekt oder in einem Team einfach an den abgemachten Standard halten.

    Closure in Javascript: Ich finde das Konstrukt einfach schön. Für den Beitrag habe ich mir diesbezüglich zu wenige Gedanken gemacht, sorry.

    Fazit: Wenn ich die Feedbacks anschaue und auch nochmals darüber nachdenke, ist der Beitrag zu wenig differenziert. Ich hätte mehr herausarbeiten müssen, dass die Syntax bei den OO Sprachen teilweise fast identisch ist. Im Detail unterscheiden sie sich dann aber teilweise gewaltig. Nichts desto trotz, kann man über “seine” Sprache viel lernen, wenn man andere Sprachen studiert -> und dies sollte die eigentliche Aussage des Beitrags sein.

  11. Typsicherheit hat schon seine Vorteile und auch seinen Sinn, anderseits ist sie oft einfach auch ein Unding, vor allem wenn man mit GUIs in Java arbeitet. So holt man aus einer TextBox immer einen String raus. Wenn man jetzt Typsicher arbeitet wandelt man den String zB in nen Integer um. Wenn man das ganze wieder in ne SQL Datenbank packen will, wandelt man es wieder in nen String um. Beim Auslesen passiert wieder das gleiche. Damit hat man viele unnötige TypeCasts.
    Auch vermisse ich in Java den einfachen assoziativ Array und den dynamischen Array, da muss man dann wieder Umwege über HashMaps und Listen gehen.
    Dafür hat die Methodenüberladung in PHP deutliche Schwächen. Jede Sprache hat seine Vorteile und auch eigene Stille und Patterns. Der Blick über den Tellerand und das Programmieren in anderen Sprachen verbessern am Ende jedoch im ganzen die Entwicklunsfähigkeiten. Manchmal kann man eben doch einen Ansatz aus einer Sprache in die andere Sprache übernehmen, weil er zum Beispiel viel pragmatischer ist.

  12. @Peter (“Wer heutzutage auf OOP verzichtet, der hat meiner Meinung nach, einfach keine Ahnung von Softwareentwicklung.”)

    Ein Blick über den Tellerrand könnte nicht schaden, glaubst du etwa, in eingebetteten Systemen würde OO Programmiert? Funktionale, prozedurale und logische Sprachen haben immer noch ihre Daseinsberechtigung, je nachdem was man erreichen will!

  13. Zunächst mal zum Code. Ich finde es interessant, dass du die “Platzhalter” jeweils mit einem Unterstrich deklariert hast. Ich habe dies in der Uni-Hamburg ebenfalls gelernt und finde es eigentlich schrecklich. Wozu gibt es denn “this.”? Dies wird in der PHP-Variante dann noch deutlicher. Mir ist klar, dass man das zur besseren Lesbarkeit eingeführt hat. Aber spätestens in PHP hat diese Art der Deklaration seinen Sinn verloren. Auch würde mich gerade interessieren ob ihr dort ebenfalls Begriffe wie “Platzhalter” gelernt habt oder ob ihr die üblichen englischen Begriffe lernt.

    Zur Diskussion zwischen Miasin und Peter. Ich finde die Aussage, dass diese Programmiersprachen sich sehr ähnlich sind durchaus richtig denn Prozentual gesehen sind sie es definitiv! Klar gibt es kleine Unterschiede aber insgesamt gibt es deutlich mehr Gemeinsamkeiten als Unterschiede. Weiterhin ja, es gibt in PHP keine Typsicherheit und ja es gibt keine Überladung. Aber! In PHP wird die Überladung auch nicht so sehr benötigt wie in Java, denn in Java müsste ich eine Methode überladen sobald ich nur einen anderen Typ übergebe. In PHP dagegen wird es diese Art von Problem nie geben. Klar kann man nun Interfaces und Vererbung anführen wodurch man das Problem ebenfalls lösen könnte. Aber letztendlich frag ich mich dann ob sich der ganze Mehraufwand lohnt? Ich meine wenn es wirklich mal so sein sollte, dass die Methode etwas anderes tun soll aufgrund der übergabe eines anderen Typens so kann ich das ohne weiteres auch in PHP realisieren und zwar wenn ich es denn möchte auch durch Überprüfung des Typens.

  14. Hi José

    Erste einmal danke für Deinen Feedback.

    Platzhalter: Ehrlich gesagt kenne ich den Begriff so gar nicht. Ich würde einer Variablen in einer Klasse entweder Objekteigenschaft, Membervariable oder Objektmember sagen.

    Der Underscore: Da ich momentan in einem Projekt den Codingstandard von PEAR verwende (dieser schreibt vor _ zu verwenden), habe ich mir das automatisch so angeeignet. Wie ich schon mal erwähnt habe, ist dies eine reine Code Convention. Jedes Team und jedes Projekt kann hier eine andere Convention definieren. Ich gebe zu, dass der _ ein bisschen merkwürdig aussieht. Es hat aber den Vorteil, dass man somit sofort eine Membervariable erkennen kann. Was aber momentan die Standardconventions in der PHP Welt sind, kann ich nicht sagen. Hat da evtl. jemand einen Tip?

  15. calculatedString = arr.join(‘,’);

    gehört außerhalb der Schleife. IMHO. Nur ein kleiner Hinweis zum Thema Performance 🙂

    > Jetzt nach zwei Jahren in denen ich mit PHP arbeite, kann ich nur sagen, dass PHP noch ein großer Stück schwächer ist als Java.
    Würde ich so nicht unterschreiben. Schwächer als „Javascript“ würde ich noch zustimmen, weil JS die mächtigeren Konzepte hat.
    > Schon wenn es um Typsicherheit geht, so ist es in großen Projekten(OOP) einfach ein Vorteil, denn man nicht einfach wegreden kann.
    Genau wie kurze Entwicklungszyklen, dynamische Speicherallokation u.ä. Vorteile sind. Klar vermisst man in PHP oft Typsicherheit, aber bspw. endlose Array-Vorinitialisierungen wie in anderen Sprachen vermisse ich überhaupt nicht. Zudem kann man in der OOP viel Typsicherheit gewinnen, wenn man eben auch Objekte als Parameter benutzt. Oft reicht das schon. Für Skalare finde ich Typsicherheit oft überbewertet.

  16. >>José Stiller: […] Ich habe dies in der Uni-Hamburg ebenfalls gelernt und finde es eigentlich schrecklich. Wozu gibt es denn “this.”? […]<<

    Bei uns wird z.B. gelehrt, "this" nur dann zu verwenden wenn es keinen Weg mehr darum herum gibt. Alles Andere wird durch "richtige" Benennungen und Definitionen umgangen, also mit z.B. 'm_'.
    Lass es mal auf den Versuch ankommen und probiers selber aus. Meiner Meinung nach ist das so wirklich besser lesbar und auch "logischer".

    Aber DaRaFF richtig angemerkt hat, es sind CodeConventions und auf die wird sich geeinigt.

    Die Grundaussage des Artikels gefällt mir sehr gut! 🙂

    lg lukas

  17. Sehr toller Artikel,
    ich denke ebenfalls das die Sprachen sich inzwischen soweit aneinander angenähert haben, dass Konzepte für einen guten Entwickler wichtiger sein sollten als Sprachunterschiede.
    Bei PHP fehlt mir Beispielsweise die C# Kurzschreibweise für Getter und Setter (wäre meines Erachtens auch für Java von Vorteil), bei Javascript fehlen definitiv richtige assoziative Arrays und eine native Foreach implementation, so hat halt jede Sprache ihre Vor- und Nachteile.
    Aber ein Entwickler sollte die Nachteile einer Sprache genauso kennen wie die Vorteile und das möglichst von mehreren, so dass er bei Bedarf Konzepte aus anderen Sprachen weiterverwenden kann.
    Das ganze rumgebashe, was denn nun die beste Sprache sei führt zu gar nichts

    Zu der “fehlenden” Typsicherheit von PHP, gerade die macht ein Konzept der Sprache aus.
    Wenn ich Daten aus einer Datenbank, einem Request oder einem Formular bekomme, dann habe ich immer einen String, den ich bei Bedarf eben casten kann in meinen erwarteten Datentyp (Beispielsweise mit (int) um einen Integer zu erhalten oder über die Funktion intval()).
    IMHO macht es bei einer Sprache die für das Web konzipiert ist keinen Sinn typensicher arbeiten zu müssen, eben weil alles erst einmal ein String ist.
    Bei PHP muss ich eben als Programmierer selber darauf achten das ich typensicher Programmiere, die Funktionen dafür bietet PHP (so kann zum Beispiel in der Methodendeklaration angeben welchen Typ die Argumente haben müssen).

    Soll halt jeder mit der Programmiersprache glücklich werden die ihm gefällt, nur dauernd zu lesen Java, C, ist die Beste, geht mir gelinde gesagt auf den Sack.
    Die meisten Sprachen haben durchaus ihre Daseinsberechtigung.
    Oder würde von euch jemand freiwillig in Erlang schreiben?
    Aber für top Performance, mit einer hohen Skalierbarkeit würde man es definitiv in Betracht ziehen.

    In diesem Sinne,
    happy coding 😉

Leave a Reply

Your email address will not be published. Required fields are marked *