Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
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 06/01/2012, 13h52   #1
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
Par défaut Classe Manager et paramètres de fonction

Bonjour,
Je me suis inspiré d'une classe pêchée je ne sais plus trop bien où pour la modifier pour satisfaire mes besoins mais je cale pour les paramètres éventuellement passés à des constructeurs et/ou méthode...

Voici la classe principale
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
<?php
    /**
    * Class Manager Class.
    * 
    * 
    */
    
    class Manager {
        
        private $path, $debug ;
        private $classes = array();
        private $data    = array();
        
        /**
        * Initialize a Manager class
        * $data allowed :
        * folderName (string) - default : classes
        * loadAll (bool) - default : false
        * debug (bool) - default : false
        * 
        * @param array $data
        * @return void
        */
        
        public function __construct($data = array(), $debug=false) {
            $folderName = 'classes';
            $loadAll     = false;
			$this->data  = $data ;
            $this->debug = $debug ;
            
            if(is_array($this->data) && array_key_exists('folder_name',$data))
                $folderName = $this->data['folderName'];
            
            if(is_array($this->data) && array_key_exists('loadAll',$this->data))
                $loadAll = $this->data['loadAll'];
            
            if(is_array($this->data) && array_key_exists('debug',$this->data))
                $this->debug = $this->data['debug'];
            
            if(file_exists($folderName) && is_dir($folderName)) {
                $this->path = $folderName.'/';
            }
            
            if(!empty($this->path)) {
                $check = $this->MapAllClasses();
                if(!$check) die('Could not load classes or folder is empty from path : '.$this->path.'');
                
                if($this->debug) {
                    echo '<pre>';
                    print_r($this->classes);
                    echo '</pre>';
                }
                
                if($loadAll) {
                    foreach($this->classes AS $class) {
                        if(!class_exists($class['class'])) {
                          require_once($class['file']) ;   

==>58  $this->data[strtolower($class['class'])] = new $class['class']();
                        }
                    }
                    
                    if($this->debug) {
                        echo '<pre>';
                        print_r(get_declared_classes());
                        echo '</pre>';
                    }
                }    
            }
        }
        
        /**
        * Gets the class definition object (class name,method names,class path)
        * 
        * @param string $php_code
        * @param bool $onlypublic
        * @return array
        */
        function GetPHPClasses($php_code,$onlypublic = true) {
            $classes = array();
            $methods = array();
            
            $tokens = token_get_all($php_code);
            $count  = count($tokens);
            
            for ($i = 2; $i < $count; $i++) {
                if ($tokens[$i - 2][0] == T_CLASS && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) {
                    $class_name = $tokens[$i][1];
                    $methods[$class_name] = array();
                }
                
                if ($tokens[$i - 2][0] == T_FUNCTION && $tokens[$i - 1][0] == T_WHITESPACE && $tokens[$i][0] == T_STRING) {
                    if ($onlypublic) {
                        if (!in_array($tokens[$i-4][0],array(T_PROTECTED, T_PRIVATE))) {
                            $method_name = $tokens[$i][1];
                            $methods[$class_name][] = $method_name;
                        }
                    } else {
                        $method_name = $tokens[$i][1];
                        $methods[$class_name][] = $method_name;
                    }
                }
            }
            
            return $methods;
        }
        
        /**
        * Gets the class definition object from a file (class name,method names,class path)
        * 
        * @param string $filepath
        * @param bool $onlypublic
        * @return array
        */
        function FileGetPHPClasses($filepath,$onlypublic=true) {
            $php_code = file_get_contents($filepath);
            $classes  = $this->GetPHPClasses($php_code,$onlypublic);
            
            return $classes;
        }
        
        /**
        * Gets all the class definition objects
        * from the classes folder (class name,method names,class path)
        * 
        * @param string $path
        * @param bool $onlypublic
        * @return array
        */
        function MapAllClasses($path = '',$onlypublic = true) {
            $result = array();
            $return = false;
            
            if(empty($path))
                $path = $this->path;
            
            if(!empty($path)) {
                $dh = opendir($path);
                while (($file = readdir($dh)) !== false) {
                    if (substr($file,0,1) != ".") {
                        if (filetype($path.$file) == "file") {
                            $classes = $this->FileGetPHPClasses($path.$file,$onlypublic);
                            foreach($classes as $class=>$method) {
                                $result[] = array(
                                    "file" => $path.$file,
                                    "class" => $class,
                                    "method" => $method
                                );
                            }
                        } else {
                            $result = array_merge($result,$this->MapAllClasses($path.$file."/",$onlypublic));
                        }
                    }
                }
                closedir($dh);
                
                if(is_array($result) && count($result) > 0) {
                    $this->classes = $result;
                    $return = true;
                }
            }
            
            return $return;
        }
        
        /**
        * Initialize the wanted classes
        * 
        * @param string $name
        * @param bool $this->debug
        * @return void
        */
        public function startClass($name = '') {
            if(!empty($name) && !class_exists($name)) {
                foreach($this->classes AS $class) {
                    if(strcasecmp($class['class'],$name) == 0)
                    {
                        require_once($class['file']);
                        $this->data[strtolower($class['class'])] = new $class['class']();
                        
                        if($this->debug) {
                            echo '<pre>';
                            print_r(get_declared_classes());
                            echo '</pre>';
                        }
                        
                        break;
                    }
                }
            }
        }
        
        /**
        * Runs a specified method from a class
        * Example call className_MethodName(parameters)
        * 
        * @param string $function_name
        * @param bool $params
        * @return function
        */
        public function __call($function_name, $params) {
            $class_name = '';
            $function = '';
            
            if(strpos($function_name,"_")) {
                list($class_name,$function) = explode("_",$function_name);
                
                if (method_exists($this->data[$class_name], $function)) {
                    return call_user_func_array(array($this->data[$class_name], $function), $params);
                }    
            } else {
                foreach($this->data as $class) {
                    if (method_exists($class, $function_name)) {
                        return call_user_func_array(array($class, $function_name), $params);
                    }
                }
            }
        }
    }
