Sujet : import(...) and load()
Hey
,
Dans les anciennes versions de Hoa, la fonction import() (alias de la méthode Hoa_Framework::import()) avait une arité de 2. Le second paramètre permettait de charger le fichier directement. Ce dernier a disparu.
Petit rappel historique
Dans Hoa, on utilise la fonction import() pour importer des paquetages. Il existe son homologue importModule() pour importer des paquetages Hoathis. Cette fonction est indépendante de la plateforme et permet un contrôle plus fin de la mémoire car contrôle les chargements de fichier.
Depuis la version 0.5.x, la fonction import() met en place la notion de pré-chargement, c'est à dire que la fonction import() enregistre un fichier dans un registre d'importation mais ne charge pas le fichier ! Si on a besoin de charger ce fichier, l'auto-chargement va se déclencher, vérifier que le fichier existe dans le registre et enfin le charge.
Pour charger directement le fichier, on pouvait passer un booléen (true en l'occurence) en second paramètre de la fonction import().
true ou load() ?
Sauf que true n'est pas super parlant. C'est pourquoi j'ai ajouté la fonction load() qui permet de charger tous les fichiers que l'on vient d'importer. Si plusieurs appels successifs de la fonction import() sont réalisés, la fonction load() ne chargera que les derniers fichiers du dernier import.
Exemple :
import('File.~') and load(); // ne charge qu'un seul fichier : Hoa_File
import('File.*') and load(); // charge tous les fichiers du paquetage Hoa_File.Si on n'appelle pas load(), on attend que l'auto-chargeur fasse son travail.
Pourquoi load() au final ?
Le but de import() est d'éviter que l'on charge des fichiers pour rien. On ne charge que ce dont on a strictement besoin grâce à l'auto-chargeur qui -- quand il échoue lors d'un appel de classe -- va chercher un fichier où pourrait se trouver cette classe. Seulement, parfois, on est sûr que l'on va charger ce fichier. Si par exemple on a un héritage, rien ne sert d'attendre que l'auto-chargeur fasse son travail. On préfère donc éviter un échec, un temps CPU, une recherche etc. On va donc charger le fichier directement après l'importation.
Conclusion
On a gagné beaucoup de mémoire et de précieuses millisecondes avec la fonction import(). Ça avait un impact significatif sur les applications. Avec load(), on ne gagnera pas de mémoires mais quelques 0,01 millisecondes. Vous allez me dire que c'est négligeable ! Oui, mais non. Pour les caches d'opcode (comme xcache ou APC), ça peut faire une différence de pas mal d'instructions. Donc la vitesse sera plus importante après mise en cache : moins de lectures, moins de recherches, moins de comparaisons d'opcode etc.
Autre avantage : la sémantique. Le code est plus lisible et on comprend mieux ce qu'il se passe
.
Sur ce, je retourne réviser mon arabe et terminer la préparation de mon mariage en Tunisie
.