Précédent   Forum du club des développeurs et IT Pro > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 27/09/2012, 02h45   #1
ascito
Membre chevronné
 
Inscription : juin 2007
Messages : 567
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 567
Points : 703
Points : 703
Par défaut Class Loader => simple register directory

je voudrais avoir votre avis, sur le code qui va suivre,
vous pouvez tester PHP 5.2, ca fonctionne, mais j'ai besoin d'avis sur la mise en forme du code. Il y a peu être des choses plus simple, et je ne suis pas au courant.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
 
<?php
class Loader{ 
 
	protected static $_directory;
	private static $_erreurs;
 
	public function register($name,$dir,$ext='php'){
 
		if(isset($this->directory->$name)){self::messageErreur("Name $name already exist in Loader::directory"); return;}
 
 		$this->directory->$name->root      = $dir;
		$this->directory->$name->extention = $ext;
		self::$_directory = $this ;
 		spl_autoload_register(array($this,'__autoload'),true);
 
		return $this->directory->$name;
 	}
 
	public function unregister($name){
 		unset($this->directory->$name); 
		return $this;
 	}
 
	private function __call($class,$null=null)
	{
		try{
 			$erreur    =  true;
 			foreach ($this->directory  as $property ) { 
				$ext       = $property->extention;
				$path      = self::getPath($class);
				$file      = $property->root.$path.'/'.$class.'.'.$ext;
				if(file_exists($file)){
					require_once $file;
					$erreur = false;
				} 
			}
			if($erreur){throw new Exception("File $class not found , in Loader::directory ");}
		}
		catch (Exception $e) {
			self::messageErreur($e); 
		}
 	}
	public static function directory(){
		return self::$_directory;
	}
	public function autoload($path,$options=null){ 
 
		$pathTab=explode('::',$path);
		$class  = $pathTab[0] ;
		$method =isset($pathTab[1]) ? $pathTab[1] : null; 
		$this->__call($class); 
 
		try{
			if(!null == $class && !null == $method && class_exists($class) && method_exists($class,$method)){
				$class = new $class;
				$class->$method($options);
			}else{
				throw new Exception("Class $class or method $method no found , call file path : $path ");
			}		
		}
		catch (Exception $e) {
			self::messageErreur($e); 
		}
 	}
 
	private static function getPath($path){ 
		return str_replace('_','/',$path);
	}
 
	public static function messageErreur($msg = ''){
		self::$_erreurs[] = $msg ;
		if (!defined('SHOW_MESSAGE_ERREUR') || SHOW_MESSAGE_ERREUR == 'SHOW_MESSAGE_ERREUR' || SHOW_MESSAGE_ERREUR === true ){
			try { 
			throw new Exception($msg);
			}
			catch (Exception $e) {
			echo "Message : ",  $e->getMessage(), "\n\r<br/><br/>";
			}
		}
	}
 
}
 
 
/*
  par exemple créer un repertoire dans /library/class/View/View.php
 
 
Class View{
 
	public function accueil($string){
		echo $string;
	}
}
*/
 
define('__DIR__' , dirname(__FILE__));
 
$loader = new Loader; 
 
$loader->register('library',__DIR__.'/library/class/'     ,'php');  
$loader->register('public' ,__DIR__.'/public/'      ,'php'); 
$loader->register('route' ,__DIR__.'/'      ,'php');
 
print_r(Loader:: directory());
echo "<br/><br/>";
$loader->register('public',__DIR__.'/library/'     ,'php');
 
$loader->autoload('View::accueil',"c'est un test");
$loader->autoload('View::test',"c'est un test");
 
 
$view = new View; 	
 
 
?>
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2012, 09h43   #2
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 582
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 582
Points : 6 022
Points : 6 022
Envoyer un message via Skype™ à rawsrc
Salut,

ta fonction autoload() est très étrange !
L'autoloader doit juste gérer le mécanisme te permettant de trouver parmi tes répertoires le fichier content le code de la classe appelée et rien de plus.
En gros, il ne doit se limiter qu'à ne faire au final qu'un simple include ''; et renvoyer true ou false. Chez toi, il instancie la classe et exécute une méthode en lui passant des options !
Code :
1
2
$class = new $class;
$class->$method($options);
T'es sûr de ton approche parce que là, il me semble que ton Loader fait bien trop de choses.
__________________
# 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 28/09/2012, 03h55   #3
ascito
Membre chevronné
 
Inscription : juin 2007
Messages : 567
Détails du profil
Informations forums :
Inscription : juin 2007
Messages : 567
Points : 703
Points : 703
Alors, pour le coup je peux te répondre ;

j'ai prévu la function register pour alimenter la liste des chemins, et la fonction autoload pour carément taper dans le pratique, pour gagner du temps, accessible , mais je ne suis pas si sur de mes appellations, ni du découpage...


a relire, il faut que je renomme la fonction autoload;


merci a toi, et au personnes qui me permettrons d'affiner mon script.
__________________
Conception / Dev
ascito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2012, 08h50   #4
rawsrc
Modérateur
 
Avatar de rawsrc
 
Homme Martin
Dev indep
Inscription : mars 2004
Messages : 2 582
Détails du profil
Informations personnelles :
Nom : Homme Martin
Âge : 36
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Dev indep

Informations forums :
Inscription : mars 2004
Messages : 2 582
Points : 6 022
Points : 6 022
Envoyer un message via Skype™ à rawsrc
Citation:
Envoyé par ascito Voir le message
j'ai prévu la function register pour alimenter la liste des chemins
Jusque là pas de problème,
Citation:
Envoyé par ascito Voir le message
et la fonction autoload pour carément taper dans le pratique, pour gagner du temps, accessible
J'ai pas tout compris.
Pourrais-tu expliquer le but de cette classe, stp.
__________________
# 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
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 17h04.


 
 
 
 
Partenaires

Hébergement Web