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 :

Récupérer une valeur d'une classe


Sujet :

Langage PHP

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 244
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 244
    Par défaut Récupérer une valeur d'une classe
    Bonjour à tous,

    je retravaille un petit peu un code que j'avais fait en OO et je dois donc le corrigé..

    J'ai une classe :
    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
     
    class Validate{ 						
    	protected $toBeValidate = array();
     
    	function __construct(){}
     
    	public function __get($name){
    		return $this->$name;
    	}
     
    	function Validate($labelName,$fieldName,$typeOfValidation,$condition){
     
    		$this->toBeValidate[] = str_replace(" ","_",$labelName).'*'.str_replace(" ","_",$fieldName).'*'.$typeOfValidation.'*'.$condition;
    	}
     
    	function _Display(){															// Obsolete. It let's you to see the field name to be check for validation
    		print_r($this->toBeValidate);
    	}
    }
    Le tableau protected $toBeValidate est correctement "allimenté".

    J'ai aussi une fonction
    (je ne mets pas tout le code, car il est enorme et fonctionne bien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    function CheckNowTheFieldsContentAndRecordTheResult($method,$checker){
    }
    Dans cette fonction, j'ai besoin de récupérer la valeur de $toBeValidate de la class précédente, sans devoir faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CheckNowTheFieldsContentAndRecordTheResult($method,$checker,$toBeValidate){}
    Comment puis-je donc le faire. Je pensais que ceci marcherait, mais non
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CheckNowTheFieldsContentAndRecordTheResult($method,$checker){
     Validate->toBeValidate
    }
    Merci pour votre aide

    Je me demande si dans ma class Validate, je ne devrais pas tranformer ma fonction Validate en static.
    D'ailleur elle porte le même nom, es-ce bien?

    Comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Validate{ 						
    	protected $toBeValidate = array();
     
    	//function __construct(){}
     
     
    	static function Validate($labelName,$fieldName,$typeOfValidation,$condition){
     
    		$this->toBeValidate[] = str_replace(" ","_",$labelName).'*'.str_replace(" ","_",$fieldName).'*'.$typeOfValidation.'*'.$condition;
    	}
     
    }
    Pourriez-vous me corriger?

    Merci

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Bonjour,

    1 - utilisation de static : pourquoi mettre la fonction Validate() en static ? Qu'attends-tu exactement de ce comportement ? En tout état de cause, une méthode statique est une méthode de classe, pas une méthode d'instance. Une méthode ou un attribut statique sont partagés par tous les objets de la classe. Et tu n'as pas besoin d'instancier un objet pour appeler une méthode statique.

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    class Foo {
       public function nonStatique() {}
       public static function statique() {}
    }
     
    // Appel de la méthode non statique : instance obligatoire
    $a = new Foo(); 
    $a->nonStatique();
     
    // appel de la méthode statique : instance facultative
    Foo::nonStatique();
     
    // mais on peut aussi l'appeler avec un objet instancié si on veut
    $a->nonStatique()
    Bien sûr, comme une méthode statique n'est pas rattachée à une instance, $this n'est pas défini dans le corps de cette méthode.

    2 - utilisation de protected :
    Validate est un nom de classe, ça ne va pas marcher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $obj = new Validate(); 
    $obj->toBeValidate
    serait mieux mais $toBeValidate est déclaré protected, tu ne peux donc pas y accéder en dehors de la classe.

    La solution, vu le code de ta classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $obj = new Validate(); 
    $obj->__get('toBeValidate');
    Autres solutions :
    - rendre $toBeValidate public (déconseillé)
    - développer des accesseurs propres au lieu du __get(string), qui du reste va planter salement quand tu essayeras d'accéder à un attribut qui n'existe pas.

    Classiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class Validate {
       protected $monattribut;
       public function getMonAttribut() { return $this->monattribut; }
    }
    L'approche avec une méthode du genre de ton __get() est aussi régulièrement utilisée, mais plutôt sur des gros frameworks. Elle a un petit avantage (on n'est pas obligé de déclarer un accesseur pour chaque nouvel attribut, léger gain de temps) et quelques inconvénients notables - mais on sort ici du sujet.

    3 - Noms des méthodes :
    D'ailleurs elle porte le même nom, es-ce bien?
    C'est probablement une erreur. En PHP5, si tu ne déclares pas de constructeur (méthode __construct() mais que tu déclares une méthode de même nom que la classe, celle-ci sera utilisée comme constructeur par défaut. Ceci garantit une compatibilité avec le code hérité de PHP4. Mais... est-ce vraiment ce que tu veux pour ta métode Validate() ? Je pense que non...

    Cela dit, mon premier conseil serait que tu révises et que tu assimiles les concepts généraux de la POO car l'utilisation de static et les contrôles d'accès public/protected/private sont tout de même des concepts de base. Si tu ne connais pas ça, tu vas avoir beaucoup de problèmes

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 244
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 244
    Par défaut
    Ok, super! Je te remercie pour tes explications et pour le temps que tu as pris pour ça.
    Je vais tout regardré ceci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 13/04/2015, 11h17
  2. [WD16] Récupérer la valeur d'une colonne d'une table d'une ligne précise
    Par elghers_hocine dans le forum WinDev
    Réponses: 16
    Dernier message: 06/05/2011, 18h11
  3. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48
  4. Réponses: 6
    Dernier message: 31/05/2007, 18h10
  5. Réponses: 4
    Dernier message: 07/08/2006, 17h01

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