alternative a __autoload() ? - PHP - Programmation
Marsh Posté le 13-01-2009 à 18:28:23
jokaritaff a écrit : [...] et j'aimerais que la fabrique d'objets de mon composant charge le fichier en fonction du nom de l'appel. |
C'est ce que fait __autoload non ?
Code :
|
Marsh Posté le 13-01-2009 à 18:33:58
Dans ce genre de cas, trace un peu ce que tu fais.
Que vaut $_callClass après que t'ai changé sa valeur?
Que vaut "dirname(__FILE__).'/Calls/'.$_callClass.'.php' "?
Marsh Posté le 13-01-2009 à 18:37:23
un problème de casse dans le nom de la classe qui est ignoré par require_once ?
Marsh Posté le 14-01-2009 à 09:23:46
Si t'as déjà un autoload quelque part, attention à l'appel à class_exists. Par défaut il appelle autoload si la classe n'est pas existante, il faut filer en deuxième paramètre false pour empêcher ça :
Code : |
Marsh Posté le 14-01-2009 à 10:20:14
je viens de trouver d'ou vient l'erreur
en fait dans ma fabrique d'objet je fais
WSCall::create(WsCall::GET_ACCOUNT, WSCall_GetAccount::TYPE_CLOSED);
en clair je demande a la fabrique de me créer un objet WSCall_GetAccount et lui envoie aun paramètre TYPE_CLOSED
L'erreur vient de la : je peux pas utiliser TYPE_CLOSED puisqu'il est membre statique de la classe WSCall_GetAccount qui n'est pas encore chargée au moment de l'appel la méthode a create().
merci pour votre aide.
par ailleurs je me demande si j'utilise bien le pattern de fabrique...
Marsh Posté le 14-01-2009 à 18:23:53
Moi j'utilise le spl_autoload_register, c'est assez pratique.
http://fr.php.net/manual/fr/function.spl-autoload.php
// my Autoload function
function autoload($class_name)
{
if (file_exists('include/' . $class_name . '.class.php'))
@ include ('include/' . $class_name . '.class.php');
}
// AUTOLOADER - Set up autoloading.
spl_autoload_register('autoload');
Marsh Posté le 14-01-2009 à 18:30:11
ben __autoload() est utile comme gestionnaire unique.
mais si tu veux un autoload par composants, la t'es obligé de surcharger.
Marsh Posté le 13-01-2009 à 18:18:39
bonjour
j'aimerais charger des classes a la volée sans passer par __autoload()
par exemple j'ai un composant pour appeler un web service
chaque appel est géré par une sous-classe
et j'aimerais que la fabrique d'objets de mon composant charge le fichier en fonction du nom de l'appel.
Ca eviterait ainsi de charger toutes les classes d'appels pour 1 seule utilisée
exemple qui marche pas:
le require_once n'a pas l'air de fonctionner
car le code qui appelle WSCall:create('GetAccount') genere un message d'erreur : "class WSCall_GetAccount not found"
et pourtant le chemin est bon (j'ai verifié en l'éditant avec vi)
alors que si j'utilise ma méthode qui fait des require_once de tous les fichiers, la ca marche.