2010-02-02 6 views
4

Je suis nouveau dans les classes php, les tableaux, etc, donc SVP excusez-moi si je n'utilise pas la bonne terminologie. Ce que je cherche, c'est comment assigner facilement des valeurs aux propriétés d'une classe sans avoir à dépendre des instructions "if".PHP comment affecter des variables de propriété de classe conditionnellement

Par exemple:

Supposons que j'ai une instance d'un test de classe, et « test » a une propriété « employé » (espérons que cela est la bonne façon de l'appeler) et l'employé est d'un type complexe.

Donc, j'ai quelque chose comme:

$test -> employee = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc) 

Le problème que j'ai ici, si « l'âge », « sexe », « nationalité », etc. ne sont pas toujours présents et je veux seulement assigner Valeurs à quand ils ont quelque chose affecté, et je ne veux pas utiliser If pour chaque combinaison de valeurs non vides ... (ceci est un exemple court, mais j'ai beaucoup de ces attributs ou peu importe comment ils sont appelés et trop de combinaisons "si" est trop salissant) ...

J'envoie ces valeurs plus tard comme demande de savon et je ne veux pas d'em Pty xml tags ...

Mes excuses si ma terminologie n'est pas correcte, mais j'espère avoir été assez clair pour quelqu'un là-bas pour m'aider!

Merci à l'avance, Pablo

+1

Bienvenue dans Stack Overflow, @Pablo! – Sampson

Répondre

1

Que diriez-vous ceci:

$array = array('Age' => '30' , 'Sex' => $sex, 'nationality' => $nationality, 'maritalstatus' => $status); 
foreach ($array as $key => $value) { 
    if (is_null($value) || $value=="") { 
     unset($array[$key]); 
    } 
} 
$test->employee = $array; 
3

Qu'est-ce que vous pourriez faire dans ce cas:

  • Marque employé un attribut privé
  • Définir un " setter "méthode setEmployee qui nécessite que tous les arguments soient fournis.

Voici un exemple de code; essayez ceci:

<?php 

    class test{ 

     private $employee; 

     public function setEmployee($age,$sex,$nationality,$maritalstatus){ 
      $this->employee=array('Age'=>$age, 
          'Sex'=>$sex, 
          'Nationality'=>$nationality, 
          'MaritalStatus'=>$maritalstatus); 
     } 

     public function getEmployee(){ 
      return $this->employee; 
     } 
    } 


    $t=new test(); 
    $t->setEmployee('32','M','American','Married'); 

    print_r($t->getEmployee()); 
    ?> 
+1

Je suis d'accord avec cette méthode si l'exigence de chaque champ est ce qu'ils veulent. J'avais l'impression qu'ils voulaient simplement passer des valeurs nulles et dans ce cas, j'ai posté mon approche équivalente. C'est bon de voir ces solutions OOP. – erisco

+0

Salut Erisco, Pablo ici, vous avez raison, je veux juste attribuer des valeurs qui ont été "sélectionnées" dans un menu du navigateur par un utilisateur. Ces valeurs assignées sont envoyées plus tard en tant que demande de savon, donc je dois m'assurer que les valeurs non définies ne sont pas transformées en tags xml vides. Il y a beaucoup de combinaisons de valeurs dans le menu du navigateur, donc c'est la raison du "si" que j'essaie d'éviter. Merci à tous pour votre aide, Pablo. – Pablo

1

Avez-vous considéré une solution ternaire courte?

'Sex' => (isset($sex) ? $sex : "n/a") 

C'est essentiellement EFFECTUER if-else logique, mais pas presque aussi bavard. Notre état est isset($sex). Si cela est vrai, nous retournons $sex, sinon nous retournons "n/a". Tout ce qui est renvoyé devient la valeur de 'Sex'.

Si cela ne suffit pas, je vous encourage à exiger des valeurs valides lors de l'instanciation. Si l'utilisateur ne fournit pas de valeurs correctes et attendues, refusez l'instanciation de la classe.

0
$temp_array = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc); 

foreach($temp_array as $key => $val){ 
if(!$temp_array[$key]){ 
    unset($temp_array[$key]; 
} 
} 

si vous devez accepter FALSE comme valeur, puis utilisez ceci:

$temp_array = array('Age' => '30', 'Sex' =>$sex, 'nationality'=>$nationality, 'maritalstatus'=>$status, etc, etc); 

foreach($temp_array as $key => $val){ 
if($temp_array[$key] !== NULL){ 
    unset($temp_array[$key]; 
} 
} 

edit: ce qui rend les touches que seulement avec des valeurs non nulles ou non Falsey sont présents dans la finale tableau.

0

Une façon serait de stocker vos clés possibles dans un tableau - alors vous pourriez itérer sur elle besoin d'un seul ensemble de code de commande pour chaque tableau:

$keys = array('Age', 'Sex', 'Nationality'); 

foreach ($keys as $key) { 
    if (isset($inputs[$key])) 
    $test->employee[$key] = $inputs[$key]; 
} 
0

Je suis un peu confus sur votre problème. Les variables telles que $ sexe, $ nationalité, etc., ne sont-elles pas toujours définies ou sont-elles simplement définies sur null? Si ces variables n'existent pas toujours, il est impératif de vérifier leur existence en premier et il n'y a aucun moyen de contourner cela - à moins de refactoriser le code précédent.

Je suppose que les variables existent et que vous ne voulez pas sauvegarder les cas NULL.

Une approche de POO peut être d'utiliser l'encapsulation de données - un choix commun pour un cas comme celui-ci. Ces modifications suivantes doivent être apportées à la classe de test.

class test { 

    protected $employee = array(); 

    public function getEmployee() { 
    return $this->employee; 
    } 

    public function setEmployee($employee) { 
    foreach ($employee as $key => $value) { 
     if ($value !== null) { // or any value it should not be 
     $this->employee[$key] = $value; 
     } 
    } 
    } 

... 

Une autre approche serait d'introduire employé comme son propre objet, et utiliser des mécanismes dans son objet pour ignorer les valeurs NULL. Vous pouvez remplacer __set, réutiliser l'encapsulation de données, prendre des arguments __construct ou toute une série d'autres solutions.

Questions connexes