uio--WebPageMain-Module
Das Jahr 2025 ist in vollem Gange. Für eine Zusammenfassung ist es deshalb mit Sicherheit noch etwas früh.
Artikel auf dieser Seite


2025

PHP vs JAVA: Overloading

In unserer Reihe „PHP vs. JAVA“ möchten wir in diesem Post auf das Thema Overloading und den bis heute noch immer vorherrschen Missstand eingehen, dass PHP dieses Feature noch immer nicht ermöglicht.

Als (engl.) Overloading bzw. (dt.) Überladen bezeichnet man in der Programmierung das Prinzip, dass der Entwickler in einer Klasse eine Methode des gleichen Namens mehrfach programmieren darf, wenn sich hierbei die auf typisierten Parametern basierende Signatur unterscheidet.


PHP Beispiel

Der nachfolgende Programmcode entspricht etwa PHP 8.3.



<?php

class Rechner {

  public function addieren(...$args) {
    if (count($args) === 2) {
      if (is_int($args[0]) && is_int($args[1])) {
        return $this->addiereInt($args[0], $args[1]);
      } elseif (is_float($args[0]) && is_float($args[1])) {
        return $this->addiereFloat($args[0], $args[1]);
      } else {
        throw new InvalidArgumentException('Ungültige Argumenttypen');
      }
    } else {
      throw new InvalidArgumentException('Falsche Anzahl an Argumenten');
    }
  }

  private function addiereInt(int $a, int $b): int {
    return $a + $b;
  }

  private function addiereFloat(float $a, float $b): float {
    return $a + $b;
  }
}

// Ausführungs des Programms
$rechner = new Rechner();
echo $rechner->addieren(1, 2); // Ausgabe: 3
echo $rechner->addieren(1.5, 2.5); // Ausgabe: 4.0
?>

Erläuterungen

Die Syntax wird den einen oder anderen PHP Entwickler möglicherweise fremdartig vorkommen. Wenn dem so ist: Das die optional typisierte Variante von ca. PHP 8.3 mit einer Typisierung von Methoden-Parametern und Methoden-Return-Types.

...$args

Da PHP nicht in der Lage ist, verschiedene Varianten von Signaturen über die Syntax zu ermöglichen, ist es erforderlich, dass die Methode alle übergebenen Parameter liest.

