PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PHP: optionaler Referenz-Parameter?


Sephiroth
2007-03-05, 21:06:28
Seit Version 5 von PHP kann man erfreulicherweise auch Referenz-Parameter einer Funktion optional machen.

function Funktionsname($param1, &$param2 = null)
{
}

Auf diese Art in PHP4? No way! Kann man das nicht vielleicht irgendwie, hm, sagen wir "reinbasteln"? Gibt es die Möglichkeit Funktionen wie in Java zu überladen?

mithrandir
2007-03-06, 14:38:59
Einfach zwei Funktions"varianten" machen, sollte funzen.

function Funktionsname( $param1 )
{
Funktionsname( $param1, null );
}
function Funktionsname( $param1, $param2)
{
if ( $param2 == null )
{
}
else
{
}
}

Ist allerdings nicht schön

Sephiroth
2007-03-06, 15:03:26
Das wäre ja das Prinzip es Überladens aus Java ... und das geht nicht, wie ich eben feststellte.
Fatal error: Cannot redeclare Funktionsname() (previously declared in ....

mithrandir
2007-03-06, 21:27:36
Dere!

Mist, ich dachte, dass ich so etwas schonmal gemacht hätte. Hast du z.B. einen Eintrag "User-Space Object Overloading Support" in deiner phpinfo?

Was spricht übrigens dagegen, die Funktion mit z.B. vier Parametern zu deklarieren, beim Aufruf aber nicht immer alle anzugeben? Das habe ich auf jeden Fall schon gemacht. Die nicht versorgten Parameter haben dann den Wert null...

bye, Peter

Sephiroth
2007-03-07, 01:05:39
Genau das habe ich doch vor! Allerdings mit dem kleinen aber feinen Unterschied, dass einer dieser Parameter eine Referenz sein soll.

Das hier ist keine Problem
function foo($param1, $param2 = 'bla')
{
}
foo('blubb');
foo('blubb', 'blubber');


Das hier würde nicht gehen
function foo($param1, $param2)
{
}
foo('blubb'); // fehler: missing arg (oder so ähnlich)



Ich denke es bleibt nur Möglichkeit mit variabler Anzahl von Parametern.
Variable Anzahl von Parametern

PHP 4 unterstützt eine variable Anzahl von Parametern in benutzerdefinierten Funktionen. Das Handling dieser Parameter fällt mittels der Funktionen func_num_args(), func_get_arg() und func_get_args() sehr leicht.

Es ist keine spezielle Syntax erforderlich. Die Parameter können wie gehabt explizit in den Funktionsdeklarationen angegeben werden, und werden sich wie gewohnt verhalten.

Falls jemand sonst noch eine Methode einfällt, immer her damit. ;)

p.s.
shit, php >= 4.2.0 X-( ... ich muß wohl doch nochmal ein ernstes wort mit meinem kollegen reden .... :rolleyes:

mithrandir
2007-03-08, 08:14:20
Dere!

Das interessiert mich jetzt selbst, wie du es denn nun gelöst hast. Ich tippe mal auf so etwas Ähnliches:

<?php
class foo
{
function bar()
{
$numArgs = func_num_args();

echo "\n<br>\n<br>Anzahl von Argumenten ist >$numArgs<";
for ( $i = 0; $i < $numArgs; $i++ )
{
echo "\n<br>Argument $i ist >" . func_get_arg( $i ) . "<";
}

switch( $numArgs )
{
case 0:
{
// Keine Argumente
break;
}
case 1:
{
// Ein Argument
break;
}
case 2:
{
// Zwei Argumente
break;
}
default:
{
// Unbekannte Anzahl von Argumenten
}
}
}
}
?>
<html>
<head>
<title>Test</title>
</head>
<body>
<p align="left>
<?php
$test = new foo();
$test->bar();
$test->bar( 2 );
$test->bar( "Hello world", 12 );
$test->bar( "Hello world", 12, "hm..." );
?>
</p>
</body>
</html>

Ausgabe:


Anzahl von Argumenten ist >0<

Anzahl von Argumenten ist >1<
Argument 0 ist >2<

Anzahl von Argumenten ist >2<
Argument 0 ist >Hello world<
Argument 1 ist >12<

Anzahl von Argumenten ist >3<
Argument 0 ist >Hello world<
Argument 1 ist >12<
Argument 2 ist >hm...<

Oder doch anders?

bye, Peter

Sephiroth
2007-03-08, 16:00:23
So hab ich es vor, ja. Doch zuvor muß ersteinmal PHP auf unserem bisher wenig benutzten Server aktualisiert werden, dort läuft noch 4.1.xx X-(