62 votes

Autoloader pour les fonctions

La semaine dernière j'ai appris que les classes peuvent être inclus dans votre projet par écrit un __autoload() fonction. Ensuite, j'ai appris que l'utilisation d'un chargeur automatique n'est pas seulement une technique, mais aussi un modèle.

Maintenant, je suis à l'aide de l'autochargeur dans mon projet et je l'ai trouvé très très utile. Je me demandais si il serait possible de faire la même chose avec les fonctions. Il pourrait être très utile à l'oublier, y compris le droit fichier PHP avec des fonctions à l'intérieur.

Donc, est-il possible de créer une fonction de l'autochargeur?

62voto

ircmaxell Points 74865

Il n'y a pas de fonction auto-loader pour les fonctions. Vous avez quatre solutions réalistes:

  1. Enveloppez toutes les fonctions dans namespacing classes (dans un contexte approprié). Donc, disons que vous avez une fonction appelée string_get_letters. Vous pourriez ajouter que, pour une classe appelée StringFunctions comme une fonction statique. Ainsi, au lieu de l'appel d' string_get_letters(), que vous appelleriez StringFunctions::get_letters(). Vous serait alors __autoload de ces espaces de classes.

  2. Pré-charge de toutes les fonctions. Puisque vous êtes à l'aide de classes, vous ne devriez pas avoir que de nombreuses fonctions, il suffit donc de pré-charger.

  3. Charge les fonctions avant de les utiliser. Dans chaque fichier, require_once la fonction des fichiers qui vont être utilisés dans ce fichier.

  4. Ne pas utiliser des fonctions dans la première place. Si vous êtes l'élaboration de la programmation orientée objet (code de laquelle il semble que vous êtes de toute façon), il devrait y avoir peu ou pas de besoin pour les fonctions à tous. Tout ce que vous auriez besoin d'une fonction (ou de plusieurs), vous pouvez construire sur un OO manière et d'éviter la nécessité pour les fonctions.

Personnellement, je vous suggère de 1, 2 ou 4 en fonction de votre besoin et de la qualité et de la taille de votre base de code...

39voto

ivoba Points 1609

Si vous utilisez Compositeur dans votre Projet, vous pouvez ajouter un des fichiers de la directive pour le chargement automatique de la section.

Cela permettra de réellement générer un require_once dans l'autochargeur, mais il se sent comme de vrais chargement automatique, parce que vous n'avez pas à prendre soin de cela.
Ses pas le chargement paresseux si.

Exemple pris sur Assetic:

"autoload": {
        "psr-0": { "Assetic": "src/" },
        "files": [ "src/functions.php" ]
    }

16voto

Alix Axel Points 63455

J'ai lu quelque chose d'un temps à un vilain hack qui a attiré des erreurs fatales et essayé d'inclure et d'exécuter la fonction manquant(s), mais j'ai vraiment ne pas aller faire de la route.

La chose la plus proche que vous avez est l' __call() méthode magique, qui est une sorte de __autoload() pour les méthodes, pas de fonctions. Il pourrait être assez bon pour vos besoins; si vous pouvez vous permettre d'appeler une classe et demander à chaque fonction séparément. Depuis PHP 5.3.0, vous avez également __callStatic().

Un exemple d'utilisation de __callStatic():

class Test
{
    public function __callStatic($m, $args)
    {
        if (function_exists($m) !== true)
        {
            if (is_file('./path/to/functions/' . $m . '.php') !== true)
            {
                return false;
            }

            require('./path/to/functions/' . $m . '.php');
        }

        return call_user_func_array($m, $args);
    }
}

Test::functionToLoad(1, 2, 3);

Ce serait d'appeler l' functionToLoad() de la fonction définie dans l' ./path/to/functions/functionToLoad.php.

8voto

mario Points 76989

Eh bien, comme d'habitude, il est une extension PECL pour que:

(via: http://phk.tekwire.net/joomla/support/doc/automap.htm)

Il est censé chargement automatique des fonctions et des classes. Qui, cependant, ne fonctionne pas avec le courant de PHP interprète encore.

(Une option alternative btw, est génératrice de stub fonctions de charger et d'exécuter des espaces homologues.)

Cela étant dit. Chargement automatique n'est pas universellement considérée comme une bonne pratique. Elle conduit à une fracture de hiérarchies de classe et d'objet bonheur. Et la vraie raison de PHP a chargement automatique est parce que de l'inclure et de la dépendance des systèmes de gestion des inmature.

3voto

bryanjhv Points 1
 namespace php\helpers;

class F {

    private function __construct() {}
    private function __wakeup() {}
    private function __clone() {}

    public static function __callStatic($fn, $args) {
        if (!function_exists($fn)) {
            $fn = "php\\functions\\$fn";
            require str_replace('\\', '/', $fn) . '.php';
        }
        return call_user_func_array($fn, $args);
    }

}
 

Et en utilisant les espaces de noms, nous pouvons faire: F::myFunc() et spl_autoload_register() . J'ai utilisé ce code avec des exemples sur: https://bryanjhvtk.wordpress.com/2014/03/14/functions-autoloading-php/

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X