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 :

Question concernant l'attribut static


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut Question concernant l'attribut static
    Bonjour,

    Pour gérer le traitement et l'affichage de mes pages, j'utilise le code suivant :
    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
    if(class_exists($this->classe))
    {
    	$maClasse = new $this->classe();
    	if(method_exists($maClasse, $this->methode))
    	{
    		$maClasse->{$this->methode}();
    	}
    	else
    	{
    		//affichage erreur
    	}
    }
    else
    {
    	//affichage erreur
    }
    Il me semblerait plus lisible de remplacer ce code en utilisant les fonctions php is_callable et call_user_func :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(is_callable(array($this->classe, $this->methode)))
    {
    	call_user_func(array($this->classe, $this->methode));
    }
    else
    {
    	//affichage erreur
    }
    Cependant, le fait d'utiliser call_user_func n'instancie pas ma classe. Ce n'est pas vraiment gênant puisque instancier ma classe ne m'apporte rien de plus (puisque je n'ai jamais plusieurs instances de ces classes là au sein de la même page), mais par contre cela implique de passer toutes les méthodes et attributs de mes classes en static afin de pouvoir y accéder dans la méthode appelée par call_user_func...

    D'où ma question : d'après vous, cela est-il judicieux de passer mes méthodes et attributs en static (en sachant de que toutes façons je n'aurai jamais plusieurs instances de ces classes, et que de ce fait ça ne me changera rien que mes méthodes et attributs soient ou non static), ou est-ce là une mauvaise idée?

    Merci d'avance pour l'attention que vous porterez à ma question

  2. #2
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    Citation Envoyé par ChriGoLioNaDor Voir le message
    (puisque je n'ai jamais plusieurs instances de ces classes là au sein de la même page)
    J'ai du mal à comprendre comment tu ne pourrais pas avoir plusieurs instances d'une classe avec rendu graphique au sein d'une même page . Mais bon admettons. Dans ce cas, il t'est tout à fait possible de passer tes méthodes au sein des classes graphiques en static. Plus aucune instance à gérer et accès direct aux méthodes.

    Généralement, une page est découpée en blocs graphiques qui peuvent être présents en plusieurs "exemplaires" sur la même page avec chacun un paramétrage différent. D'où l'utilité de conserver tout les blocs en mode dynamique (instances de classe).

  3. #3
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Voici une explication plus détaillée du fonctionnement de mon site :

    - Mes urls sont du genre index.php?classe=toto&methode=tata
    - Mon fichier index.php instancie la méthode index() de ma classe Page
    - index() va, entre autre, vérifier si la classe Toto et la méthode tata existent et si oui appelle cette dernière (sinon il redirige l'utilisateur sur une page d'erreur)
    - tata() effectue le traitement (requêtes SQL, traitement de formulaires etc), puis renseigne une variable indiquant le chemin vers le fichier gérant l'affichage du contenu central, et enfin inclue le fichier de template.php
    - finalement, le template gère l'affichage du tout en affichant le header, les menus (un fichier php séparé), et le contenu central grâce à la variable définie plus haut. En effet, comme le fichier template est appelé dans ma méthode tata(), j'ai accès à toutes les variables définies dans cette méthode, à l'intérieur de mon fichier template.php

    Je n'ai donc jamais plusieurs instances de Page ou de Toto. J'appelle plusieurs classes, mais une fois chacunes

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 249
    Par défaut
    j'espere que tu ne laisse pas de méthode "debug" ou "afficherVariablesLocales" parce que sinon ce n'est pas tres sécurisé...

    Prendre un parametre dans l'URL et appeler la méthode correspondante sans la valider me parait dangereux.

    Sinon, si tu veux instancier ta classe dynamiquement, tu peux essayer (PHP5) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $aClass = new ReflectionClass($className);
    $aObject = $aClass->newInstance();
    http://php.net/manual/fr/reflectionc...ewinstance.php

  5. #5
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    En effet, il y a certains contrôles sur les paramètres de l'url : par exemple, ils ne peuvent contenir que des lettres et des chiffres ainsi que le tiret bas. D'autre part, il y a aussi une notion de permissions : n'importe qui ne peux pas accéder à n'importe quelle classe, puisqu'il doit avoir les permissions pour le faire (chaque utilisateur a ou non le droit d'appeler telle ou telle page).

    Je connais des méthodes pour me permettre d'instancier ma classe, la plus simple selon moi étant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(is_callable(array($this->classe, $this->méthode)))
    {
    	$module = new $this->classe();
    	$module->{$this->méthode}();
    }
    else
    {
    	// redirection vers page d'erreur
    }
    Je voudrais juste avoir un point de vue extérieur afin de savoir s'il est plus cohérent d'instancier ma classe, de ne pas le faire, ou si cela revient au même.
    En effet, j'ai lu à certains endroits qu'il était conseillé de mettre en static toutes les méthodes et attributs qu'on ne va pas instancier plusieurs fois (pour un soucis d'optimisation). Mais ça me semble un peu "simpliste"

  6. #6
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    L'utilisation du static est très utile et se justifie dans bien des situations.
    Les aficionados du tout dynamique (static == beurk) te diront que maintenant la mémoire n'est plus un problème et que tu peux quasiment instancier autant de classes que tu veux sans te heurter à un mur et puis les autres (dont je fais partie) te diront que l'utilisation du static à bon escient reflète un esprit d'organisation et de réflexion. Tu ne codes pas comme un goret sans trop y réfléchir. D'expérience, tu finiras par séparer ton code en deux : statique et dynamique (de temps en temps une classe dynamique auras une petite fonction statique mais sans plus).
    Bref, si tu as le temps roules sur le static, dans ce cas je te dis bon refactoring et soignes tes tests après une modif aussi importante.

  7. #7
    Membre confirmé
    Inscrit en
    Août 2005
    Messages
    177
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 177
    Par défaut
    Donc si je te comprends bien Xysyo, on peux résumer ça en "mettre tout en static, SAUF si j'ai une raison pour ne pas le faire (je compte instancier cette classe)". C'est bien ça?

    En tous cas merci pour vos réponses

Discussions similaires

  1. Questions concernant les attributs statiques
    Par Smashmaster dans le forum C++
    Réponses: 8
    Dernier message: 18/08/2014, 19h19
  2. [Toutes versions] Question concernant l'attribut ?
    Par Decapse dans le forum Access
    Réponses: 2
    Dernier message: 04/04/2011, 20h46
  3. [DOM] Question concernant dom et les attributs avec java
    Par zemzoum89 dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 30/09/2010, 20h18
  4. Question concernant les static
    Par vdumont dans le forum C++
    Réponses: 2
    Dernier message: 27/04/2006, 15h13
  5. Question concernant l'API "WaitforSingleObject
    Par Drooxy dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 29/03/2003, 07h26

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