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 :

[POO] Création des variables d'une classe


Sujet :

Langage PHP

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut [POO] Création des variables d'une classe
    Bonjour à tous,

    J'ai un doute et je souhaiterai avoir votre conseil avant de faire tout faux.

    J'ai récupéré un class et je l'ai adaptée pour l'utiliser afin d'afficher du texte selon la langue.

    Voici le code
    Code PHP : 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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    class Langues {
     
    	// Langue par le code ISO 639 (défaut : français)
    	private $_langue = 'fr';
     
    	// Dossier contenant les langues
    	private $_dirLangue = '';
     
    	/*
    	Constructeur
     
    	Récupère la langue via le navigateur, sinon charge celle par défaut ou si une langue est spécifiée, on charge celle ci. Permet aussi de spécifier le dossier ou ce trouvent les langues
     
    	@access public
    	@param $langue, $dirLangue, $fichier
    	@return void
    	*/
    	public function __construct($dirLangue, $fichier, $langue = false) {
    		if(is_dir($dirLangue)) {
        		$this->_dirLangue = $dirLangue;
        	}
        	else {
        		$this->_dirLangue = 'langues';
        	}
     
        	if($langue) {
        		$this->_langue = strtolower($langue);
        	}
        	else {
        		if($lang = strtolower(substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2))) {
    #    			$this->_langue = $lang;
    				$this->_langue = $_SESSION['language'];
        		}
        		else {
        			$this->_langue = 'fr';
        		}
        	}
     
        	if(file_exists($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.php')) {
        		// Chargement du fichier langue
        		$this->translationFile($fichier);
        	}
        	else {
        		die('Fichier de traduction ('.$this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.php) est innexistant ! Merci de vérifier que celui ci existe.');
        	}
    	}
     
     	/*
     	Charge le fichier XML
     
     	@access private
     	@param $fichier
     	@return void
     	*/
    	private function translationFile($fichier) {
    		include($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.php');
    	}
    	/*
    	Charge le message à afficher
     
    	@access public
    	@param $texte
    	@return $texte
    	*/
    	#private function text($texte) {
    	#	return $this->$texte;
    	#}
     
    	public function __get($texte){
    		return $this->$texte;
    		#text($texte);
    	}
    }

    Ma question commence là:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	private function translationFile($fichier) {
    		include($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.php');
    	}
    Ceci va "charger" des variables. Par exemple, dans ce fichier j'ai ceci:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		$this->msg_mm_1_1 ="My Hobbies";
    		$this->msg_mm_1_2 = "Présentation";
    		$this->msg_mm_1_3 = "Communication";
    		$this->msg_mm_1_4 = "Contact";
    Puis dans ma class, ceci affiche le texte:
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $langue->msg_mm_1_1;
    grace à la commande magique
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    	public function __get($texte){
    if(property_exists(__CLASS__, $name)) $this->$texte = $value;		
            	else echo '<p>Code error : <b><em>"'.$texte.'"</em></b> is not an existing property in the class : '.__CLASS__.'</p>';		
    #return $this->$texte;
    		#text($texte);
    	}
    Ca marche bien, mais je ne suis pas concaincu que c'est propre.

    Ma premiere question:
    Si je devine bien, ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->msg_mm_1_1 ="My Hobbies";
    crée un variable. Mais est-elle public, private ou protected?
    Comment faire pour la rendre protected ou private?
    Deuxieme question:
    Je ne sais pas ce qu'il y a de mieux entre ces deux solutions
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    	public function text($texte) {
    		return $this->$texte;
    	}
     
    OU
     
    	public function __get($texte){
    if(property_exists(__CLASS__, $texte)) $this->$texte = $value;		
            	else echo '<p>Code error : <b><em>"'.$texte.'"</em></b> is not an existing property in the class : '.__CLASS__.'</p>';
    	}
    J'ai une préférence pour la methode magique puisqu'elle controle si la variable existe ou pas.
    Troisieme question:
    Que pensez-vous de mon petite code?
    Pourrais-je faire mieux?

    Merci pour vos lumières
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour,

    1ere question: regarde ce code :

    Code php : 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
     
    class A{
     
    	protected $_attr1;
    	private $_attr2;
     
    	function __construct($attribut1, $attribut2){
    		$this->_attr1 = $attribut1;
    		$this->_attr2 = $attribut2;
    	}
     
     
    }
     
    	$objet = new A('valeur1', 'valeur2');
    	$objet->_attr3 = 'valeur3';
     
    	echo $objet->_attr1.'<br />'; // Erreur
    	echo $objet->_attr2.'<br />'; // Erreur
    	echo $objet->_attr3.'<br />'; // valeur3

    En gros, tu rend privés ou protégés tes attributs en les déclarant dans ta classe sinon ils sont déclarés en visibilité publique.

    2ieme question : ces 2 méthodes sont en fait similaires dans ton exemple, en gros tu as juste redéclaré la méthode __get par text c'est tout
    Si c'est pour tester l'existence de ton attribut, tu peux le faire directement dans ta méthode text de la meme facon. Toutefois dans ton cas de figure, la méthode __get serait plutot __set car tu affectes une valeur (question de concordance c'est tout). D'autre part ta variable $value n'est pas définie.

    3ieme question : ton code n'est pas encore très évolué, on verra ca plus tard

    A+

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 096
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 096
    Points : 944
    Points
    944
    Par défaut
    Salut, merci pour ton aide,

    Ben en fait je me suis trompé et j'ai corrigé le code ainsi car la methode _GET récupère bien les données d'un variable. C'est pourquoi je n'ai pas chosi _SET
    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    	public function __get($texte){
    		#return $this->$texte;
    		if(property_exists(__CLASS__, $texte)) echo $this->$texte;		
            	else echo '<p>Code error : <b><em>"'.$texte.'"</em></b> is not an existing property in the class : '.__CLASS__.'</p>';
    		#return $this->$texte;
    		#text($texte);
    	}

    Alors en fait TANT qu'un variable n'a pas été déclarée private ou protected, et donc dans mon cas, elle est créé par le fichier inclu...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //CONTENU DU FICHIER INCLU PAR LA METHODE
    //private function translationFile($fichier) {
    //		include($this->_dirLangue.'/'.$this->_langue.'/'.$fichier.'.php');
    //	}
     
    $this->msg_mm_1_1 ="My Hobbies";
    		$this->msg_mm_1_2 = "Présentation";
    		$this->msg_mm_1_3 = "Communication";
    		$this->msg_mm_1_4 = "Contact";
    ... elle sera public.
    Maintenant es-ce une faille de sécurité?
    Dois-ja absolument trouvé une solution pour qu'elle devienne privée ou protected?
    Y-a-t-il une solution sans que j'ai besoin de les déclarée une par une (comme un héritage)? car j0en ai pas que 4, bien bien bien plus...

    Mon coe n'est pas trop évolué, mais suffit-il? Pourrais-je etre confronté à un problème de sécurité?

    Merci
    Il ne suffit pas de tout savoir. Vouloir et persévérer, c'est déjà presque tout!

  4. #4
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    En fait la visibilite des variables (private, protected, public) n'est pas directement liée à la sécurité mais plus au confort de developpement entre les programmeur, graphistes etc...(enfin je vois ca comme ca). Par exemple, dans le cas d'un site conçu via la methodologie MVC (Modele Vue Controleur), quelqu'un s'occupant de la vue n'aura pas a se preoccuper et ne POURRA PAS changer l'attribution d'un de tes attributs privés ou protégés ce qui finalement est bien mieux pour tout le monde et bien mieux organisé (chaque developpeur a une tache bien specifique, personne n'empiete sur le travail des autres). Le mec s'occupant de la vue aura juste à appeler __get ou getTauxTVA et il obtiendra la valeur sans se soucier du comment ou du pourquoi ni des eventuelles MAJ.

    Voilà comment je vois les choses (si j'ai tout faux jetez moi des pierres )

    Et puis si les variables publiques étaient toujours une faille de sécurité, elles n'existeraient plus

Discussions similaires

  1. [XL-2003] Création des méthodes d'une classe personnalisée
    Par martinmacfly dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 30/07/2010, 20h32
  2. [C#2005] Stocker des variables dans une classe
    Par Herlece dans le forum Windows Forms
    Réponses: 7
    Dernier message: 13/10/2008, 10h30
  3. Réponses: 5
    Dernier message: 19/05/2008, 18h40
  4. passage des variables d'une classe à une autre
    Par zibou7 dans le forum Langage
    Réponses: 4
    Dernier message: 19/02/2007, 16h46
  5. Réponses: 2
    Dernier message: 17/12/2005, 20h52

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