alternative a __autoload() ?

alternative a __autoload() ? - PHP - Programmation

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:  
 

Code :
  1. class WSCall
  2. {
  3.         public static function create($_callClass, array $_callParams= array())
  4. {
  5.  $_callClass = __CLASS__.'Call_'.$_callClass;
  6.  if (!class_exists($_callClass) && file_exists(dirname(__FILE__).'/Calls/'.$_callClass.'.php'))
  7.   require_once dirname(__FILE__).'/Calls/'.$_callClass.'.php';
  8.  if (class_exists($_callClass))
  9.  {
  10.   $callObject = new $_callClass($_callParams);
  11.  }
  12.  else
  13.  {
  14.   throw new EezyMarketEbayWSAPIException("La classe  <strong>$_callClass</strong> est introuvable" );
  15.  }
  16.  return $callObject;
  17. }
  18. }


 
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.

Reply

Marsh Posté le 13-01-2009 à 18:18:39   

Reply

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.
Ca eviterait ainsi de charger toutes les classes d'appels pour 1 seule utilisée


C'est ce que fait __autoload non ?

Code :
  1. function __autoload($class) {
  2.    $file = "includes/$class.class.php"; // un format au hasard
  3.    require_once($file);
  4. }


Reply

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' "?

Reply

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 ?

Reply

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 :
  1. !class_exists($_callClass, false)

Reply

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

Reply

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');

Reply

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed