Bonjour,
J'ai un soucis avec la fonction magique __autoload en PHP 5.3 dans un cas précis.
Je suis en local avec WampServer 2.0 (PHP 5.3.0) sous Windows Vista SP2.
Voici un exemple tout simple pour bien vous illustrer le problème :
/index.php :
/foo.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 <?php ini_set('display_errors', 1); /** * Se charge d'inclure le fichier correspondant à la classe appelée * si celle-ci n'existe pas encore */ function __autoload($class) { require_once dirname(__FILE__) . "/$class.class.php"; } /** * Fonction utilisée pour la gestion des erreurs */ function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext) { // la classe File n'existe pas lors du premier appel // c'est donc __autoload qui va se charger de l'inclure $file = new File( dirname(__FILE__) . '/log.txt' ); $file->write( date('d/m/Y H:i:s') . " -- $errno: $errstr [$errfile, line $errline]" ); } /** * Définit la fonction "my_error_handler" en tant que gestionnaire d'erreur */ set_error_handler('my_error_handler', -1); /** * Inclusion d'un fichier contenant une classe Foo * et l'instanciation d'un objet de celle-ci */ include 'foo.php'; ?>
/File.class.php
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 <?php class Foo {} // le passage en référence d'une valeur retournée par "new" // déclenche une erreur de type "Deprecated" en PHP 5.3 $foo =& new Foo(); ?>
Pour résumer vite fait ce qui se passe : une erreur "Deprecated" est lancée dans foo.php à cause du "=& new". La fonction "my_error_handler" est alors exécutée pour traiter l'erreur. Celle-ci fait appel à la classe File qui va donc être incluse grâce à la fonction __autoload. Mais justement le problème c'est que __autoload ne fait pas son travail et on se retrouve avec une erreur :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 <?php class File { private $_path; public function __construct($path) { $this->_path = realpath($path); } public function write($data) { $fp = fopen($this->_path, 'a'); return fwrite($fp, $data); } } ?>
À noter que si je déclenche un autre type d'erreur (par exemple : "trigger_error('test', E_USER_NOTICE);"), ça fonctionne parfaitement !
Code : Sélectionner tout - Visualiser dans une fenêtre à part Fatal error: Class 'File' not found in /foo.php on line 6
J'ai mis la classe Foo et l'instanciation de l'objet dans un fichier à part car si je les met directement dans index.php (à la place de "include 'foo.php';" donc), c'est le gestionnaire d'erreur de PHP qui est utilisé et non "my_error_handler". Là non plus, je n'ai pas d'explication...
Merci de vos réponses si vous voyez d'où vient le problème.
Partager