2010-11-09 11 views
1

J'ai créé un CMS pour notre société qui possède un grand nombre de fonctions, dont beaucoup sont liées à des fonctionnalités spécifiques qui ne sont pas utilisées sur la plupart des sites pour lesquels nous utilisons le CMS. Mon but, alors, est d'inclure seulement le script d'une fonction quand c'est nécessaire (quand la fonction est appelée).Est-il possible d'utiliser une variable lors de la définition du nom d'une fonction PHP?

Pour le moment, j'appelle simplement chaque fonction normalement, en demandant le fichier où se trouve le script de la fonction, puis en appelant une deuxième fonction (le même nom que la fonction, mais avec un préfixe de soulignement) qui contient le script réel de la fonction. Par exemple:

function foo($a,$b) { 
    require_once "funtions-foo.php"; 
    return _foo($a,$b); 
} 

Ceci, cependant, me semble un peu répétitif. Ce que je cherche est un moyen de 'attraper' un appel de fonctions et, si son nom est dans un tableau de fonctions 'incluses', j'inclurai le bon fichier et j'appellerai la fonction. Par exemple:

catch_function_call($function,$arg1,$arg2) { 
    $array = array(
     'foo' => 'functions-foo.php', 
     'bar' => 'functions-bar.php' 
    ); 
    if($array[$function]) { 
     require_once $array[$function]; 
     return $function($arg1,$arg2); 
    } 
} 

Là, je pars du principe que la fonction « catch_function_call » peut attraper une certaine façon lorsqu'une fonction est appelée. Comme je ne connais pas une telle fonction, cependant, ma deuxième pensée était de simplement définir chacune des fonctions 'incluses' en utilisant des variables. Par exemple:

$array = array(
    'foo' => 'functions-foo.php', 
    'bar' => 'functions-bar.php' 
); 
foreach($array as $function => $file) { 
    function $function($arg1,$arg2) { 
     $_function = "_".$function; 
     require_once $file; 
     return $_function($arg1,$arg2); 

    } 
} 

Bien sûr, cela me donne une erreur que je ne peux pas apparemment utiliser une variable au nom d'une fonction lors de la définition elle. Des idées sur la façon de contourner cette ou d'autres solutions pour inclure seulement une fonction lorsque cela est nécessaire?

Répondre

1

Vous pouvez utiliser __call ou __callStatic sur un objet ou une classe, respectivement, ce qui équivaut à la fonctionnalité que vous recherchez. Vous pouvez lire quelques explications au this thread.

Cependant, il n'y a aucun moyen de le faire dans l'espace de fonction global.

+0

Cela semble probablement être la meilleure solution, mais il semblerait que cela nécessiterait de réécrire tous les appels de fonction, ce qui représente probablement plus de travail que de valeur. Pourtant, bon à savoir à ce sujet pour le développement futur. – Charlie

0

Juste utiliser include_once avant chaque fonction nécessaire?

0

Avez-vous envisagé de regrouper vos fonctions en ensembles et de les stocker en tant que méthodes statiques dans les objets. Ensuite, vous pouvez utiliser la fonction __autoload() et arrêter de vous soucier de l'heure à inclure.

Alors:

class Rarely_Used{ 

    static function foo(){} 
    static function bar(){} 
} 

class Only_for_Managers{ 
    static function ohboy(){} 
    static function punish(){} 
} 
+0

J'aime cette idée aussi, mais encore une fois, il faudrait changer tous les appels de fonction qui est un peu plus de travail que cela vaut la peine maintenant je pense. – Charlie

0

Pourquoi y compris tous les fichiers un gros problème? Comme vous utilisez probablement APC, l'accès au système de fichiers lourd ne sera pas un problème. Et à part ça, les recherches dans la table de hachage des fonctions sont évidemment plus lentes s'il y a plus de fonctions, mais cela ne sera certainement pas le goulot d'étranglement de votre application.

+0

J'essaie de réduire la quantité d'utilisation de la mémoire dans le système. Certains des sites que nous construisons sont très fréquentés et tout ce que nous pouvons faire pour réduire la consommation de mémoire est bon de notre point de vue. – Charlie