Page 1 sur 1

[RESOLU] Demande de précisions sur la méthode __autoload()

Posté : 23 déc. 2008, 17:23
par niuxe
Salut tout le monde,

Je suis en train d'élaborer un objet. Dans mon objet, j'utilise un fichier de config externe que j'appelle par require_once(). De mon côté, j'ai débogué mon soucis en passant l'inclusion dans le constructeur. Toutefois, j'ai au départ utilisé la méthode magique __autoload() qui me parait adaptée à la situation . Et là, mon require ne passe pas :(. Les constantes que j'ai dans mon fichier de config me servent dans le constructeur. J'ai lu que __autoload() permet d'appeler des fichiers externes. Mais dans quels cas de figure ?

Merci de me donner quelques précisions sur le sujet.

++

Re: Demande de précisions sur la méthode __autoload()

Posté : 23 déc. 2008, 17:33
par Calimero
__autoload($x) est une fonction magique appelée par php lorsque tu instancies un objet de la classe $x ( $var = new $x; ). Elle t'évite d'avoir à écrire une longue liste de lignes include() correspondant aux fichiers contenant les classes auxquelles tu fais appel dans ton code.

Si tu stockes donc une classe par fichier, tu peux écrire une fonction __autoload() qui ira include() le bon fichier juste à temps pour que ton code appelant puisse utiliser la classe en question.

Si tu as une autre logique de rangement de tes classes, pas de problème, tu peux aussi écrire un __autoload() approprié à tes besoins.

En revanche __autoload() ne fait rien pour toi si tu n'es pas dans le cadre d'une instanciation d'objet.

Posté : 23 déc. 2008, 22:18
par niuxe
Je ne sais pas si j'ai bien saisie. Si je comprend bien :

imaginons que j'ai deux class :
* ma_class_mere avec la méthode ma_methode
* ma_class_fille

Dans ma_class_fille, je fais un _autoload() avec un include sur ma_class_mere.

Est ce que si je fais :
$x=new ma_class_fille();
$x->ma_methode();
Est ce juste ?
Là, je ne suis pas sur mon ordi, mais en rentrant je vais essayer cette manip.

Sinon, je te remercie infiniment de me donner un petit exemple plus concret pour que je puisse mieux comprendre cette méthode magique.

++ et bonne soirée à toi.

Posté : 23 déc. 2008, 23:48
par Calimero
Re,

Le manuel php étant plutôt clair sur ce sujet, je mets le lien qui va bien : http://www.php.net/manual/fr/language.oop5.autoload.php

quelques précisions par rapport à ce que tu as ajouté :

- __autoload() doit être une fonction isolée, pas une méthode de classe.
- tu n'appelles jamais __autoload(). C'est php qui l'appelle pour toi. Tu te contentes de la définir quelquepart dans ton code (par exemple dans ton config.php) et de mettre dedans le code utile que tu trouveras adapté, sachant que lors de l'appel de cette fonction, la fonction reçoit un nom de classe en paramètre, et php cherche à disposer de cette classe pour instancier un objet. C'est donc ta "dernière chance" d'inclure la définition de la classe pour php avant que l'instanciation de l'objet n'échoue avec une erreur.

Un exemple :


index.php
<?php function __autoload($classe) {
    require_once $classe . '.php';
}

// C'est ici que tout se passe ! 
// PHP va inclure les fichiers juste avant de réaliser l'instanciation de l'objet 
 //(qu'il n'aurait pas pu faire sans, puisque la classe est définie dans un autre fichier).
$x=new ma_class_fille();
$x->ma_methode();
ma_class_fille.php
<?php
Class ma_class_fille extends xxxx{
  public $a, $b, $c;

  function ma_methode(){
    echo "ok";
  }

  //...
}
xxxx.php
<?php Class xxxx{
  //...
}
Si tu as encore des doutes, prends cet exemple, retire la fonction __autoload(){ ... } et sers toi uniquement de require_once() pour faire fonctionner un code équivalent. L'intérêt est un peu mince avec deux classes, mais à partir de 10 ça devient tout de suite plus évident.

++ et bonne poo :)

Posté : 24 déc. 2008, 20:02
par niuxe
Salut Calimero,

j'ai très bien saisie ton explication. Un grand merci :merci: C'est une tuerie cette fonction magique. En effet, il suffit de changer la valeur de la variable pour appeler la class. C'est tout simplement génial.

++ et encore merci

ps : bon Noël à toi :)