User Tools

Site Tools


php:kompost:funktionsaufrufmitbenanntenparams

[PHP] Funktionsaufruf mit variablen benamsten Parametern

Vorwort: Nun, ich selber brauch das auch nicht, ist jedoch eine nette Gehirnakrobatik *g*

Wer kennt das nicht. Man hat eine Funktion mit vielen Uebergabeparametern. Einige davon sind optional, einige müssen sein etc. Wenn man später den Funktionsaufrufenden Code liest, sieht man nicht mehr genau, welche Position welchen Parameter übergibt. Man muss Parameters abzählen. In einigen Anderen Programmiersprachen kann man die Parameter in beliebiger Reihenfolge, dafür benammst weitergeben. Bsp:

a=myfunction(id:=1, titel:='Test') 
b=myfunction(titel:='noch ein Test', id:=2) 

Dies erleichter die lesbarkeit des Codes ungemein. Leider bietet PHP diese Variante nicht an, also muss man Alternativen schaffen. Die eine währe, die Funktionen so aufzubauen, dass alle Parameters via eines indezierten Arrays übergebne werden und die Funktion diesen auswertet.

function myfunction($params) {
	 return "{$params['id']}: {$params['titel']}";
}
$mparams=array('titel'=>'Test', 'id'=>1);
echo myfunction($mparams);
echo myfunction(array('id'=>2, 'titel'=>'noch ein Test'));

dies funkioniert natürlich einwandfrei.

Will man jetzt in der Funktion nicht alles über den Array ansteuern, sondern einfache Variabeln benutzen, kann man Anfangs der Funktion noch diesen Code anhängen, der die Inhalte des Arrays in Variablen verwendet:

function myfunction($params) {     @extract($params,EXTR_OVERWRITE);
	 return "{$id}: {$titel} ";
  }

Doch was macht man, wenn man eine Funktion schon an diversen Orten defineirt hat? Oder wenn an für die einen Parameters einen Defaultvalue habe will? Kein Problem. Mann kann das alles kombinieren

function myfunction($title='default', $id=999) {
	 if (is_array($params=func_get_arg (0))) extract($params,EXTR_OVERWRITE);
	 return "{$id}: {$titel} ";
  }
  echo myfunction('Test');
  echo myfunction(1, 'Test_verkehrt');
  echo myfunction(array('id'=>2, 'titel'=>'noch ein Test'));
  echo myfunction(array('id'=>3));
 Ausgabe: 
999: Test 
Test_verkehrt: 1 
2: noch ein Test 
3: default 

Ein weiterer Vorteil dieser Kombination ist, dass man der Funktion ansieht, was sie als In_Parameter alles erwartet. mit dem EXTR_OVERWRITE werden die Variablen überschrieben, die durch den Array hineinkommen. die anderen übernehmen den Defaultvalue des Functionheaders

Also, es reicht einfach diese Zeile am Anfang der Funktion hinzukopieren (auch bestehende sind dann sofort kompatiebel.

if (is_array($params=func_get_arg (0))) extract($params,EXTR_OVERWRITE);

Wenn keine Argumente übergeben werden, motzt die Funktion func_get_arg(0). Deshalb fragen wir zuerst mal nach, ob überhaubt Argumente da sind.

if (func_num_args()) if (is_array($params=func_get_arg (0))) extract($params,EXTR_OVERWRITE);

Kategorien: CatPhp | CatTutorial

php/kompost/funktionsaufrufmitbenanntenparams.txt · Last modified: 11.12.2013 11:08:02 (external edit)