Lorsque vous travaillez sur un projet PHP qui profite du paradigme OOP avec la fonction PHP __autoload()
, ce qui ce qui suit est considéré comme la meilleure pratique pour la gestion des fonctions autonomes:fonctions Auto-chargement des meilleures pratiques
(exemples fournis simplifié par souci de concision)
tl; dr: Comment se charge de la fonction autonome couramment traitée:
- pseudo-autoloading (via
__callStatic
magique par exemple) [Option 1]- classe d'aide abstraite regroupées méthodes statiques [Option 2]
- une alternative
A noter également, J'ai posté une question connexe concernant un problème de paramètre/référence avec option 1, qui peut être trouvé ici: __callStatic(), call_user_func_array(), references, and PHP 5.3.1
fournies dans index.php
:
function __autoload($class){
require $class . '.class.php';
}
Option 1; Une classe abstraite Core
(ou Library
, ou autre) que les fonctions "de" charge automatiquement:
## Core.class.php
abstract class Core{
public static function __callStatic($function, $arguments){
if(!function_exists($function)){
require $function . '.function.php';
}
return call_user_func_array($function, $arguments);
}
}
## SayHello.function.php
function sayHello(){
echo 'Hello';
}
## SayGoodbye.function.php
function sayGoodbye(){
echo 'Goodbye';
}
## index.php
Core::sayHello(); // Hello
Core::sayGoodbye(); // Goodbye
Option 2; Le regroupement des fonctions connexes dans « aide » abstraites des classes à appeler statiquement:
## SayStuff.class.php
abstract class SayStuff{
public static function sayHello(){
echo 'Hello';
}
public static function sayGoodbye(){
echo 'Goodbye';
}
}
## index.php
SayStuff::sayHello(); // Hello
SayStuff::sayGoodbye(); // Goodbye
** Merci rATRIJS; ** Je pensais aussi à cela, cela pourrait gouloter fortement avec les fonctions récursives. Au fil du temps, j'ai écrit beaucoup de fonctions qui étendent essentiellement la fonctionnalité principale de PHP, et bien que certaines puissent être utilisées dans un projet donné, d'autres non. Les diviser en groupes logiques (classes) est difficile, en raison de la généralité de certains, mais c'est une option que je considère toujours. Les charger tous à chaque fois car une seule bibliothèque massive n'est pas optimale (je ne pense pas) en raison de la taille qu'elle deviendra quand je finis de consolider ma bibliothèque. – Dan
Un autre problème que j'ai remarqué avec "option 1" est des fonctions avec des arguments qui sont passés par référence, tout simplement ne fonctionne pas bien sûr. J'avais oublié cette mise en garde. – Dan