2010-10-13 8 views
2

j'ai une fonction qui prend quatre arguments optionnels:problème avec des arguments optionnels en PHP

public function doSomething($x = null, $y = null, $a = null, $b = null) { } 

Cependant quand je tente d'appeler cette fonction et ne spécifier que $ y, par exemple:

$object->doSomething($y=3) 

Il semble ignorer que je mets $ y comme 3, et place à la place $ x pour être 3. Y at-il une raison pour que cela puisse arriver avec PHP? Je ne ai jamais l'habitude d'avoir ce problème avant ...

Merci,

Dan

Répondre

6

Vous devez passer des arguments dans l'ordre que vous déclarez dans votre signature de la méthode, si elles sont en option ou non. Cela signifie que vous devez spécifier $x avant $y, quoi qu'il arrive.

Si vous n'avez pas besoin de passer une autre valeur de $x, vous devrez passer null. Vous pouvez sauter encore les arguments optionnels restants, bien sûr:

$object->doSomething(NULL, 3) 

De plus, PHP ne supporte pas les arguments nommés. Par conséquent, vous ne pouvez pas écrire explicitement $y dans le code appelant car en PHP, il définit $y dans la portée du code appelant, et non la portée du corps de la méthode doSomething().

EDIT: par la suggestion de DPK, comme une route alternative, vous pouvez changer la méthode d'accepter un hachage (tableau associatif) à la place, et éventuellement remplacer certains paramètres par défaut et extract() les valeurs de celui-ci dans la portée:

public function doSomething(array $args = array()) { 
    $defaults = array('x' => NULL, 'y' => NULL, 'a' => NULL, 'b' => NULL); 
    extract(array_merge($defaults, $args)); 

    // Use $x et al as normal... 
} 

Dans votre code d'appel:

$object->doSomething(array('y' => 3)); 
+1

Droite. La façon de faire cela comme l'OP s'attend à passer un seul hash comme argument (array ('y' => 3)) ou une structure de données similaire (object ..) –

+0

Merci pour cela - pour une raison quelconque j'étais sous l'hypothèse que vous pourriez faire ce que je faisais. Doit avoir été une autre langue rampante! – Dan

1

Même si $ x est facultative, la position est pas $ y doit être le second paramètre. Essayez:

$object->doSomething(null,3); 
Questions connexes