IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Tableaux] Conversion array -> object [FAQ]


Sujet :

Langage PHP

  1. #1
    Membre habitué Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Points : 139
    Points
    139
    Par défaut [Tableaux] Conversion array -> object
    Il y a quelques jours j'ai eu l'idée de convertir mes tableaux en objets, tout dabord parce qu'avec les objets on a pas de soucis de guillemets puis bah le code est beaucoup plus cours. Mais est-ce que c'est un bon procédé ?

    Du coup, $_POST devient $post, $_GET devient $get et $_SESSION devient $session.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    function arrtoobj($arg_array) {
      $tmp = new stdClass;
      foreach ($arg_array as $key => $value) {
        if (is_array($value)) {
          $tmp->$key = arrtoobj($value);
        } else {
          $tmp->$key = $value;
        }
      }
      return $tmp;
    }
    Attention ça ne fonctionne pas avec des $key numériques.

    Exemple : $post = arrtoobj($_POST);

    Est-ce une bonne initiative ?

  2. #2
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    Parlez-vous des magic_quotes par "soucis de guillemets" ?
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

  3. #3
    Membre habitué Avatar de Roromix
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Décembre 2005
    Messages : 182
    Points : 139
    Points
    139
    Par défaut
    Nan, je parle des $array['nomdevaleur'] car quand il faut inclure ca dans une requete sql par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO ".$db->prefix."users (value) VALUES ('".$array['nomdevaleur']."')"
    Je préfére ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO ".$db->prefix."users (value) VALUES ('$array->nomdevaleur')"
    Je pense que ça peut être un script utile a mettre dans la FAQ php ou dans les sources.

  4. #4
    Inscrit

    Profil pro
    H4X0|2 @ YourLabs Business Service
    Inscrit en
    Octobre 2006
    Messages
    657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : H4X0|2 @ YourLabs Business Service
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 657
    Points : 909
    Points
    909
    Par défaut
    Il n'y a aucun soucis avec un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ar = array("a"=>"b"); 
    echo "$ar[a]";
    // affiche b
    Mais c'est pls long à parser qu'avec une concaténation, car php doit "deviner" qu'il faut afficher une variable, en règle générale on peut affirmer que c'est une mauvaise pratique de code.
    YourLabs Business Service: Conseil en Strategie Numerique / Club de 1337 Haxors depuis 2012 / Marque de Logiciels Libres / Blog / GitHub /
    Citation Envoyé par C.A.R. Hoare, The 1980 ACM Turing Award Lecture
    There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies.”
    More great quotes - RIP Uriel

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Salut,

    Quitte à vouloir faire ce que tu veux faire, voici une autre solution qui me parait plus idéale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    class arrtoobj
    {
    	protected $p_items;
     
    	public function __construct( $items )
    	{
    		if( is_array($items) )
    			$this->p_items = $items;
    		else
    			throw new Exception("L'argument attendu doit être de type Array");
    	}
     
    	public function __get( $prop )
    	{
    		if( isset( $this->p_items[$prop] ) )
    		{
    			if( is_array($this->p_items[$prop]) )
    				$this->p_items[$prop] = new arrtoobj( $this->p_items[$prop] );
    			return $this->p_items[$prop];
    		}
    		else
    			throw new Exception("Clé ".$prop." inconnue...");
    	}
     
    	public function __set( $prop , $value )
    	{
    		if( isset( $this->p_items[$prop] ) )
    			$this->p_items[$prop] = $value;
    		else
    			throw new Exception("Clé ".$prop." inconnue...");
    	}
    }
    J'y voit deux avantages.
    Premierement, si une clef n'existe pas dans le tableau cela provoque une exception. Donc on en est avertit.

    Deuxiemement, cette manière de procéder utilise le lazy loading, ou en gros *le chargement faineant*.
    L'idée derriere cela est de ne réaliser que les opérations strictement demandées.
    Il n'y à pas d'opérations inutile qui sont executées.
    En somme cette version ne lit pas toutes les clés du tableau en entrée pour les enregistrer autre part.
    Elle se contente de fournir la valeur demandée pour une clé N à un moment T.

    Bien sur dans bien des cas le gain de performances est minable, mais bon je trouve cela toujours plus élégant ; )
    Et dans certains cas, je pense que ce sera véritablement plus performant, ceci dit cela reste à vérifier car j'ai un peu peur de la copie de tableau....

    Quand au code en lui même je l'ai écrit on the fly, il peut donc subsister des erreurs d'écriture.
    Mais c'était juste pour illustrer une autre manière de procéder, une idée.

    Finalement, à la question, est-ce un bon procédé que de transformer les clefs d'un tableau en des propriétés d'objets ?
    Je pense foncierement que non. Car cela induit une perte d'informations pour toutes les clés numériques.

    Si tu tiens vraiment à utiliser un objet pour gérer tes tableaux, tourne toi vers ArrayObject qui est là pour cela.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $get_ = new ArrayObject();
    $get_->exchangeArray( $_GET );
    voila.

    bye

Discussions similaires

  1. Réponses: 2
    Dernier message: 28/12/2007, 12h09
  2. [Tableaux] Affichage Array
    Par dafalri dans le forum Langage
    Réponses: 6
    Dernier message: 06/12/2005, 11h55
  3. création de tableaux avec Array() et élément 'fantome'
    Par Talieth dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 22/11/2005, 09h49
  4. [FLASH MX2004] Array et Object
    Par NeoMan dans le forum Flash
    Réponses: 2
    Dernier message: 12/10/2005, 21h22
  5. [Conversion]Probleme castexception object --> Integer
    Par lthomas dans le forum Général Java
    Réponses: 10
    Dernier message: 18/04/2005, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo