Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
502 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  alternative a __autoload() ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

alternative a __autoload() ?

n°1837536
jokaritaff
Posté le 13-01-2009 à 18:18:39  profilanswer
 

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.

mood
Publicité
Posté le 13-01-2009 à 18:18:39  profilanswer
 

n°1837540
Profil sup​primé
Posté le 13-01-2009 à 18:28:23  answer
 

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


n°1837547
omega2
Posté le 13-01-2009 à 18:33:58  profilanswer
 

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

n°1837550
Profil sup​primé
Posté le 13-01-2009 à 18:37:23  answer
 

un problème de casse dans le nom de la classe qui est ignoré par require_once ?

n°1837688
FlorentG
Unité de Masse
Posté le 14-01-2009 à 09:23:46  profilanswer
 

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)

n°1837704
jokaritaff
Posté le 14-01-2009 à 10:20:14  profilanswer
 

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

n°1837965
pierrot974
Posté le 14-01-2009 à 18:23:53  profilanswer
 

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

n°1837969
jokaritaff
Posté le 14-01-2009 à 18:30:11  profilanswer
 

ben __autoload() est utile comme gestionnaire unique.
mais si tu veux un autoload par composants, la t'es obligé de surcharger.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  alternative a __autoload() ?

 

Sujets relatifs
Une alternative au switch case, le dictionnaire!![Spip]Manipuler le squelette alternative
Y a t-il une alternative au $ENV{'HTTP_REFERER'} ?Une alternative a filesize?
Impossible de colorier le composant SSTab! Y'a t-il une alternative ?y a t il une alternative à htmlentities ?
Alternative au générateur de nombres aléatoires ExcelAlternative aux frames sans langages dynamiques ?
alternative à des fonctions javascriptalternative à exit()
Plus de sujets relatifs à : alternative a __autoload() ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR