Bonjour, et bonne année à tous.
Parmi mes bonnes résolutions pour 2101, essayer d'apprendre à programmer de façon un peu plus pro.
J'utilise PHP, et me suis tourné vers Zend Framework, histoire de me pousser un peu du côté des langages à objets.
Pour cela, je viens d'acheter "Zend Framework, bien programmer en PHP".
Ce qui signifie :
1 - que je ne connais pas encore Zend Framework.
2 - que j'aimerais apprendre à l'utiliser grâce à ce bouquin.
3 - que je m'attends à trouver dans ce bouquin l'essentiel des informations utiles pour progresser. (Et non tout savoir d'avance).
Dès la page 32, problème ! Les exemples sont écrits pour une version obsolète de Zend Framework (1.6.2), alors que la version courante est la 1.9.6.
Or, depuis la version 1.8.x, il y a eu de gros changements avec l'autoload.
Pour remplacer le code déprécié suivant :
Code :
- include 'Zend/Loader.php';
- Zend_Loader::loadClass('Zend_View');
- Zend_Loader::registerAutoload();
|
on peut (entre autres) mettre ceci :
Code :
- require_once 'Zend/Loader/Autoloader.php';
- Zend_Loader_Autoloader::autoload('Zend_Loader_Autoloader_Resource');
|
J'ai trouvé deux ou trois variantes sur Internet, mais bon, celle-ci a l'air de marcher.
Dans l'exemple de la page 32, j'ai un soucis. On décide d'utiliser un loader personnel, qui se trouve sous un répertoire "My", au lieu du loader standard de la librairie Zend. Voici le code :
Code :
- // Inclusion de Zend_Loader
- include 'Zend/Loader.php';
- // Chargement avec vérification
- if (!Zend_Loader::isReadable('Zend/View.php')) {
- throw new Exception('Unable to use Zend_View.');
- }
- Zend_Loader::loadClass('Zend_View');
- var_dump(new Zend_View());
- // Utilisation de la fonction pour l'autochargement
- Zend_Loader::registerAutoload('My_Loader');
- // Utilisation de Zend_Date avec auto-chargement implicite
- var_dump(new Zend_Date());
|
On part du principe que le répertoire "My" se trouve dans le même répertoire que l'exemple php à corriger (c'est là que l'auteur du bouquin l'a mis, en oubliant juste de le préciser). Sous My, il y a la classe personnalisée Loader.php, celle que l'on veut utilser dans l'instruction Zend_Loader::registerAutoload('My_Loader');
Le problème, donc, c'est que je ne suis pas du tout certain d'avoir su écrire l'équivalent pour Zend Framework >= 1.8.
J'ai essayé ceci :
Code :
- // Inclusion de Zend_Loader
- require_once 'Zend/Loader/Autoloader.php';
- $autoloader = Zend_Loader_Autoloader::getInstance();
- $autoloader->registerNamespace('My_');
- // Chargement avec vérification
- if (!Zend_Loader::isReadable('Zend/View.php')) {
- throw new Exception('Unable to use Zend_View.');
- }
- Zend_Loader::loadClass('Zend_View');
- var_dump(new Zend_View());
- // Utilisation de la fonction pour l'autochargement
- Zend_Loader_Autoloader::autoload('My_Loader');
- // Utilisation de Zend_Date avec auto-chargement implicite
- var_dump(new Zend_Date());
|
Et voici le code de loader.php, situé sous My :
Code :
- class My_Loader
- {
- /**
- * Une fonction utilisateur pour le chargement des classes
- *
- * @param string $class
- */
- public static function autoload($class)
- {
- include(strtr($class, '_', '/') . '.php');
- }
- }
|
J'obtiens un résultat,mais j'ignore si c'est My_Loader qui est utilisé ou le Loader standard, car si je supprime la ligne include (qui fait râler ZendFramework pour Eclipse [unsafe use of variable in call include()/require()], ça marche aussi. Je suppose que le loader standard prend le relais, mais du coup j'ignore si j'ai bien adapté le programme initial.
Votre avis ?