Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/06/2011, 23h54   #1
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2010
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 28
Points : 8
Points : 8
Par défaut Accesseurs or not ?

Bonjour,

Voici la problématique:
Dans une classe, j'ai divers propriétés. J'ai besoin de savoir quand ces dernières ont été modifiées (pour traitement lors de l'enregistrement).

J'ai donc pensé créer des accesseurs via __set(). Les propriétés sont donc stockées dans un tableau privé de la classe et l'appel de __set() me permet à la fois de mémoriser la donnée mais aussi de positionner un booléen pour savoir que les données de l'instance ont été modifiées.

Jusque là, le contrat est rempli

Seulement, avec cette méthode, les propriétés ne sont pas déclarées dans le code comme membres de ma classe.
Résultat, lorsque j'utilise Doxygen pour générer la documentation de mon code, la classe ne possède pas les propriétés en question...

Actuellement, la méthode de contournement à laquelle j'ai pensé est de déclarer les propriétés en tant que membres privés de la classe et d'y accéder via des méthodes publiques du genre getPropriete et setPropriete

Mais je trouve cela un peu lourd et les vrais accesseurs comme on les trouve en c# me manquent

Comment puis je faire autrement ???
Merci de vos tuyaux
waxman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 09h16   #2
Membre actif
 
Homme Fabrice Agnello
Développeur informatique
Inscription : octobre 2010
Messages : 76
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Agnello
Âge : 39
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2010
Messages : 76
Points : 161
Points : 161
Bonjour,

est-ce que ceci pourrait faire l'affaire avec Doxygen ?

Code :
1
2
3
4
5
6
7
8
9
10
11
/**
 * Foo
 * blabla...
 * @property integer $bar This property is blabla...
 * ...
 * @method integer setBar() met à jour la valeur de $bar
 */
class Foo{
.... /*votre code */
}
cela implique d'utiliser la méthode __call, par contre...

Néanmoins, ce type de phpdoc est parfaitement pris en compte avec un éditeur comme Netbeans, qui propose lors de l'autocompletion les méthodes et propriétés déclarées dans la phpdoc.

HTH.
Agnello Fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 09h34   #3
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2010
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 28
Points : 8
Points : 8
Bonjour,

Merci pour cette réponse.

Mais il y a un point que je ne comprends pas
Si j'utilise une méthode setBar (à travers le __call), il ne faut pas que la propriété $bar soit directement accessible. Je dois la mettre en private au risque de voir son utilisation directe sans setBar
Ai je bon ?

Sinon, cette nuit, je pensais à quelque chose de proche:
Ne pas utiliser de setBar (ni en tant que méthode réellement existante ni via un __call), utiliser la propriété $bar mais via un __set comme je l'avais déjà évoqué et pour satisfaire Doxygen simplement documenter la propriété

Ce qui donnerait
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
/**
 * Foo
 * blabla...
 * @property integer $bar This property is blabla...
 */
class Foo{
     /*votre code */
 
     public function __set($key, $value) {
         /*votre code */
     }
}
Qu'en pensez vous ?

Encore merci
waxman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 10h17   #4
Membre actif
 
Homme Fabrice Agnello
Développeur informatique
Inscription : octobre 2010
Messages : 76
Détails du profil
Informations personnelles :
Nom : Homme Fabrice Agnello
Âge : 39
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Industrie

Informations forums :
Inscription : octobre 2010
Messages : 76
Points : 161
Points : 161
Citation:
Envoyé par waxman Voir le message
Mais il y a un point que je ne comprends pas
Si j'utilise une méthode setBar (à travers le __call), il ne faut pas que la propriété $bar soit directement accessible. Je dois la mettre en private au risque de voir son utilisation directe sans setBar
Ai je bon ?
Il n'y a pas de pré-requis à l'existence de la propriété $bar. vous pouvez tout aussi bien stocker cette donnée dans un tableau comme vous le faites via le __set. Equipez simplement votre classe d'un getter et d'un setter pour chaque propriété (définie en tant que telle ou non dans la classe, mais dans tous les cas, documentée de façon formelle dans la phpdoc de la classe).

Citation:
Envoyé par waxman Voir le message
Sinon, cette nuit, je pensais à quelque chose de proche:
Ne pas utiliser de setBar (ni en tant que méthode réellement existante ni via un __call), utiliser la propriété $bar mais via un __set comme je l'avais déjà évoqué et pour satisfaire Doxygen simplement documenter la propriété
ça devrait fonctionner aussi.
Agnello Fabrice est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 10h29   #5
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2010
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 28
Points : 8
Points : 8
Merci,

Je vois bien les différentes façons de coder tout ceci
Dommage qu'il n'existe pas de getter/setter fonctionnant comme en c# (ie présentant une interface unique pour le get et set portant simplement le nom de la propriété)
Ca ne simplifierait pas le code de la classe mais son utilisation dans du code externe

Encore merci pour votre aide
waxman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 12h03   #6
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Salut,

Fais attention car il y a des limitations avec les méthodes magiques qui peuvent dans certains cas t'empêcher de les utiliser : regardes ici
Mon expérience a fait que j'ai arrêté des les utiliser à tout va. Et puis, quand tu changes d'IDE, cela peut devenir vite le bordel avec l'autocompletion.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 12h41   #7
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2010
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 28
Points : 8
Points : 8
Merci pour ce warning intéressant

Et donc fort de ton expérience, comment fais tu ?
Pour chaque membre, tu crées un couple getter/setter ? Ou bien as tu une autres astuce ?
waxman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 14h04   #8
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2010
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 28
Points : 8
Points : 8
Citation:
Envoyé par Agnello Fabrice Voir le message
ça devrait fonctionner aussi.
J'ai tenté de documenter une propriété inexistante
Code :
@property integer $bar This property is blabla...
et ça ne fonctionne pas:

Doxygen me jette
Code :
warning: documented function `integer $bar This property is blabla' was not declared or defined.
waxman est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 15h57   #9
Expert Confirmé
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 1 461
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 35
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 1 461
Points : 2 548
Points : 2 548
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par waxman Voir le message
Et donc fort de ton expérience, comment fais tu ?
Pour chaque membre, tu crées un couple getter/setter ? Ou bien as tu une autres astuce ?
Généralement oui, je fais un setter/getter par attribut.
Il m'arrive de stocker de temps en temps les paires : attribut/valeur dans un tableau. C'est le cas quand par exemple les attributs sont de même type.
Et puis, en procédant ainsi, tu comprends vite le sens du mot monolithique. Des classes "Dieu" avec 30 ou 40 attributs... à te frapper, crois-moi tu réfléchis bien avant de te les envoyer.
Enfin, en ayant proprement tes setter/getter tu évites aussi les problèmes liés aux différents EDI qui interprètent plus ou moins correctement les commentaires et la génération des docs ne pose généralement pas de problèmes non plus.

Au vu des problèmes évités, je trouve que ces quelques lignes de code ne nuisent pas trop à la productivité.
__________________
# Dans la Création, tout est permis mais tout n'est pas utile...
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 16h13   #10
Invité régulier
 
Homme
Développeur Web
Inscription : juin 2010
Messages : 28
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juin 2010
Messages : 28
Points : 8
Points : 8
Merci de ton retour
waxman est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h32.


 
 
 
 
Partenaires

Hébergement Web