Accès à des attributs private depuis une méthode

Eléphanteau du PHP | 47 Messages

31 août 2009, 11:09

Bonjour,

Je m'explique, j'ai mit en place un système de configuration du cœur du site (une grosse class qui gère tout le site), je voulais suivre le concept d'encapsulation donc j'ai crée un class configuration dans laquelle j'ai mit tout mes attributs en private, cependant je me voyais mal faire autant de méthode qu'il y d'attributs.

J'ai donc fait cette méthode dans la class qui contient les attributs private :
public function conf_coeur($variable, $clee='')
	{
		if (empty($clee))
		{
			return (property_exists($this, $variable)) ? $this->$variable : FALSE;
		}
		else
		{
			if (property_exists($this, $variable))
			$return = $this->$variable;
			else
			return FALSE;
			
			return (array_key_exists($clee, $return)) ? $return[$clee] : FALSE;
		}
	}
Je suis sous PHP 5.2 (ubuntu), je crois que des fonctions doivent être changer pour PHP 5.3.

Ce-ci marche très bien si l'attribut est une valeur bool, int et string. Mais cafouille complètement si c'est un array. Si je fais un var_dump j'ai bien ce que j'attendais (l'array). Mais dès que j'utilise conf_coeur sur un attribut qui contient un array j'ai de gros problème avec le type de variable. Des fois quand je demande le contenu de l'array (avec le second argument de ma fonction) il me sort un type de variable array, mais si je fait un var_dump il me dis que c'est une valeur string.

Quand je fait count sur conf_coeur('attribut') il me retourne soit NULL soit FALSE. (attribut étant un array bien entendu).
Et donc ma boucle qui se trouve en dessous ne s'exécute jamais.

Cependant si je fais un var_dump sur conf_coeur('attribut') alors là tout fonctionne normalement.


A plus rien y comprendre, c'est un bug ? Une mauvaise utilisation de ma part ?

Je me remet à vous parce que je ne comprend pas du tout.

Merci d'avance

Eléphant du PHP | 199 Messages

31 août 2009, 11:17

Les getters et les setters ne sont-ils pas utiliser pour avoir accès aux attributs privés des classes?

ViPHP
ViPHP | 928 Messages

31 août 2009, 11:26

Déjà pour moi il y a un petit problème de conception. Si tu as un grand nombre de propriétés pour gérer ta configuration, tu auras peut être plutôt du passer par un tableau, ce qui t'aurait permis de plus facilement accéder à tes données et de t'éviter trois kilomètre de déclaration de propriétés. Ensuite si tu les mets en privé, le problème de ta méthode (ou bien des setters / getters) est que tu peux accéder à toutes tes propriétés, à quoi bon les rendre privées ?

Quoi qu'il en soit il existe une façon plus simple de gérer ton problème : http://www.phpfrance.com/tutoriaux/inde ... c-php-5#a4

Eléphanteau du PHP | 47 Messages

31 août 2009, 12:16

Merci de vos réponses,

Mettre en tableau de change rien du côter de l'accès. Enfaite la déclaration des attributs se fait dans la class et la définition des attribut se fait dans un fichier externe qui doit être accessible à des personnes qui ne connaissent pas mon code. Celà permet donc de ne pas provoquer d'erreur si la personne oublie de définir une configuration.

J'avais complètement oublié la fameuse méthode magique __get.

Par contre cette méthode sera appeler dès que je voudrais accéder à un attribut inexistant et n'importe ou dans la class coeur ? Sachant que la class coeur est en réalité faite de 16 class liés (extends).

ça ne me gène pas si c'est le cas mais je pourrais pas utiliser un second __get dans la class coeur ce qui peux m'être utile, on sais jamais.


En tout cas merci :D

Eléphanteau du PHP | 47 Messages

31 août 2009, 14:29

J'ai utiliser la méthode que vous m'avez conseillez, ça résous le problème des types de variables, mais pas pour le count.

Il est possible de compter un array dans un attribut ? Il est impossible de compter un array renvoyer depuis une fonction ? (faut-il une void et non l'array).

Je suis perdu, surtout quand je met var_dump sur le count ça fonctionne très bien. Il est bizarre ce var_dump quand même :shock:

Merci d'avance

EDIT : C'est une erreur de ma part je ne voyais pas que ça marchais mais en faite ça marchait bien ^^, j'ai quand même rien perdu j'ai résolu un autre problème grâce à vous.

Merci à vous, le prochaine fois je verrais plus gaffe ^^