Steffen: Funktion und Standartwerte

Hallo,

ich musste leider eine Funktion umbauen. Es ist so gedacht, dass ich aus dem Script heraus 4 Parameter an diese Funktion übergebe.

Die wertet die Parameter aus und schickt einen Rückgabewert ins Script zurück.

Soweit ja normal.

Ich habe aber im Script noch unzählige Aufrufe dieser Funktion, die entweder ganz ohne Parameter sind oder nur 1 Parameter übergeben.

Um nicht alle Stellen in den Scripten zu suchen, möchte ich die Funktion so einstellen, dass sie weiß, dass bei Übergabe keines Parameters alle 4 Standartwerte gelten.

Das mache ich so:

  
function test_neu($param1='default1',$param2='default2',$param3='default3',$param4='default4')  
{  
...  
}  

Wie kann ich erreichen, dass bei Übergabe nur 1 Parameters die Funktion:

  1. Nicht über missing arguments meckert und
  2. weiß, dass sie die Default-Parameter 1-3 nutzt und der 1 mitgelieferte Parameter den Defaultparameter 4 ersetzen soll?

Viele Grüße, Steffen

  1. Hallo Steffen,

    function test_neu($param1='default1',$param2='default2',$param3='default3',$param4='default4'){}

    1. Nicht über missing arguments meckert und
    2. weiß, dass sie die Default-Parameter 1-3 nutzt und der 1 mitgelieferte Parameter den Defaultparameter 4 ersetzen soll?

    Du drehst die Parameterreihenfolge einfach zu Deinen Bedrüfnissen entsprechend um:

    function test_neu($param4='default4',$param1='default1',$param2='default2',$param3='default3'){}

    Gruß aus Berlin!
    eddi

    1. Du drehst die Parameterreihenfolge einfach zu Deinen Bedrüfnissen entsprechend um:

      function test_neu($param4='default4',$param1='default1',$param2='default2',$param3='default3'){}

      Hi Eddi,

      Dann würde die Funktion bei Vorhandensein eines mitgelieferten Parameter auf die restlichen 3 verzichten?

      Und auch falls ja, gibt es noch eine andere Lösung? Weil ich neben der alten Form (mit 1 Param) schon recht viele  nach dem neuen Muster eingebaut habe. Also wäre auch das herumdrehen inzwischen recht arbeitsintensiv...

      Steffen

      1. Re:

        Dann würde die Funktion bei Vorhandensein eines mitgelieferten Parameter auf die restlichen 3 verzichten?

        Sie verzichtet auch jetzt schon auf jedweden Parameter, da es default-Werte gibt. Die Funktion kann also auch ganz ohne Parameter aufgerufen werden. Wir ein Parameter übergeben, geschieht dies immer von links nach rechts.

        Und auch falls ja, gibt es noch eine andere Lösung? Weil ich neben der alten Form (mit 1 Param) schon recht viele  nach dem neuen Muster eingebaut habe. Also wäre auch das herumdrehen inzwischen recht arbeitsintensiv...

        Funktionen haben ihren eigenen Namensraum. Sie können aber auf den globalen Namensraum zugreifen. Dies ließe sich auch nutzen:

        <?php  
        $param3='kein default';  
          
        function test_neu(){  
           $param1=isset($GLOBALS['param1']) ? $GLOBALS['param1'] : 'default1';  
           $param2=isset($GLOBALS['param2']) ? $GLOBALS['param2'] : 'default2';  
           $param3=isset($GLOBALS['param3']) ? $GLOBALS['param3'] : 'default3';  
           $param4=isset($GLOBALS['param4']) ? $GLOBALS['param4'] : 'default4';  
          
        }  
        ?>
        

        Weiterhin ist auch denkbar immer nur einen Parameter zu übergeben, was auf Dein Problem sicher nicht anwendbar ist:

        function test_neu($param=array()){  
           $c=count($param);  
           for($i=0;$i<$c;$i++){  
              if($param[$i]!=''){  
                 // mach was mit $param[$i]  
              }  
           }  
        }  
        // Funktionsaufruf könnte dann etwa so aussehen:  
        test_neu(array(,,'bla',14));
        

        Gruß aus Berlin!
        eddi

        1. Hi!

          Funktionen haben ihren eigenen Namensraum. Sie können aber auf den globalen Namensraum zugreifen. Dies ließe sich auch nutzen:

          Unschön, weil die Funktion dann abhängig wird von diesen anderswo existierenden Werten. Man muss diese peinlichst kontrollieren vor jedem Funktionsaufruf, und falls die Aufrufe verschachtelt/rekursiv erfolgen, hört irgendwann die Übersichtlichkeit auf.

          Weiterhin ist auch denkbar immer nur einen Parameter zu übergeben, was auf Dein Problem sicher nicht anwendbar ist:

          Es gibt auch noch die Möglichkeit in der Funktionssignatur gar keine Parameter zu deklarieren, und die übergebenen Parameter zur Laufzeit auszuwerten: func_get_args() und die bei "See Also" velinkten.

          Lo!

  2. function test_neu($param1='default1',$param2='default2',$param3='default3',$param4='default4')
    {
    ...
    }

      
    Nimm dir ein Beispiel an die in PHP implementierten Funktionen ... da sind die ersten Paramter Pflicht und die folgenden Kür.  
      
    Ansonsten zwei Möglichkeiten:  
      
    - verabschiede dich von vier einzelparametern und übergib ein Array  
      
    - Übergib für die ersten Parameter ein FALSE wenn du keinen vernünftigen Wert hast und mach entspr. Abfragen am Anfang der Funktion. Also  
    (! $param1 ? $param1 = 123 : "");  
      
    Und Tschüss