?>
Mon fichier Index.php
Code :
1
2
3
4
5
6
7
8
9
10
<?php
    require_once($_SERVER['DOCUMENT_ROOT'] . '/class/Manager.class.php');
    
    $manager = new Manager( array('loadAll' => true ) );
	
    $manager->test();
    $manager->test2() ;
    $manager->test2_test("abc");
?>
Mon but est de rendre possible le passage de paramètres comme "abc" dans la méthode test de teste2 !

Voici la petite classe Test2
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
<?php
    class Test2 {
		private $p ;
 
        public function __construct($p) {
			if (isset($p))
				$this->p = $p ;
			else
				$this->p = NULL ;
		}
 
        public function test() {
			if (isset($this->p))
			    echo 'Test 2' . $this->p .'<br />';
			else
            	echo 'Test 2' . $this->p .'<br />';
        }
    }
?>
A l’exécution PHP,
A l'écran
et j'ai dans le log:

Code :
1
2
3
4
5
6
7
8
9
10
11
 
[06-Jan-2012 12:51:28] PHP Warning:  Missing argument 1 for Test2::__construct(), called in F:\WebSites\classmanager\class\Manager.class.php on line 58 
and defined in F:\WebSites\classmanager\classes\test2.php on line 5
 
[06-Jan-2012 12:51:28] PHP Stack trace:
 
[06-Jan-2012 12:51:28] PHP   1. {main}() F:\WebSites\classmanager\index.php:0
 
[06-Jan-2012 12:51:28] PHP   2. Manager->__construct() F:\WebSites\classmanager\index.php:4
 
[06-Jan-2012 12:51:28] PHP   3. Test2->__construct() F:\WebSites\classmanager\class\Manager.class.php:58
Voir ==> 58 dans le code de la classe "called in F:\WebSites\classmanager\class\Manager.class.php on line 58 "

Voilà mon problème simple et long/compliqué à la fois.

Merci @ceussss qui me sortiront de là en me montrant le bon chemin !
__________________
Esteban
ETVigan est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 14h18   #2
Expert Confirmé
 
Avatar de grunk
 
Homme Olivier
Développeur Web
Inscription : août 2003
Messages : 1 837
Détails du profil
Informations personnelles :
Nom : Homme Olivier
Âge : 27
Localisation : France, Côte d'Or (Bourgogne)

Informations professionnelles :
Activité : Développeur Web
Secteur : Industrie

Informations forums :
Inscription : août 2003
Messages : 1 837
Points : 3 318
Points : 3 318
As tu considéré l'utilisation d'un autoloader plutôt que cette classe ?

http://php.net/manual/fr/language.oop5.autoload.php
http://www.php.net/manual/fr/function.spl-autoload.php

Ça me semble correspondre à ton besoin et ça sera forcément plus performant.
grunk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/01/2012, 14h29   #3
Débutant
 
Avatar de ETVigan
 
Homme Esteban
Conseil - Consultant en systèmes d'information
Inscription : avril 2010
Messages : 632
Détails du profil
Informations personnelles :
Nom : Homme Esteban
Localisation : France, Gard (Languedoc Roussillon)

Informations professionnelles :
Activité : Conseil - Consultant en systèmes d'information
Secteur : Finance

Informations forums :
Inscription : avril 2010
Messages : 632
Points : 122
Points : 122
Envoyer un message via MSN à ETVigan Envoyer un message via Skype™ à ETVigan
Par défaut Un revenant

Salut Grunk, plaisir de t'entendre à nouveau...
Je vais étudier les documents que tu m'as mentionnée et on verra après !
Mais tu es souvent de bon conseil !

Merci
__________________
Esteban
ETVigan 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 04h19.


 
 
 
 
Partenaires

Hébergement Web