J'essaye actuellement de simplifier l'appel de méthodes/classes/fonctions au niveau du passage d'arguments.
Lorsque l'on commence comme ceci:
function foo ($arg1, $arg2, $arg3=null)
Et que l'on souhaite modifier le prototype de la fonction, il faut bien souvent retrouver tout les appels à la fonction afin de les modifier.Du coup je souhaiterais passer mes arguments en tableau associatif, tout en gardant la notion de paramètres obligatoires et de valeurs par défauts.
Pour l'instant mon code donne ceci:
<?php
class a extends parameters {
public function __construct($args = array()){
// test sur les paramètres obligatoires à l'instanciation d'un classes
// existance + typage, etc...
if(!isset($args['mandatory_param1'])){
throw new Exception('You have to give "mandatory_param1"');
}
elseif(!isset($args['mandatory_param2']) || !is_numeric($args['mandatory_param2']) || $args['mandatory_param2'] < 1){
throw new Exception('You have to give "mandatory_param2" (a number greater than 0)');
}
// si les prérequis sont remplis
else {
// on initialize les paramètres
$this->initializeParameters(
array( 'a'=>'default_value_a', 'b'=>'default_value_b', 'c'=>null ),
$args
);
}
}
public function basic_function($args = array()){
// test sur les paramètres obligatoires pour une méthode donnée
// existance + typage, etc...
if(!isset($args['mandatory_param1'])){
throw new Exception('You have to give "mandatory_param1"');
}
elseif(!isset($args['mandatory_param2']) || !is_numeric($args['mandatory_param2']) || $args['mandatory_param2'] < 1){
throw new Exception('You have to give "mandatory_param2" (a number greater than 0)');
}
// si les prérequis sont remplis
else {
// on initialize les paramètres
$params = new parameters(
array( 'a'=>'default_value_a', 'b'=>'default_value_b', 'c'=>null ),
$args
);
}
var_dump($params->getParameters());
}
}
function basic_function($args = array()){
// test sur les paramètres obligatoires pour une fonciton lambda
// existance + typage, etc...
if(!isset($args['mandatory_param1'])){
throw new Exception('You have to give "mandatory_param1"');
}
elseif(!isset($args['mandatory_param2']) || !is_numeric($args['mandatory_param2']) || $args['mandatory_param2'] < 1){
throw new Exception('You have to give "mandatory_param2" (a number greater than 0)');
}
// si les prérequis sont remplis
else {
// on initialize les paramètres
$params = new parameters(
array( 'a'=>'default_value_a', 'b'=>'default_value_b', 'c'=>null ),
$args
);
}
var_dump($params->getParameters());
}
class parameters {
// contiendra les paramètres
private $_parameters = array();
public function __construct($default,$params = array()){
$this->initializeParameters($default,$params);
}
// initialize les paramètres en "mergeant" les paramètres par défaut
// et ceux spécifiés par l'utilisateur
public function initializeParameters($default,$params = array()){
$this->setParameters(array_merge($default,$params));
}
// défini un paramètre
public function setParameter($key,$value){
$this->_parameters[$key]=$value;
}
// défini plusieurs paramètres
public function setParameters($params){
foreach($params as $key => $value){
$this->setParameter($key,$value);
}
}
// retourne la valeur d'un paramètre
public function getParameter($key){
return $this->_parameters[$key];
}
// retourne la valeur d'un paramètre
public function getParameters($a_keys = null){
if(is_array($a_keys)){
return array_intersect_key($a_keys, $this->_parameters);
}
else {
return $this->_parameters;
}
}
}
// utilisation sur un constructeur
$a = new a(
array(
'mandatory_param1'=>0,
'mandatory_param2'=>2,
'c'=>'overwrited!'
)
);
var_dump( $a->getParameters() );
// utilisation au sein d'un classe sur une méthode précise
$a->basic_function(
array(
'mandatory_param1'=>456,
'mandatory_param2'=>666,
'c'=>'overwrited 2!',
'z'=>'new 1'
)
);
// utilisation sur une fonction basique
basic_function(
array(
'mandatory_param1'=>45,
'mandatory_param2'=>78,
'c'=>'overwrited 3!',
'z'=>'new 2'
)
);
Le résultat est celui attendu:Code : Tout sélectionner
array
'a' => string 'default_value_a' (length=15)
'b' => string 'default_value_b' (length=15)
'c' => string 'overwrited!' (length=11)
'mandatory_param1' => int 0
'mandatory_param2' => int 2
array
'a' => string 'default_value_a' (length=15)
'b' => string 'default_value_b' (length=15)
'c' => string 'overwrited 2!' (length=13)
'mandatory_param1' => int 456
'mandatory_param2' => int 666
'z' => string 'new 1' (length=5)
array
'a' => string 'default_value_a' (length=15)
'b' => string 'default_value_b' (length=15)
'c' => string 'overwrited 3!' (length=13)
'mandatory_param1' => int 45
'mandatory_param2' => int 78
'z' => string 'new 2' (length=5)Merci d'avance pour vos conseils sur la manière de faire!
Bonne soirée!