CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

PHP: fonction static d'instanciation d'un objet

News jeu

Expeditions: Samurai veut révolutionner le RPG tactique avec une aventure entièrement jouable en coop

Voir
FrissonAnal
FrissonAnal
Niveau 10
08 mars 2020 à 16:59:37

Salut,

Au boulot je reprends du code PHP écrit par un autre dev que je ne connais pas et je trouve par exemple cette class:

class MaClass
{

public static function build() {
return new MaClass();
}

...
}

Pour obtenir une instance de MaClass, je dois donc écrire $objet = MaClass::build();
Au lieu de simplement faire un $objet = new MaClass() :(

Est ce que cela à un intérêt et si oui est ce que ça porte un nom?

Merci pour vos avis, je passe peut être à côté d'un truc évident :hap:

Message édité le 08 mars 2020 à 17:00:56 par FrissonAnal
Viking2Lyon
Viking2Lyon
Niveau 10
08 mars 2020 à 17:15:43

comme ça ...
aucune
mais ta surement une raison

surtout que niveau nommage ...

UndeadMarston6
UndeadMarston6
Niveau 10
08 mars 2020 à 17:56:50

Alors oui c'est un pattern qui se nomme : Facade, il me semble. :noel:

C'est quelques choses d'assez utile mais dans ce cas la ... Peut-être qu'il s'imaginait pouvoir compléter la fonction plus tard. :noel:

Scorpionnocrag
Scorpionnocrag
Niveau 9
08 mars 2020 à 18:42:18

D'après une petite recherche, façade c'est le fait d'appelez une classe au travers une autre classe. La il construit un objet à partir de ... lui même ... je suis un peu perplexe...

A mes yeux aucun intérêt ... new MonObject(); c'est plus générique ... et puis si il y a des choses particulière à faire dans la construction, autant utiliser une fonction fait pour : __construct.

Mais bon ... peut-être que c'est une norme de création d'un framework ?

UndeadMarston6
UndeadMarston6
Niveau 10
08 mars 2020 à 19:18:06

Effectivement c'est peut-être pas forcément une Facade encore mais plus une factory :question:

https://www.grafikart.fr/tutoriels/factory-570 ?

Marav
Marav
Niveau 50
08 mars 2020 à 20:45:07

C'est une syntaxe de constructeur alternative, il y a surement une raison derrière ce choix notamment lors de ses tests ou pour une utilisation très spécifique de la classe.

Regarde la classe DateTime en PHP. La méthode createFromFormat répond au même pattern.
Pour ton cas par contre, j'ai du mal à voir l'avantage d'utiliser ça.

http://www.lephpfacile.com/manuel-php/datetime.createfromformat.php

Pseudo supprimé
Pseudo supprimé 09 mars 2020 à 15:47:05

Quelle horreur cette syntaxe..

Je suis quasiment sûr c'est une façade similaire à celles de Laravel : https://laravel.com/docs/5.7/facades

Le principe semble le même, sauf que le système de façade Laravel passe un container : le service container.

Et puisque toutes les classes façades héritent de la classe parente qui contient la méthode magique, __callStatic() , Laravel est capable de te retrouver la méthode que tu cherches à appeler, simplement par appel statique depuis ta classe.

------------------

Par exemple pour appeler la méthode get() de la façade Cache ici :

$user = Cache::get('user:'.$id);

Il va fait appel à la méthode :d) protected static function getFacadeAccessor() { return 'cache'; } , provenant de la classe parente.

class Cache extends Facade
{
    /**
     * Get the registered name of the component.
     *
     * @return string
     */
    protected static function getFacadeAccessor() { return 'cache'; }
}

On remarque qu'elle ne contient pas de méthode get(), mais plutôt une méthode statique getFacadeAccessor()

Et cette classe statique contient ceci :

    protected static function getFacadeAccessor() 
    { 
        return App\Providers\ReportGeneratorServiceProvider::class;
    }

:d) App\Providers\ReportGeneratorServiceProvider::class

Elle récupère juste ta classe, mais comment arrive-t-il à l'appeler elle et ses méthodes, (ici get() ), de manière statique du coup?

Et bien c'est parce qu'elle est d'abord est instanciée dans le service container, ensuite Laravel peut faire appel à elle, via un service provider,

  • return App\Providers\ReportGeneratorServiceProvider::class = return "cache"

Et le service container contient une classe register(); dans laquelle tu instancie ta classe, avec quelque chose style :

public function register()
   {
        $this->app->bind('Le\Chemin\Vers\Ta\Classe', function($app){
        return new Classe();
        });
   } 

Et comme tu le vois,

Par rapport ça :

public static function build() {
return new MaClass();

C'est exactement la même chose.

Voilà en gros.

Source :

  • https://laravel.com/docs/s/5.7/facades#how-facades-work
  • https://laravel.com/docs/s/5.7/container#binding-basics
  • https://stackoverflow.com/questions/35809262/laravel-5-2-what-goes-in-facade-getfacadeaccessor-return

------------------

C'est plutôt bien pensé, mais perso j'aime pas.

D'ailleurs c'est soit le système de façade, soit l'injection de dépendance. Tu ne peux pas pas faire les deux, ou alors t'es juste un masochiste.

Laravel d'ailleurs te vante les mérites de son système de façade par rapport à l'injection de dépendance, (forcément) :

  • https://laravel.com/docs/5.7/facades#facades-vs-dependency-injection

Et puis Laravel il est bien sympa, il te fait tout le taf pour la plupart de tes classes, et l'enregistre dans son propre code-source qu'il te dit à ne surtout pas modifier.

Et toi du coup t'as pas besoin de comprendre le mécanisme derrière, tu fais un simple, Articles::all() et t'es bien content d'avoir la liste de tout tes articles

  • Enfin, jusqu'à ce que tu sois forcé à créer une façade dès l'instant où le projet se complexifie :)

Pauvre op, l'autre dev est probablement un Laravel-addict.

------------------

Le 08 mars 2020 à 20:45:07 Marav a écrit :
Pour ton cas par contre, j'ai du mal à voir l'avantage d'utiliser ça.

Une alternative à l'injection de dépendance.

Moche à souhait.

Message édité le 09 mars 2020 à 15:51:41 par Pseudo supprimé
UndeadMarston6
UndeadMarston6
Niveau 10
09 mars 2020 à 15:48:52

Complétement d'accord avec mon vdd, le système de Facade pose certaine problématique (bien que comme dit, très bien pensé) et se révèle être une horreur dans l'IDE :fou:

Pseudo supprimé
Pseudo supprimé 09 mars 2020 à 15:52:12

Le 09 mars 2020 à 15:48:52 UndeadMarston6 a écrit :
Complétement d'accord avec mon vdd, le système de Facade pose certaine problématique (bien que comme dit, très bien pensé) et se révèle être une horreur dans l'IDE :fou:

La même, je trouve ça très moche :hap:

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment