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 :

configuration light des classes d'objets en PHP


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    Juillet 2006
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 326
    Points : 345
    Points
    345
    Par défaut configuration light des classes d'objets en PHP
    salut,
    javascript on peut avoir une facon de construire les classes d'objet
    légère et que lors de l'instanciation de la classe de ne pas toujours recréer
    les fonctions/méthodes à chaque fois.
    Pour cela on écrit les fonctions non dans la classe directement
    mais plutot dans le prototype de la classe.
    En php quelles sont les techs de conception pour avoir des objets légers ?

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 228
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 228
    Points : 8 487
    Points
    8 487
    Billets dans le blog
    17
    Par défaut
    PHP n'utilise pas le modèle objet prototype de JS. Cela force donc à bidouiller pour obtenir un comportement similaire.

    On pourrait imaginer ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $o = new class { };
    $o->f = fn ($x) => $x * 2;
    $o->f(123); // 236 ? Nope
    Mais en l'état cela aboutit à une erreur Call to undefined method class@anonymous::f() (il faudrait faire ($o->f)(123)), alors qu'en passant par un tableau associatif cela fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $a = [];
    $a['f'] = fn ($x) => $x * 2;
    $a['f'](123); // 236 OK
    Mais on perd ici la notation objet et le $this.

    En bidouillant avec __call() ( https://www.php.net/manual/fr/langua...verloading.php ) on peut "intercepter" l'appel à la "méthode" et en profiter pour faire un bind sur le $this ( https://www.php.net/manual/fr/closure.bindto.php ) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $o = new class {
        public function __call($closure, $arguments)
        {
            return call_user_func_array($this->{$closure}->bindTo($this), $arguments);
        }
    };
     
    $o->f = fn ($multiplier) => $this->x * $multiplier;
     
    $o->x = 123;
     
    echo $o->f(3); // 369 OK

  3. #3
    Membre averti Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    Juillet 2006
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 326
    Points : 345
    Points
    345
    Par défaut
    les méthodes déclarées en static ne permettent pas d'économiser de la création "inutile" de methode à chaque instanciation ?
    Et les "traits" ca peut servir ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    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 692
    Points : 20 241
    Points
    20 241
    Par défaut
    JS et PHP n'ont pas le même paradigme objet , vouloir faire la même chose que JS dans PHP n'a pas d'intérêt

    Citation Envoyé par mapmip Voir le message
    les méthodes déclarées en static ne permettent pas d'économiser de la création "inutile" de methode à chaque instanciation ?
    Si tu veux "d'économiser" sur tes instanciations d'objets c'est soit que tu as un énorme problème de conception soit que c'est inutile.

    Citation Envoyé par mapmip Voir le message
    Et les "traits" ca peut servir ?
    Les traits faut voir ca comme un héritage fonctionnel. En gros ca te permet d'ajouter des fonctionnalités à des classe. Ca n'a pas les limitation de l'héritage (possibilité d'utiliser multiple traits par exemple). Ca n'a de l'intérêt que si un traits à vocation à être utilisé par plusieurs classes ,sinon autant tout mettre dans la classe directement.
    Perso je suis pas super fan, mais pourquoi pas

  5. #5
    Membre averti Avatar de mapmip
    Profil pro
    ulla
    Inscrit en
    Juillet 2006
    Messages
    1 326
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ulla

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 326
    Points : 345
    Points
    345
    Par défaut
    Confirmez-moi : les méthodes static sont-elles regénérées/dupliquées/recrées à chaque instanciation pour chaque objet ?
    Permettent-elles réellement d'économiser de la mémoire ?

  6. #6
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 692
    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 692
    Points : 20 241
    Points
    20 241
    Par défaut
    Encore une fois , optimisation inutile.

    L'intérêt d'une méthode static c'est de ne pas avoir besoin de créer une instance d'objet.
    * C'est plus facile à utiliser
    * Ca évite l'instanciation d'un éventuel gros objet.
    * Ca permet de partager une fonction entre plusieurs instances.

    Il faut bien comprendre qu'entre le code que tu écris et celui qui est exécuté , il y'a des compilateur/interpreteurs qui optimisent tout un tas de chose pour que justement tu n'es pas à t'en soucier.
    Ta problématique ca doit être de limiter les instanciations d'objet , d'éviter d'avoir des variables qui ne servent à rien , etc ... pas de limiter le nombre de fonction dans une classe.

Discussions similaires

  1. Utilisation des classes managées .net dans PHP
    Par Hinault Romaric dans le forum Langage
    Réponses: 2
    Dernier message: 19/02/2011, 10h46
  2. Réponses: 2
    Dernier message: 31/10/2006, 16h29
  3. Réponses: 4
    Dernier message: 16/08/2006, 09h19

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