Page 1 sur 2

Les variables et la POO

Posté : 26 juin 2011, 12:52
par rimie
bonjour,

j'ai fait une page de teste, avec 5 parties:
haut: la banniere,
bas: les droits,
droite: menu droit,
gauche: menu gauche,
centre: pour afficher les pages.

alors j'ai fait une class pour verifier les fichiers, voir ce sujet: php-oriente-objet/une-class-des-fichiers-t259246.html

quand j'appelle a ma classe et je verifie avec la fonction "checkAndIncludeFile", les variables qui suit cette ligne ne sont pas prises en consideration, et donne une erreur:
Notice: Undefined variable: paths in accueil.php on line 8
la ligne 8:
welcome<br />
<textarea cols="30" rows="5">text</textarea>
<span>Afficher et cacher ce texte</span>
<br />
<input type="text" size="20" maxlength="50" />
<br />
<?php
echo '<img src="'.$paths.'plus.png"><br>';
?>
mais si je les appels avant d'appeler la class ca marche, voila le code complet de la class:
<?php

class File_Check {
       
        private $fileName;
   
        public function __construct()
                        {
                        	
                        }
                   
        // file_exists
        public function fileExists($fileName)
        	{
            	$this->fileName = $fileName;
                        	
                if(file_exists($this->fileName))
                {
                	return TRUE;
                }
                else
                {
                	return FALSE;
                }
			}
              
		
		// is_file
        public function isFile($fileName)
        	{
         		$this->fileName = $fileName;
                if(is_file($this->fileName))
                {
	                return TRUE;
                }
                else
                {
                	return FALSE;
                }
           }
           
           
		// in_array
		public function fileArray($fileName)
  			{
 	        	$this->fileName = $fileName;
           		$AllowedExt = array('php');
				$ext = pathinfo($this->fileName, PATHINFO_EXTENSION);

				if(in_array($ext,$AllowedExt))
				{
					return TRUE;
				}
				else
				{
					return FALSE;
				}
        	}
                
            
		// regex    
         public function fileRegex($fileName)
         	{
  		    	$this->fileName = $fileName;
                if(preg_match('#[\w_]#' ,$this->fileName))
				{
					return TRUE;
				}
				else
				{
					return FALSE;
				}
				
				}
            
		// verifier le gros    
		public function checkAndIncludeFile($fileName)
			{
				if (
				($this->fileExists($fileName)) 
				AND  
				($this->isFile($fileName)) 
				AND 
				($this->fileArray($fileName)) 
				AND 
				($this->fileRegex($fileName)) == true) 
					{
						require_once $this->fileName;
					}
					else
					{
						include 'page404.php';
					}
			}

}
?>
 
sachant que si je separe le code et je le mets dans une fonction, ca marche, probleme je pense d'instanciation de la class

merci a vous

Re: Les variables et la POO

Posté : 26 juin 2011, 20:49
par xTG
C'est un "problème"(cela n'en est pas un quand on le sait et qu'on code en conséquence) de visibilité qui est connu de la POO.
Lorsque tu utilises un objet il est complètement séparé du reste.
Si tu veux réutiliser cette variable il faut donc soit la définir en tant que global dans la fonction de ta class, soit lui passer en paramètre.

Re: Les variables et la POO

Posté : 27 juin 2011, 02:47
par devlop78
Oui ... Je ne suis pas sûr d'avoir tout compris, mais si tu fais un include dans une fonction ou une méthode, les variables dans le fichiers inclus auront une portée locale à la fonction ou méthode.

A priori, c'est un problème de méthodologie. Le mélange Objet/Procédural ne donne pas les meilleurs résultats :p

Re: Les variables et la POO

Posté : 27 juin 2011, 03:32
par rimie
alors en gros voila ce que je fais, comme organisation de code:

+ une page index.php qui inclus:
++ un fichie des variables (message erreur, des chemins de fichiers, autres variables...),
++ un fichier des class (toutes les class que j'utilise)

alors je fais mon code php, j'apelle a mes variables, apres si j'appelle a un fichier class et je demande apres une variable ca se perd ici

dans ce cas qu'est ce que vous me conseillez

Re: Les variables et la POO

Posté : 27 juin 2011, 05:25
par devlop78
Regarde du côté du design pattern Registry ... Une solution objet ;)

Re: Les variables et la POO

Posté : 27 juin 2011, 06:45
par rimie
Regarde du côté du design pattern Registry ... Une solution objet ;)
est ce que vous pouvez me donner un exemple, j'ai cherche sur google et ca me parait un peu complique :cry:

Re: Les variables et la POO

Posté : 28 juin 2011, 03:50
par devlop78
En 17 seconde de recherche,

http://www.croes.org/gerald/blog/les-re ... n-php/361/

Je ne l'ai jamais lu, mais il m'a l'air vraiment pas mal, il propose un Registre Singleton et un registre statique.

Perso, je te conseille le statique dans un premier temps, mais l'utilisation de Singleton te manquera vite pour tes autres classes.

En gros :

Classe Registry
Methode Enregistrer ($lavariable)
Methode Obtenir ($lavariable)

