dedlfix: Parameter übergeben

Beitrag lesen

echo $begrüßung;

Wie sieht das denn mit der "Eigensicherheit" von Funktionen und Prozeduren aus?
Sollte man die immer herstellen, oder sollte man sich darauf verlassen, dass die passenden Argumente immer übergeben werden?

Ich seh das aus praktischer Sicht: Kommt darauf an. Wenn die Auswirkungen im Fehlerfall trivial sind, ist es vielleicht zu viel des Guten, da eine umfangreiche Überprüfung stattfinden zu lassen. Wenn keine Sicherheitslücke in der Funktion ist, und der Anwender sie trotz der Hinweise in der Dokumentation mit falschen Argumenten füttert ist das sein Problem.

Mein klassisches Beispiel ist dabei foreach()

Wenn kein Array übergeben wird, gibt es einen Fehler.
Hätte man da nicht auch einfach "nichts" machen können?

Nichts anders passiert doch, wenn man es selber "nachbessert"

if (is_array($_liste))
{
  foreach($_liste as $lfd_nr => $zeile)
  {
    ## tu 'was
  }
}

PHP bietet seit Version 5 Type Hinting an. Vorwiegend für OOP erfunden, da es ursprünglich nur Klassen annahm, kam mit Version 5.1 auch noch array hinzu

function foo(array $bar) {
  foreach ($bar as ...)
    ...
}

Dein Selber-Nachbessern wird wohl in vielen Fällen auch mit einem else-Zweig ausgestattet sein. Ein stillschweigendes Ignorieren eines fehlerhaften Arguments bei foreach hielte ich für keine gute Idee.

Weitere Möglichkeiten, die man aber je nach Anwendungsfall bewerten muss:

/**
 * Beispiel 1
 *
 * @param array/string $argument  Array mit Werten oder Werte als komma-separierter String
 */
function foo($argument) {
  if (is_scalar($argument))
    $argument = explode(',', $argument)

foreach ($argument as ...)
    ...
}

/**
 * Beispiel 2
 *
 * @param mixed $argument  mehrere Werte als Array oder ein Einzelwert
 */
function foo($argument) {
  $argument = (array)$argument;

foreach ($argument as ...)
    ...
}

Beispiel 2 zeigt einen expliziten Typecast. Kommt ein Array, bleibt es ein Array. Kommt ein skalarer Wert, wird daraus ein Array mit ihm als einziger Wert. (Kommt ein Objekt ... den Fall lass ich mal unbeachtet).

echo "$verabschiedung $name";