IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Inclusion de fonctions hors classe [PHP 7]


Sujet :

Langage PHP

  1. #1
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut Inclusion de fonctions hors classe
    Bonjour.
    J'ai rasssemblé dans un fichier un ensemble de fonctions traitant de tableaux bidimensionnels, notamment des fonctions de tri.
    Je voudrai éviter d'avoir des include_once dans tous mes fichiers, mais si je peux charger dynamiquement mes classes grâce à l'autoload, je ne peux pas le faire pour cet ensemble hors classe.
    Suis-je contraint à créer une classe (attribut unique un tableau et méthodes mes fonctions) ou existe-t-il un moyen d'étendre les fonctions array_x existantes ?

  2. #2
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu ne peux pas étendre les fonctions PHP et utiliser des include_once partout c'est moche et surtout pas pratique.
    Tu dois ruser avec l'autoloader (voici comment je fais) :
    je crée un fichier contenant l'implémentation d'une classe vide qui bénéficiera des fonctions de chargement de l'autoloader avec en dessous le corps de mes fonctions perso :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
     
    class MyFuncs
    {
        // intentionally empty
    }
     
    if ( ! function_exists('count_elements')) {
        function count_elements(array $p): int {
            $nb = 0;
            array_walk_recursive($p, function($v, $k) use (&$nb) { ++$nb; });
            return $nb;
        }
    }
    ensuite où que tu sois dans ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <?php
     
    $my_func = new MyFunc;  // comme généralement les fonctions seront sur l'espace de nom global ; tu peux t'affranchir du : use MyFuncs;
     
    $nb = count_elements([[1, 2, 3], [4, 5, [6, 7, 8 , [9, 10, 11, 12, 13]]]]);  // $nb = 13
    C'est le mieux que j'ai trouvé dans un environnement massivement orienté objet pour avoir à ma disposition des fonctions perso sans avoir à gérer manuellement les inclusions

  3. #3
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Une classe static ca sera quand même mieux qu'un corps de classe vide et une fonction qui se balade comme ca dans un fichier non ?
    L'écriture est légèrement plus contraignante mais ça fait moins bricolage (à mon sens)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class MyFuncs
    {
        private function __construct() {};
     
        public static function count_elements(array $p): int {
        }
    }
     
    MyFuncs::count_elements($array);

  4. #4
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    salut l'ami

    ben c'est surtout que t'as une tonne de moyens pour y parvenir.
    C'est un code de ninja qui donne l'illusion de manipuler des fonctions perso comme des fonctions php natives.
    Personnellement pour ce qui est des fonctions d'aide, j'ai une préférence pour __invoke()

  5. #5
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Points : 889
    Points
    889
    Par défaut
    Ave les gourous.
    Vu du ras des pâquerettes, la solution de rawsrc me tente plus car elle permet d'éviter de préfixer les fcts persos par le nom de l'objet créé $myFonct->count_*** et donne donc l'impression d'emploi de fctd natives. En revanche, pour les différencier, je les nommerai toutes en commençant par mf_

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 230
    Points
    20 230
    Par défaut
    Citation Envoyé par ypcman Voir le message
    donne donc l'impression d'emploi de fctd natives.
    C'est justement ce qui me dérange. Au premier coup d'oeil on ne vas pas savoir si c'est une fonction de base de php (bon là en faisant un effort ca devrait aller) , une fonction issue d'une extension , ou du code custom.
    De plus c'est pas évident de comprendre qu'il faut aller ouvrir tel fichier pour trouver la définition de telle fonction => comment se comporte ton ide la dessus rawsrc ?

    Préfixer la fonction est une première étape qui permet effectivement de ne pas trop se mélanger les pinceaux.

    Après y'a pas de "vraie" solution , chacun fait comme ca lui plait

  7. #7
    Membre émérite
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Points : 2 522
    Points
    2 522
    Par défaut
    Je ne sais pas si ma solution pique les yeux, mais il est possible d'indiquer dans le fichier .htaccess des fichiers à charger automatiquement au début ou à la fin de chaque appel à une page.
    C'est à la fois très et pas propre du tout.

    htaccess
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    php_value auto_prepend_file "C:/Program Files (x86)/EasyPHP-Devserver-17/eds-www/my_functions.php"
    my_functions.php
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php
    function my_function($x)
    {
     return $x * rand(1,50);
    }
    ?>


    toto.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
    class toto
    {
     public function __construct($x)
     {
      print my_function($x);
     }
    }$a = new toto(45);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/12/2016, 10h41
  2. Réponses: 5
    Dernier message: 29/10/2013, 15h22
  3. fonctions et classes... quand les utiliser ?
    Par fastmanu dans le forum Langage
    Réponses: 6
    Dernier message: 03/04/2006, 00h39
  4. Accèss à des fonctions entre classes
    Par vincetrader dans le forum C++
    Réponses: 4
    Dernier message: 08/09/2005, 13h45
  5. fonction et classe tempalte
    Par narkhor dans le forum C++
    Réponses: 8
    Dernier message: 29/03/2005, 09h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo