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 28/04/2011, 21h56   #1
Membre du Club
 
Inscription : août 2005
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 171
Points : 40
Points : 40
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 :
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 :
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
ChriGoLioNaDor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 23h11   #2
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
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).
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/04/2011, 23h56   #3
Membre du Club
 
Inscription : août 2005
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 171
Points : 40
Points : 40
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
ChriGoLioNaDor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 09h29   #4
Membre Expert
 
Homme
Inscription : janvier 2004
Messages : 1 238
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : janvier 2004
Messages : 1 238
Points : 1 421
Points : 1 421
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 :
1
2
$aClass = new ReflectionClass($className);
$aObject = $aClass->newInstance();
http://php.net/manual/fr/reflectionc...ewinstance.php
__________________
PHP :
Regle n°1 : mysql_query(...), mysql_connect(...) et mysq_select_db(...) doivent EN DEBUG etre suivies de or die(mysql_error()); (mais jamais en production)
Regle n°2 : Mieux encore : mysql_query($requete) or die("$requete<br/>".mysql_error());
Regle n°3 : echo '<pre>';var_dump($var);echo '</pre>'; affiche le contenu et le type d'une variable.
Publiez vos textes de fantasy et de science-fiction sur http://www.cercledefaeries.com/concours/
Fladnag est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 13h10   #5
Membre du Club
 
Inscription : août 2005
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 171
Points : 40
Points : 40
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 :
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"
ChriGoLioNaDor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 13h51   #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
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.
rawsrc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/04/2011, 14h43   #7
Membre du Club
 
Inscription : août 2005
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 171
Points : 40
Points : 40
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
ChriGoLioNaDor 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 08h43.


 
 
 
 
Partenaires

Hébergement Web