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 :

Class et variables


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut Class et variables
    Bonjour

    J'ai un petit soucis avec mes définitions de variables dans mon code php.

    Code conf_global.php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
     
    $INFO['sql_host']			=	'mon_serveur_mysql';
    $INFO['sql_database']		=	'ma_base_de_données';
    $INFO['sql_user']			=	'mon_utilisateur';
    $INFO['sql_pass']			=	'mon_mot_de_passe';
     
    ?>

    Code classDB.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
    <?php
     
    require ('conf_global.php');
     
    class dbMain {
     
        private $sql = array(
    					'server' 	=> $INFO['sql_host'],
    					'database' 	=> $INFO['sql_database'],
    					'user' 		=> $INFO['sql_user'],
    					'password' 	=> $INFO['sql_pass']
    					);
     
    	function __construct() {
     
    		$this->link = mysql_connect($this->sql['server'], $this->sql['user'], $this->sql['password']);			
    			mysql_select_db($this->sql['database'], $this->link) or die(mysql_error());
     
    	}
     
    }
     
    ?>

    J'obtiens l'erreur suivante : Parse error: syntax error, unexpected T_VARIABLE in /var/www/virtual/death-vipers.net/labo/logs/classDb.php on line 8

    Par contre si dans le tableau $sql je mets directement les valeurs stockées dans le conf_global.php, ça fonctionne.

    Apparemment je ne peux pas mettre de variables dans un array et je ne vois pas pourquoi

    Auriez-vous une idée de l'erreur ?

    Cordialement,
    Beniti

  2. #2
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Bonjour,

    A mon avis il s'agit simplement d'un problème de visibilité de variable.

    Le tableau info est certes déclaré dans le fichier de la classe, mais pas à l'intérieur de celle-ci, et ne peut donc être résolu.

    Pour moi, il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
        $INFO['sql_host'] = 'mon_serveur_mysql';
        $INFO['sql_database'] = 'ma_base_de_données';
        $INFO['sql_user'] = 'mon_utilisateur';
        $INFO['sql_pass'] = 'mon_mot_de_passe'; 
    ?>
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
        define('SQL_HOST','mon_serveur_mysql');
        define('SQL_DATABASE','ma_base_de_données');
        define('SQL_USER','mon_utilisateur');
        define('SQL_PASS','mon_mot_de_passe'); 
    ?>
    puis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private $sql = array(
    	'server' 	=> $INFO['sql_host'],
    	'database' 	=> $INFO['sql_database'],
    	'user' 		=> $INFO['sql_user'],
    	'password' 	=> $INFO['sql_pass']
    );
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    private $sql = array(
    	'server' 	=> SQL_HOST,
    	'database' 	=> SQL_DATABASE,
    	'user' 		=> SQL_USER,
    	'password' 	=> SQL_PASS
    );

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Ah, merci pour cette solution, elle fonctionne très bien

    Par contre pour la déclaration de tableaux (et variables) dans la classe, je ne comprends pas bien pourquoi ça ne fonctionne pas.

    Encore merci en tout cas

  4. #4
    Expert confirmé
    Avatar de Thes32
    Homme Profil pro
    Développeur PHP, .Net, T-SQL
    Inscrit en
    Décembre 2006
    Messages
    2 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur PHP, .Net, T-SQL

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 379
    Points : 4 853
    Points
    4 853
    Par défaut
    Citation Envoyé par Beniti Voir le message
    Par contre pour la déclaration de tableaux (et variables) dans la classe, je ne comprends pas bien pourquoi ça ne fonctionne pas.
    comme te le dit Théocrite
    ...il s'agit simplement d'un problème de visibilité de variable
    Les variables globales ne sont pas automatiquement vu à l'intérieur des fonctions, classes. Pour qu'ils soient visible tu dois utiliser le mot clé global ou la supergloable $_GLOBALS.
    Développeur | Zend Certified Engineer

    Étapes Pour mieux se servir du forum:
    1. Commencez par lire les cours et tutoriels ;
    2. Faites une recherche;
    3. Faites un post si rien trouvé dans les deux étapes précédentes en respectant les règles;

    Nix>_Rien n'est plus pratique que la théorie

  5. #5
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Si tu veux en savoir plus sur la portée des variables, la doc PHP en parle : portée des variables en PHP (scope en anglais).

    L'article ne parle pas forcément des classes, mais dans le cas d'un objet, les valeurs auxquelles tu auras accès sont limitées : les attributs de la classe, les constantes de classe et les globales.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Merci pour les conseils

    J'avais bien testé plusieurs méthodes, dont la référence "global" mais ça ne marchait pas plus.

    D'ailleurs si je fais un truc tout con de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    require ('conf_global.php');
     
    class maclasse {
     
        global $url;
        $this->url = SITE_URL; // constante définie dans l'autre fichier conf_global.php
     
        function mafonction() {
     
            $r .= $this->url;
     
        }
     
    }
    Je me mange invariablement (pour le coup) un unexpected T_GLOBAL (ou T_VARIABLE si je mets pas le global) à la ligne qui correspond à global $url; (ou var $url.

    Je dois pas très bien comprendre le principe d'utilisation. En tout cas ça doit être génial d'utiliser la même variable pour plusieurs fonctions

  7. #7
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Tu devrais revoir un peu la programmation orienté objet, en php et même niveau concept... Regarde un tuto sur les bases de la programmation orientée objet en PHP, puis une fois que tu auras les bases, regarde ceux que tu peux trouver ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    require ('conf_global.php');
     
    class maclasse {
     
         public $url = SITE_URL; // constante définie dans l'autre fichier conf_global.php
     
        function mafonction() {
     
            $r .= $this->url;
     
        }
     
    }
    Je vois pas ce que tu veux faire avec ton global en fait...

    J'ai mis ton attribut url en public, mais tu peux changer avec protected ou private...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par Théocrite Voir le message
    Tu devrais revoir un peu la programmation orienté objet, en php et même niveau concept...
    Je m'y emploie tous les jours
    L'inconvénient de l'auto formation dans mon cas, est d'avancer un peu à l'instinct en testant des méthodes en fonction des besoins (pros/persos) qui tombent. Résultat, on se prend les pieds dans le tapis régulièrement.

    Merci Je consulte régulièrement les cours et tutos de ce site, je teste ensuite des morceaux de code, et quand je bute trop longtemps sur un problème, j'use de faiblesse en faisant appel à vous.


    Je vois pas ce que tu veux faire avec ton global en fait...
    Définir la valeur de la variable une seule fois et utiliser cette variable dans plusieurs fonctions.

    Maintenant à la déclaration de la variable en dessous de la classe, pourquoi :
    • $url = SITE_URL; -> renvoie un unexpected t_variable ?
    • var $url = SITE_URL; -> renvoie un unexpected t_variable ?
    • global $url = SITE_URL; -> renvoie un unexpected t_variable ?
    • public $url = SITE_URL; -> fonctionne ?

    Sachant que je m'inspire toujours d'exemples qui fonctionnent sur developpez ou autres sites sur le web.

    J'avoue être enduit d'interrogation

  9. #9
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Citation Envoyé par Beniti Voir le message
    Merci Je consulte régulièrement les cours et tutos de ce site, je teste ensuite des morceaux de code, et quand je bute trop longtemps sur un problème, j'use de faiblesse en faisant appel à vous.
    Demander n'est pas une preuve de faiblesse, c'est une preuve que tu as envie d'apprendre !

    Citation Envoyé par Beniti Voir le message
    Définir la valeur de la variable une seule fois et utiliser cette variable dans plusieurs fonctions.
    C'est le cas des globales, que tu as définis avec le define, mais aussi dans le cas des classes tu peux utiliser dans certains cas les attributs de ta classe, notamment les statiques, et les constantes.

    C'est à toi de déterminer l'architecture de ton projet ensuite pour choisir la meilleure solution.

    Citation Envoyé par Beniti Voir le message
    Maintenant à la déclaration de la variable en dessous de la classe, pourquoi :
    • $url = SITE_URL; -> renvoie un unexpected t_variable ?
    • var $url = SITE_URL; -> renvoie un unexpected t_variable ?
    • global $url = SITE_URL; -> renvoie un unexpected t_variable ?
    • public $url = SITE_URL; -> fonctionne ?
    Concernant les attributs, il me semblait que var aurait du marcher, mais il apparait que non, ce qui me fait penser qu'ils ont supprimé ce mot clé sur php 5.3 (?) ou avant peut être... J'utilisais var en PHP 4, depuis j'ai évolué.

    D'un point de vue objet, les attributs de classe doivent toujours disposer d'une indication de visibilité (private, protected, public), et les méthodes (function) aussi.

    Les codes que tu prends sur des sites et qui ne fonctionnent pas proviennent probablement d'un problème de version. PHP introduit des notions d'objets en version 4, mais rien de très convaincant, après quoi la version 5 apporte un grand nombre de modifications, d'où la création de problèmes.

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    quel est l’intérêt de faire une classe pour mysql sachant que y'a PDO ?

  11. #11
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    quel est l’intérêt de faire une classe pour mysql sachant que y'a PDO ?
    Une construction automatique de pdo à partir d'un fichier de conf ? (c'est pas le cas ici, mais on pourrait y venir...).

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Théocrite Voir le message
    Une construction automatique de pdo à partir d'un fichier de conf ? (c'est pas le cas ici, mais on pourrait y venir...).
    ?

  13. #13
    Membre éprouvé Avatar de tdutrion
    Homme Profil pro
    Architecte technique
    Inscrit en
    Février 2009
    Messages
    561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 561
    Points : 1 105
    Points
    1 105
    Par défaut
    La classe ne devrait pas contenir les accès à mysql mais plutôt permettre de parser un fichier de conf pour récupérer les informations de connexions à la base de données, et donc être une couche d'accès à la BD supplémentaire.

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    quel est l’intérêt de faire une classe pour mysql sachant que y'a PDO ?
    PDO n'est pas natif sur PHP5 et peut ne pas être installé sur un hébergeur externe. Si je bosse en local ou au travail, ça ne pose pas de problème parce que j'ai la main sur le serveur web et je peux installé les extensions qui m'intéressent, mais sur un hébergeur public qui n'a pas installé cette extension, le code deviendra caduque. Donc dans le doute. Après il y a toujours possibilité de faire évoluer le code au fil du temps et des évolutions dans les méthodes

    @Théocrite : Oui il faut que je m'adapte aux versions. En tout cas, grâce à vous, je peux appréhender les erreurs avec plus d'efficacité

  15. #15
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Beniti Voir le message
    PDO n'est pas natif sur PHP5 et peut ne pas être installé sur un hébergeur externe.
    ah t'es chez quel hébergeur ?

    pour info on ne debug pas de mysql_* avec des or die (de plus c'est pas die mais exit) mais avec le mysql.trace_mode

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    ah t'es chez quel hébergeur ?
    Web4all. Mais peut importe s'ils ont activé le PDO ou pas. Si dans un an je change d'hébergeur, je transfère mes pages et je vois que l'extension est absente. Je me retrouverais bien mal fichu.

    pour info on ne debug pas de mysql_* avec des or die (de plus c'est pas die mais exit) mais avec le mysql.trace_mode
    http://eusebius.developpez.com/phpmysql-base/
    Mon code est intimement lié à mes références

  17. #17
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Beniti Voir le message
    Web4all. Mais peut importe s'ils ont activé le PDO ou pas. Si dans un an je change d'hébergeur, je transfère mes pages et je vois que l'extension est absente. Je me retrouverais bien mal fichu.
    t'auras surtout pas de chance puisque déjà de nos jour un hébergeur sans PDO n'est pas un bon hébergeur, et j'irai même plus loin en disant qu'un hébergeur sans PHP 5.3 n'est pas un bon hébergeur

    Citation Envoyé par Beniti Voir le message
    http://eusebius.developpez.com/phpmysql-base/
    Mon code est intimement lié à mes références
    Date de mise à jour : 24/09/06

    faut se mettre à la page un de ces jours ...

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    Date de mise à jour : 24/09/06
    faut se mettre à la page un de ces jours ...
    Tu peux m'en dire plus ?

  19. #19
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    Citation Envoyé par Beniti Voir le message
    Tu peux m'en dire plus ?
    ta référence est un tuto qui date de 5 ans, tu ne trouves pas qu'il y'a un problème quelque part ?

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 43
    Points : 17
    Points
    17
    Par défaut
    Citation Envoyé par stealth35 Voir le message
    ta référence est un tuto qui date de 5 ans, tu ne trouves pas qu'il y'a un problème quelque part ?
    J'avais compris l'obsolescence de cette méthode. Par contre, je ne vois pas de cours ou explications tagés stealth35 le 09/09/2011.
    C'est sympa de me prévenir que, attention le debug que tu utilises n'est pas valable (encore que j'arrive à retomber sur mes pieds quand une erreur de requête survient), mais sans explications plus concises que "c'est pas die mais exit et c'est avec le mysql.trace_mode", ça va pas m'aider. Si tu as un exemple de la façon la plus opportune de debuger mysql je suis preneur

Discussions similaires

  1. Dll de classe et variable
    Par SkYsO dans le forum Langage
    Réponses: 5
    Dernier message: 10/03/2006, 09h25
  2. Réponses: 3
    Dernier message: 08/12/2005, 14h41
  3. Réponses: 2
    Dernier message: 09/10/2005, 15h35
  4. [Sessions] Classes et variables de sessions
    Par Thanaroth dans le forum Langage
    Réponses: 4
    Dernier message: 06/10/2005, 16h17
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

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