if (is_int($args[0]) ...

Um nun erkennen zu können, dass beide Parameter vom Typ int sind, ist es erforderlich, dass wir jeweils den entsprechenden Parameter aus $args[0] adressieren und diesem anschließend explizit einer Typenprüfung über is_int(..) unterziehen.

Das selbe Prinzip muss anschließend auch für andere Signaturen und damit Parameter-Kombinationen erfolgen.

return $this->addiereInt($args[0], $args[1]);

Für die eigentliche Berechnung rufen wir intern für jede Variante einer möglichen Signatur eine eigens programmierte Methode auf welcher wir den zugehörigen Typ als Suffix ergänzen.

Hinweis: Formal betrachtet wäre es korrekter, dieses Methoden dann addiereIntInt(int $a, int $b) zu bezeichnen, um eine direkte Beziehung zur gewünschten Signatur und dem Namen der internen private Methode erkennen zu können.

Offenes Problem

Die gute Nachricht vorab: Es ist auf diesem Wege tatsächlich möglich, auch in PHP Methoden überladen zu können.

Die schlechte Nachricht: Es ist technisch NICHT möglich, dass die addieren(...$args) Methode in PHP den korrekten ReturnType angibt. Die Methoden addierenInt(int $a, int $b):int sowie die float Variante ermöglicht das intern.

Im Falle von JAVA, C# oder C++ würde ein Zugriff auf addieren(int a, int b) oder addieren(double a, double b) den korrekten ReturnType liefern können.


JAVA Beispiel

Das Overloading-Prinzip in JAVA sah in Version 1 (1995) wie auch in Version 23 (2025) identisch aus:

Die Rechner Klasse: Rechner.java



public class Rechner {

  public int addieren(int a, int b) {
    return a + b;
  }

  public double addieren(double a, double b) {
    return a + b;
  }
  
  // Zur Ausführung des Programms.
  public static void main(String[] args) {
    Rechner rechner = new Rechner();
    System.out.println(rechner.addieren(1, 2)); // Ausgabe: 3
    System.out.println(rechner.addieren(1.5, 2.5)); // Ausgabe: 4.0
  }  
}

Erläuterungen

PHP gilt ja noch immer weithin als einfacher als JAVA, aber wenn man sich den Code mal anschaut löst JAVA das Overloading-Prinzip eleganter.

public int addieren(int a, int b)

In JAVA sowie auch C# und C++ ist es möglich, dass zwei Methoden einer Klasse den selben Namen tragen wenn zur Unterscheidung zweier Methoden die Signatur herangezogen werden kann.

Anstatt also addierenIntInt(..) Methode schaffen zu müssen ist es in JAVA ausreichend, dass die Parameterkombination int,int und double,double sich unterscheiden.

double oder float?

JAVA, C# sowie C++ differenzieren bei Fließkommazahlen bzw. Dezimalbrüchen mindestens zwei Varianten, darunter float und double.

System.out.println

Der Befehl System.out.println(..) ermöglicht eine Ausgabe auf der Konsole.

Dieser Ausdruck wirkt komplexer als ein echo oder print bei PHP.

Hierzu muss man allerdings wissen, dass ein PHP Programm sich nur deshalb keine Klasse System und einen Output-Stream in out suchen muss weil diese Funktionalität von einem HTTP Server wie Apache oder Nginx bereitgestellt wird der auch erst einmal installiert und administriert sein will.

main(String[] args)

Ein JAVA Programm kennt keinen globalen Code. Der Programmcode für das eigentliche Hauptprogramm, welches die Klasse verwendet, muss also zwingend in einer main-Methode einer Klasse programmiert werden.

public static void main(String[] args) { } in JAVA entspräche in PHP einer Funktion main(array args):void { }. Das allerdings mit der Problemstellung, dass man den Array in PHP nicht typisieren kann.


Zusammenfassung

JAVA

Der Programmcode von JAVA ist mehr oder weniger mit dem auch von C# oder C++ identisch. Overloading ist ein grundlegendes Prinzip.

PHP

Will man in PHP sicherstellen, dass eine IDE den korrekten ReturnType einer Methode erkennen kann, ist es auch in PHP 8.4 (2025) noch immer erforderlich, dass der Entwickler für jede Variante einer Signatur wie auch in Java eine eigenständige Methode schreiben sollte. Während diese aber in JAVA immer den selben Namen und nur andere Parametertypen hat, muss in PHP für das Type-Hinting jeweils ein neuer Methodenname gefunden werden.

Es ist denkbar, dass PHP mit einer neuen Version irgendwann auch Overloading in den Fällen unterstützt, in welchen Entwickler alle Parameter typisiert haben.

Unter der Annahme, dass jeder nicht typisierte Parameter wie auch ReturnType den Typ mixed bekäme, könnte man damit in Ergänzung zu obigem Beispiel noch sinngemäß die Methode addierenMixed(mixed $a, mixed $b) programmieren.

PHP bietet allerdings eine Alternative: Eine Funktion kann zumindest außer mixed als ReturnType auch einen Union-Type int|float sowohl für Parameter als auch für den Return-Wert ermöglichen.

Damit kann eine IDE zumindest schon mal erkennen lassen, welche Typen überhaupt als Rückgabewert zu erwarten sind.

Ausblick

Die Programmiersprache PHP wird seit Version 7.4 (2019) den Programmiersprachen JAVA, C# und C++ immer ähnlicher.

Die PHP-Community hat über die Jahrzehnte immer wieder darüber diskutiert, ob, wann und wie Overloading ermöglicht werden soll. Manche Aspekte wie beispielsweise die Einführung von PHP Attributes (bezeichnet man in Java und C# als Annotations) wurden über Jahre verworfen, schlussendlich aber mit PHP 7.x und 8.x dann doch implementiert.


Ähnliche Problemstellungen

Polymorphismus in JAVA und PHP.

Namespaces in JAVA und PHP.

Collection-Klassen in JAVA und PHP.

Typisierung von Arrays in JAVA und PHP.


SO IST'S BESSER.

Entdecke SNEWMEDIA. Es ist einfacher als Du denkst.

Stelle noch heute Deine Anfrage.

uio--WebPageFooter-Module