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.