2010-10-02 9 views
2

Je travaille actuellement sur une classe simple pour me concentrer sur la POO et j'ai besoin d'aide pour une fonction. La fonction reçoit divers paramètres, certains sont facultatifs:Passer plusieurs paramètres à une méthode en PHP

public function Test($req, $alsoreq, $notreq = null, $notreq2 = null, $notreq3 = null) 
{ 
    ... 
} 

Comment appeler la fonction, passer les deux premiers paramètres et le dernier?

Par exemple:

Test('req', 'alsoreq', 'notreq3'); 

Ignorant la notreq2 et notreq?

J'ai essayé

Test('req', 'alsoreq', '', '', 'notreq3'); 

mais cela semble laid et hackish.

+2

Réfléchissez bien si vous voulez réellement tous ces paramètres. Certains d'entre eux peuvent être meilleurs en tant que variables membres, que vous pourriez définir dans le constructeur ou avec des méthodes setter. – Skilldrick

+0

Je construis une requête MySQL "interface". Cela me permettra de faire des sélections plus facilement. Par exemple: query ('table', '*', '', '', '0,10'); E: query ($ table, $ from, $ où, $ orderby, $ limite) – Vinny

+0

Quelques questions connexes: [Passer les paramètres nommés à une fonction php via call_user_func_array] (http://stackoverflow.com/q/6610556/ 367456); [Paramètres facultatifs PHP - spécifiez la valeur du paramètre par son nom?] (Http://stackoverflow.com/q/4029404/367456); [Argument de la fonction PHP vers un tableau] (http://stackoverflow.com/q/7603517/367456) – hakre

Répondre

8

Vous ne pouvez pas. Pensez-y, si vous pouviez le faire, comment PHP serait-il capable de dire si le troisième argument est supposé être le $notreq, $notreq2 ou $notreq3? Une façon moins hackish serait:

Test($req, $alsoreq, NULL, NULL, $notreq3); 

Comme vous faites clairement que les deux premiers sont en option args NULL. Choisissez les ordres d'arguments judicieusement, de sorte que ceux qui sont utilisés le plus souvent viennent en premier.
Vous pouvez également utiliser un tableau:

public function Test($req, $alsoreq, array $notreq) { ... } 

// no optional args 
Test($req, $alsoreq); 

$optional = array('arg1' => 'something', 'arg2' => 'something else'); 
Test($req, $alsoreq, $optional); 

$optional = array('arg3' => 'hello'); 
Test($req, $alsoreq, $optional); 
+0

J'allais soumettre ma réponse, mais j'ai rafraîchi la page juste pour vérifier si vous avez édité la vôtre. Hélas, vous avez;) +1 – BoltClock

+0

Si vous faites cela, vous pourriez aussi bien avoir un seul paramètre, un tableau. –

+0

Je vois ... merci pour le pourboire. Malheureusement, je suppose que je m'en tiendrai à ce que je faisais, car il est beaucoup plus simple de traiter à l'intérieur de la classe. – Vinny

1

Il semble y avoir aucun moyen. Comme écrit dans php manual:

Notez que lors de l'utilisation des arguments par défaut , tout défaut devrait être sur le côté droit de toute non par défaut des arguments; sinon, les choses ne fonctionneront pas comme prévu.

Vous essayez de mettre une valeur non-par défaut (notreq3) sur la droite de défaut (notreq2, notreq1). La manière laide et hackish est susceptible d'être plus correcte.

Cordialement, Serge

+0

Merci l'homme. Savez-vous si c'est contre les meilleures pratiques de PHP? – Vinny

0
  1. Écrivez une fonction appelée aboutMe. Il faut deux paramètres $name et $age.
  2. Il devrait echo out "Hello! My name is $name, and I am $age years old.".
  3. Appelez votre fonction et consultez le panneau de résultats pour voir si cela fonctionne!

Conseil

"Hello! My name is " . $name . " and I am " . $age . " years old." 
Questions connexes