de.comp.lang.php.* FAQ

10.6. Was sind polymorphe Funktionen? Kann ich sie simulieren?

Antwort von Kristian Köhntopp

Unter Polymorphie versteht man das Verhalten von objektorientierten Sprachen, die Signatur einer Funktion als Bestandteil des Funktionsnamens bei einem Aufruf zu betrachten. Die Signatur einer Funktion sind der Returntyp und die Parametertypen einer Funktion. In einer Sprache mit Polymorphie würde Code wie der folgende funktionieren:

# Funktion f mit Integer-Resultat und Integer-Parametern
function int f(int $a, int $b) {
  return $a*$b;
}

# Funktion f mit Array-Resultat und Array-Parametern
function array f(array $a, array $b) {
  $r = array();
  $l = count($a);
  for ($i=0; $i<$l; $i++)
    $r[] = $a[$i] * $b[$i];
  return $r;
}

# Definition von Integer-Parametern
$xi = 3;
$yi = 4;

# Aufruf der Integer-Funktion f.
$zi = f($xi, $yi);

# Definition von Array-Parametern
$xa = array(2, 3, 4);
$ya = array(4, 3, 2);

# Aufruf der Array-Funktion f.
$za = f($xa, $ya);

Dieser Code definiert zwei verschiedene Funktionen, die intern als int_f_int_int() und array_f_array_array() bezeichnet werden können, die im Code aber beide ununterscheidbar f() heißen. Er ruft dann die Funktion f() einmal mit Integer-Parametern und Array-Paramerern auf. Die Sprache ist aufgrund der Polymorphie in der Lage, diese beiden f() zu unterscheiden und korrekt die Funktion int_f_int_int() oder array_f_array_array() aufzurufen.

PHP unterstützt keine Polymorphie und kann dies schon deswegen nicht tun, weil die Return- und Parametertypen einer Funktion nicht deklariert werden müssen. Stattdessen muss man manuell mit den Typfunktionen wie folgt codieren:

function f($a, $b) {
  # Wandle $a in ein Array um, wenn es das nicht ist.
  if (!is_array($a))
    $a = array($a);

  # Ebenso $b.
  if (!is_array($b))
    $b = array($b);

  # Normaler Code.
  $r = array();
  $l = count($a);
  for ($i=0; $i<$l; $i++)
    $r[] = $a[$i] * $b[$i];

  if (count($r) == 1)
    # Skalar zurückgeben
    return $r[0];
  else
    # Array zurückgeben
    return $r;
}

Valid HTML 4.01! Valid CSS!

10.6. Was sind polymorphe Funktionen? Kann ich sie simulieren?
http://www.php-faq.de/q/q-klassen-polymorphie.html
Archiv der de.comp.lang.php-FAQ Dies ist eine Archivseite von 2008 und wurde seitdem nicht geändert. Das dclp-FAQ-Team