Frage zum Grübeln: überspringen eines Parameters

:eek:
UPS, ganz vergessen dasses sowas auch noch gibt :rolleyes:

Aber der gute HolyFly hats zum Glueck wieder auf die richtige Bahn gebracht :)

Warum geht eigentlich die Ukraine Section auf deiner Homepage nich Holy...
 
Original geschrieben von Kimble
:eek:
UPS, ganz vergessen dasses sowas auch noch gibt :rolleyes:

Aber der gute HolyFly hats zum Glueck wieder auf die richtige Bahn gebracht :)

Warum geht eigentlich die Ukraine Section auf deiner Homepage nich Holy...

öhm weil ich nie zeit habe überhaupt irgendetwas auf meiner hp zu machen. ;)
 
@HolyFly:
Und wenn man jetzt nur den ersten Parameter übergeben will?

Meine Methode:
PHP:
<?
function xyz($param1="abc", $param2="xyz")
{
	// check incoming params
	$param1 = (is_int($param1) && !$param1) ? "abc" : $param1;
	$param2 = (is_int($param2) && !$param2) ? "xyz" : $param2;

	// output params
	echo $param1.$param2;
}

//aufruf mittels
xyz(0,"uvw"); // abcuvw
xyz("0","uvw"); // 0uvw
xyz("def"); // defxyz
xyz("def",0); // defxyz
?>
Dann darf man sogar "0" übergeben ohne dass der Standardwert benutzt wird.
 
Nun das problem ist mann kann überladen
anhand der Parameter zahl.

Bei stark typisierenden Sprachen könnte mann auch anhand dem Parametertyp überladen

sprich

public void doIt(int a);

public void doIt(String b);

Aber du hast recht, wenn ich die methode mit 2 int so überladen will das ich für beide Standard werte setzen kann dann habe ich ein problem.

Aber:
Ich bin selber noch nie in die Situation gekommen das sowas nötig ist.
Also ich denke das mann sein Design mal überdenken sollte wenn mann in die Situation kommt.

Ein workaround der bei C++ bzw Java usw funktionierend würde ist den wert zu Kapseln:

sagen wir 2 int werte:
Code:
public void doIt(int a, int b);

public void doIt(int a) 
               doIt(a,1);

public void doIt(Integer b) {
      doIt(1,b.intValue());
}

public void doIt() 
      doIt(1,1);

Das geht leider bei PHP nicht, was meine These der "beschnittenen" Sprache nur unterstützt :-)

reima versteh mich bitte nicht falsch. Ich wollte nicht sagen das deine Methode falsch ist.
Aber sie ist auch nicht intuitiv.
Meine mit der Integer box leider auch nicht.
Das heisst mann sollte konstrukte wie diese vermeiden.
Sprich schauen ob mann intuitativeren Workaround nutzen kann.
Ich war z.b noch nie auf 2 Standardparmeter angewiesen, und mann sollte sein Design erstmal überdenken und dies nur nutzen wenn die alternativen wirklich ebenso intuitiv sind
 
mal abgesehen von dem vorherigen ->

PHP:
function xyz ($param1, $paramN, $optional = "key-value|key|key-value" ) {
//check paramN;
//explode_me($optional);
//check result aus explode_me
}


// diese funktion splittet nen string in folgendem format -> "key1-
//value1|key2-value2|keyN-valueN" in seine bestandteile und 
//registriert die variablen(key) mit deren werten(value) als global;
//was das hier soll? ...
function register_explode_2($explo_string, $cut_var = "|", $cut_key_value = "-") {

    /* PART 1 -> TRENNUNG -> $cut_var */
    $array_1 = explode($cut_var, $explo_string);
    $num_array_1 = count($array_1);

    /* PART 2 -> TRENNUNG -> $cut_key_value */
    for ($i=0;$i<$num_array_1;$i++){
        $array_name = "array_2_$i";
        $$array_name = explode($cut_key_value, $array_1[$i]);
        $array_out = $$array_name;
        global $$array_out[0];
        $$array_out[0] = $array_out[1];
    }

// wahrlich kein meisterstück, code könnte durchaus eleganter und 
//vorallem schneller geschrieben werden -> foreach()

}

register_explode_2() soll im prinzip nur als beispiel dienen wie man mit optionalen werten verfahren kann, man könnte die werte auch als array übergeben oder sich was smarteres überlegen.

interessant wären bei den optionalen params auch noch sollche die keinen value wert bedingen, aber dennoch eine funktion erfüllen, zB wie bold unter html, also wenn bold param gesetzt bold = true.
 
Zuletzt bearbeitet:
hab da noch was:

PHP:
function check($parm, $standard){
 if(!isset($parm)) $parm = $standard;
 return $parm;
}

function xyz($parm1 = NULL, $parm2 = NULL, $parm3 = NULL){
 $parm1 = check($parm1,"abc");
 $parm2 = check($parm2,"def");
 $parm3 = check($parm3,"xyz");
 echo $parm1.$parm2.$parm3;
}

xyz(NULL,NULL,"ghi");

output: abcdefghi

mag zwar umständlich zu sein, aber auch ne variante, und man hat keine überladung, da ab 3 Parametern die funktionsliste unübersichtlich wird.
 
Original geschrieben von

mag zwar umständlich zu sein, aber auch ne variante, und man hat keine überladung, da ab 3 Parametern die funktionsliste unübersichtlich wird.

Sorry, aber das ist Quark.
Überladung ist alles andere als unübersichtlich, sondern die gängige Art und weise.
Ich kenne Klassen die haben bestimmte Methoden (bzw Operatoren) 10 - 20 mal überladen.
 
hat man dann nicht aber auch 10 - 20 funktionen?! vielleicht müsste ich mich mit dem thema überladen mal mehr beschäftigen, is aber nen anderes thema....
 
Original geschrieben von methodus
hat man dann nicht aber auch 10 - 20 funktionen?! vielleicht müsste ich mich mit dem thema überladen mal mehr beschäftigen, is aber nen anderes thema....

nein keine einzige Funktion hatte die Klasse nur Methoden ;)
Davon aber jede menge
 
Wir sollten ne eMail an die PHP-leute schreiben, php5 braucht neben vollständiger OOP-Unterstützung, Operatorenüberladung ... Sonst noch was wichtiges ?
 
Zurück