Donc,
Registry::set('rimie','Une personne');

echo Registry::get('rimie'); // affiche "Une personne"
Le résultat par rapport à $GLOBALS ou à l'utilisation de global est plutot le même, mais pas la démarche.

Re: Les variables et la POO

Posté : 28 juin 2011, 04:13
par rimie
j'ai lu le meme article, ce qui manquait c'est l'exemple

Re: Les variables et la POO

Posté : 28 juin 2011, 06:34
par epommate2
Bon, désolé, mais ton code pique trop les yeux....
class FileCheck {
	
	public function checkExtension($filePath,array $allowedExtension) {
		$ext = pathinfo($filePath, PATHINFO_EXTENSION);
		return in_array($ext,$allowedExtension);
	}
	
	public function isValidFileName($filePath){
		$fileName = basename($filePath);
		return preg_match('#^[\w_]$#' ,$fileName);
	}
	
	public function checkAndIncludeFile($filePath) {
		if ($this->isFileIncludable($filePath)){
			 require_once($filePath);
		} else {
			  include('page404.php');
		}
	}
	       
	private function isFileIncludable($filePath){
		if (! file_exists($filePath)){
			return false;
		}
		if ( ! is_file($filePath)){
			return false;
		}
		if ( ! $this->checkExtension($filePath,array('php'))){
			return false;
		}
		if ( ! $this->isValidFileName($filePath)){
			return false;
		}
		return true;
	}
}
Voilà les différents points qui ne vont pas dans ton code initial :
- Constructeur vide inutile
- données membre fileName jamais utilisé en écriture
- CamelCase et Camel_Case
- Commentaire inutile et abscon (qui tu traites de gros ?)
- L'opérateur AND est un peu différent de &&
- Nom de méthode bizarre : fileArray => checkExtension
- JAMAIS DE : if (truc) return true; else return false; => return truc;
- Attention, tu confond le nom du fichier avec son emplacement
- Tu redéfinis les fonctions de bases
- Ton expression régulière n'est pas correcte : elle valide que le fichier possède bien une lettre ....

Re: Les variables et la POO

Posté : 28 juin 2011, 07:02
par rimie
epommate2: je vais revenir sur votre code.

develop78: quelques chose comme:
<?php
class Registry
{
   private static $variable;
 
   public static function get()
   {
      return self::$variable;
   }
 
   public static function set($variable, $name)
   {
      self::$variable = $name;
   }
}
 
Registry::set('rimie','Une personne');

echo Registry::get('rimie'); // affiche "Une personne"

?>
dans mon cas:
mes_class.php // le fichier des class y compris des variables
/*
Registry::set('var_chemin','definir_chemin_vers_les_images'); // la variable et puis son chemin
*/

// comment puis je faire le set ici
<img src="$chemin_vers_les_images/image.png"> // afficher une image a titre d'exemple, c'est la ou je perds ma variables "$chemin_vers_les_images", donc je fais comme ca


Re: Les variables et la POO

Posté : 29 juin 2011, 02:24
par devlop78
Non pour la classe.

Le registre doit permettre d'enregistrer et lire plusieurs variables.

public static function get()
{
return self::$variable;
}

public static function set($variable, $name)
{
self::$variable = $name;
}
Ici, tu n'en renvoies qu'une par l'accesseur, et tu n'en modifie qu'une par le mutateur. Le registre doit au moins comporter un mutateur pour modifier une variable de nom x avec une valeur y, et accéder à une variable de nom x. Je te laisse chercher comment tu pourrais t'y prendre, tout en gardant l'encapsulation. Tu peux aussi partir du principe que, pour coder le plus proprement possible, tu pars du principe que toute variable utilisée est forcément déjà existante (ce qui réduit le temps de débogage), en lancant une exception à partir de l'accesseur sur le nom de la variable n'est pas déjà présente. Il peut alors être intéressant de proposer une méthode qui permet de vérifier la présence ou l'absence de la valeur.

Le registre répond à un besoin, oui, mais il ne doit pas être un fourre-tout. Il prend tout son sens dans un développement fortement objet et où les responsabilités sont bien déterminées. D'ailleurs, j'y mets le moins de choses possible, dans le sens où je réfléchis avant si ce que je souhaite stocker n'a pas sa place ailleurs (en propriété statique dans une classe, etc).
<img src="$chemin_vers_les_images/image.png">
Non. $chemin_vers_les_images n'existe pas. Il faut appeler le registre : Registry::get('chemin_vers_les_images');

Re: Les variables et la POO

Posté : 30 juin 2011, 05:19
par rimie
j'ai pas pu le resoudre avec plusieurs variables

Re: Les variables et la POO

Posté : 01 juil. 2011, 04:06
par rimie
y a t il une autre methode autre que Registry Pattern??

Re: Les variables et la POO

Posté : 01 juil. 2011, 14:19
par devlop78
Non. Tu fuis le problème, si je peux me permettre ...

Re: Les variables et la POO

Posté : 01 juil. 2011, 22:50
par rimie
Non. Tu fuis le problème, si je peux me permettre ...
Si j'ai pas compris la solution je dois chercher une autre