2 votes

La classe créée dynamiquement par php a deux propriétés avec le même nom, je ne comprends pas pourquoi.

Un code sur lequel je m'appuyais beaucoup crée maintenant un objet avec deux propriétés qui ont le même nom.

Je ne pensais pas qu'il était possible d'avoir deux propriétés avec le même nom et des valeurs distinctes.

J'ai une fonction qui convertit un tableau en un objet de classe. Cette méthode a bien fonctionné pour de nombreuses applications et je n'ai jamais rencontré ce problème étrange auparavant.

Voici la fonction avec les var dumps ajoutés et un die() pour arrêter l'exécution juste pour obtenir la sortie du premier objet pour vous montrer les gars.

Le tableau de paramètres est présenté ci-dessous, classe = "FA \WheelImage ", namespace = "")

protected function arrayToClass($array, $class,$nameSpace=''){
        $nameSpaceClassPrefix = (!empty($nameSpace))? "\\$nameSpace\\" : "";

        if(!class_exists($nameSpaceClassPrefix . $class)){
            echo "<br>ERROR: $class is not a valid object type!<br>";
            return false;
        }
        echo "<pre>";
        var_dump($array);
        var_dump($this->headings);

        $class_name = $nameSpaceClassPrefix . $class;
        $class_object = new $class_name();
        foreach ($array as $key => $value){
            //note: this usually only works if the array is associative first so we have to set the key to be the heading
            $key = $this->headings[$key];
            //only assign if the class object has the property defined. Move out of condition if you the property created regardless of if the model defines it.
            if(!$this->explicit_properties || property_exists($class_object, $key)){
                if ($value=="false") $value = false;
                if ($value=="true") $value = true;
                if ($value=="null") $value = null;
                $class_object->{$key} = $value;
            }
        }
        var_dump($class_object);
        die("stop");
        return $class_object;
    }

SORTIE : tableau original, intitulés utilisés pour les noms de clés/propriétés, l'objet classe résultant.

array(3) {
  [0]=>
  string(14) "TSW_bathurst_1"
  [1]=>
  string(3) "TSW"
  [2]=>
  string(8) "Bathurst"
}
array(3) {
  [0]=>
  string(8) "image"
  [1]=>
  string(5) "brand"
  [2]=>
  string(5) "wheel"
}
object(FA\WheelImage)#162 (4) {
  ["image"]=>
  NULL
  ["brand"]=>
  string(3) "TSW"
  ["wheel"]=>
  string(8) "Bathurst"
  ["image"]=>
  string(14) "TSW_bathurst_1"
}
stop

Comme vous pouvez le constater, l'objet classe se retrouve avec deux propriétés portant exactement le même nom. Comment cela est-il possible ? Comment l'objet classe est défini :

namespace FA;

class WheelImage
{
    var $image;
    var $brand;
    var $wheel;
}

NOTE : Les titres proviennent d'un fichier csv :

//the csv file
image,brand,wheel
TSW_bathurst_1,TSW,Bathurst
TSW_bathurst_2,TSW,Bathurst
TSW_bathurst_3,TSW,Bathurst
TSW_bathurst_4,TSW,Bathurst

//how the headings are loaded
if ($has_headings) $this->headings = fgetcsv($file);//first row is headings

0voto

Brad Points 160

Je l'ai corrigé en créant un nouveau fichier csv et en tapant manuellement les en-têtes csv. Le fichier original a été sauvegardé via Excel.

Je pense qu'une sorte d'encodage de texte est à l'origine du problème.

La modification du fichier d'origine en supprimant les titres et en les tapant à nouveau ne fonctionnait pas, mais la création d'un nouveau fichier et sa saisie ont permis de résoudre le problème.

Bien que j'aie résolu le problème, j'aimerais que quelqu'un me dise pourquoi cela s'est produit et comment faire en sorte que le code générique ignore tout encodage de texte bizarre dans le fichier csv.

Je pense que cela aurait pu être une meilleure réponse si j'avais été dans la situation où recréer le fichier source n'était pas une option. Supprimer les caractères non-utf8 de la chaîne de caractères

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X