Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre émérite

    Inscrit en
    juin 2007
    Messages
    672
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 672
    Points : 825
    Points
    825

    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

  2. #2
    Modérateur
    Avatar de rawsrc
    Homme Profil pro Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 410
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 410
    Points : 7 762
    Points
    7 762

    Par défaut

    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...

  3. #3
    Membre émérite

    Inscrit en
    juin 2007
    Messages
    672
    Détails du profil
    Informations forums :
    Inscription : juin 2007
    Messages : 672
    Points : 825
    Points
    825

    Par défaut

    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

  4. #4
    Modérateur
    Avatar de rawsrc
    Homme Profil pro Martin
    Dev indep
    Inscrit en
    mars 2004
    Messages
    3 410
    Détails du profil
    Informations personnelles :
    Nom : Homme Martin
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 3 410
    Points : 7 762
    Points
    7 762

    Par défaut

    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...

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •