2010-02-12 7 views
2

Je travaille depuis quelques semaines à l'écriture d'une classe PHP et j'aime penser que j'ai une bonne connaissance des bases, mais je suis un peu perplexe.PHP Variables de classe vidées dans While Loop

Comme exemple simplifié de ce que je fais:

J'ai déclaré et instancié une variable publique ($ myURL) dans ma classe (someClass) et dans un fichier externe (config.php) à la classe rempli la variable avec une URL (http://demo.com).

Dans une fonction (make_array()) dans la même classe, j'utilise la variable déclarée ($ myURL) dans une boucle while() pour construire un tableau associatif de données que j'utilise en dehors de la classe pour générer une sortie listée (output.php). Une fois que j'ai défini la variable en utilisant une fonction de classe (set_myurl ($ url)) dans le fichier externe (config.php), je peux y accéder assez facilement en dehors du fichier de classe en utilisant echo pour imprimer l'URL de l'ensemble à la page. Le problème survient lorsque je parcours le tableau et que je veux définir la variable prédéfinie ($ myURL) sur divers sous-tableaux du tableau associatif que je construis avec la fonction make_array() dans ma classe fichier. La fonction make_array() prend un résultat MSSQL $ et boucle les lignes créant le tableau en insérant l'URL si elle n'existe pas et le second argument ($ add_my_url) est défini sur true.

Dans la fonction, la variable définie devient vide mais reste définie comme je l'ai testé avec les fonctions PHP intégrées empty(), isset() et is_null() dans le but de résoudre le problème.

Je me demande si quelqu'un a des connaissances ou de l'expérience à ce sujet.

Une brève idée de ce que je fais

<?php 
class someClass { 
var $myURL = ''; 

public function set_myurl($url){ 
$this->myURL = $url; 
} 

public function make_array($db_result_array, $add_my_url = false){ 
$new_array = array(); 
while($row = $db_result_array){   
// build array 
$array = array(
'Amount' => $row['Amount'], 
'Description' => $row['Description'], 
'URL' => ($add_my_url ? (!$row['URL'] ? $this->myURL : $row['URL']) : $row['URL']) 
); 
// merge array 
$new_array[] = $array;   
}  

return $new_array; 
} 

} 
?> 

<?php 
// config.php 
$myClass = new someClass; 
$myClass->set_myurl('http://demo.com'); 

// this works and displays: http://demo.com 
echo $myClass->myURL; 
?> 

Je sais que cet exemple est vraiment abstraite, mais je ne voulais pas d'afficher les lignes complètes de 2000 de PHP.

Si vous avez besoin de plus de précisions, n'hésitez pas à demander. Je suis assez confiant que j'ai réduit le problème à cette fonction et cette boucle while().

Merci.

+1

Votre exemple fonctionne comme prévu pour moi. – blinry

Répondre

2

Je crois que quelque chose ne va pas avec votre état ternaire, essayez ceci:

class someClass 
{ 
    public $myURL = ''; 

    public function set_myurl($url) 
    { 
     $this->myURL = $url; 
    } 

    public function make_array($db_result_array, $add_my_url = false) 
    { 
     $new_array = array(); 

     while ($row = $db_result_array) 
     { 
      // build array 
      $array = array 
      (
       'Amount' => $row['Amount'], 
       'Description' => $row['Description'], 
       //'URL' => ($add_my_url ? (!$row['URL'] ? $this->myURL : $row['URL']) : $row['URL']) 
      ); 

      if ($add_my_url === true) 
      { 
       $array['URL'] = $row['URL']; 

       if (empty($array['URL'])) 
       { 
        $array['URL'] = $this->myURL; 
       } 
      } 

      // merge array 
      $new_array[] = $array;   
     }  

     return $new_array; 
    } 
} 
+1

Je pense que vous l'avez. Il n'y a pas besoin non plus de double ternaire lors de la définition de l'URL, utilisez plutôt: 'URL' => ($ add_my_url && vide ($ row ['URL'])? $ This-> myURL: $ row ['URL']) – nortron

+0

Merci pour la première réponse. Je ne pense pas que le problème soit lié à la condition ternaire, bien que ce ne soit probablement pas la méthode la plus optimisée pour faire ce que je voulais faire, comme l'a souligné @Cryo. Le problème est que la variable $ this-> myURL semble être vide dans la fonction même si elle semble être correctement définie. C'est un problème étrange parce que cela semble si simple. – paperclip

+0

@paperclip Si vous imprimez $ this-> myURL en tant que toute première ligne de la méthode make_array(), est-il toujours vide?Si tel est le cas, le code que vous avez fourni ne semble pas contenir votre problème, myURL est désactivé ailleurs (peut-être un appel à set_myurl ('') est-il stocké quelque part?). Je suggère de simplifier continuellement votre chemin de code à travers votre classe pour essayer de vider la méthode du problème. – nortron

0

Peut-être que le problème est ici while($row = $db_result_array){

Vous devriez essayer un pour/foreach peut-être?