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 :

signification de la syntaxe --::class


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut signification de la syntaxe --::class
    Bonjour,
    j'utilise un code qui fonctionne bien mais je voudrais le comprendre !
    J'ai un routeur dans lequel sont définies des routes de la façon suivante :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function getController(string $path): string
    {
    $routes = [...
    'connexion' =>'\\PasDePanique\\controller\\'. Connexion::class,
    ...
    ]
    $parts = explode('/', $path);
    return $routes[$parts[0]] ?? $routes['404'];
    }
    puis
    include 'config/routing.php';
    $ctrl_name = getController($path);
     
    $ctrl = new $ctrl_name();
    $ctrl->invoke(); //chaque contrôleur comporte une méthode invoke
    Donc la fonction getController retourne une variable de type string. Par contre le suffixe ::class spécifie qu'il s'agit d'une classe, non ? Cette syntaxe est-elle décrite quelque part ?

  2. #2
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Bonjour,

    oui c'est décrit ici

    https://www.php.net/manual/fr/langua...ic.class.class

    Ce n'était pas facile à trouver, j'ai dû passer par l'opérateur de classe static (::), puis le lien du bas, "plus d'exemple...".

    Non ça ne spécifie rien du tout, ça ne provoque même pas l'autoloader.

    La résolution du nom de classe en utilisant ::class est une transformation lors de la compilation. C'est-à-dire à l'instant où la chaine du nom de classe est créé aucun autochargement n'a encore eu lieu. Par conséquent, les noms de classes sont étendues même si la classe n'existe pas. Aucune erreur n'est émise dans ce cas là.
    Bonne journée.

  3. #3
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 497
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 497
    Billets dans le blog
    1
    Par défaut
    J'avoue avoir du mal à suivre les explications.
    Tout d'abord, ça parle de compilation, mais PHP est interprété, donc y a pas de compilation...

    ça ne provoque même pas l'autoloader.
    Qu'est-ce que tu veux dire ?

  4. #4
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Au passage, on eut pu passer par là pour retrouver le mot clef class
    https://www.php.net/manual/fr/reserved.keywords.php


    En fait ce n'est pas expliqué dans la doc de php.net,
    du moins je ne l'ai pas trouvé.
    C'est de mon point de vu un souci d'avoir une
    telle séparation entre les concepteurs du langage
    et les utilisateurs.

    Il a fallu que je passe par Zend pour me rafraichir la mémoire
    sur le statut de PHP.

    https://www.zend.com/blog/exploring-...p-jit-compiler

    Pour revenir plus spécifiquement à ta question,
    ce n'est pas exclusif.

    https://fr.wikipedia.org/wiki/Compilateur

    En informatique, un compilateur1 est un programme qui transforme un code source en un code objet2. Généralement, le code source est écrit dans un langage de programmation (le langage source), il est de haut niveau d'abstraction, et facilement compréhensible par l'humain. Le code objet est généralement écrit en langage de plus bas niveau (appelé langage cible), par exemple un langage d'assemblage ou langage machine, afin de créer un programme exécutable par une machine.
    Ce que vous nommez compilation,
    vous l'entendez comme la production de code machine exécutable
    entendu que cela passe par une étape inévitable de production des binaires.

    Mais désormais il est courant que l'on implémente de la compilation à la volée (JIT / Juste à temps)
    qui produit des représentations de code intermédiaire (byte code en java/.net, ou pour reprendre la terminologie de PHP, opcodes),
    qui sont à leurs tours interprétées par un programme avant d'être exécutées sur un cpu.

    C'est cela le fonctionnement d'un script php, compilation(analyse de syntaxe, tokenization, opcodes) => exécution(interprétation des opcodes).
    La VM c'est l'ensemble du programme et de son input, du code, qui produisent, des cycles de cpu.

    https://en.wikipedia.org/wiki/Interpreter_(computing)

    While interpretation and compilation are the two main means by which programming languages are implemented, they are not mutually exclusive, as most interpreting systems also perform some translation work, just like compilers. The terms "interpreted language" or "compiled language" signify that the canonical implementation of that language is an interpreter or a compiler, respectively.
    La version française du même lien ne me convient pas trop.


    Au sujet des IR/IL

    https://fr.wikipedia.org/wiki/Langag...rm%C3%A9diaire

    En informatique, un langage intermédiaire (parfois abrégé en IL, de l'anglais Intermediate Language) est le langage d'une machine abstraite conçu pour l'analyse d'un programme informatique. Le terme vient de son utilisation dans les compilateurs, où un compilateur transcrit d'abord le code source d'un programme en une forme plus adaptée pour les transformations d'amélioration de code, comme un état intermédiaire avant de générer du code objet ou du langage machine pour une machine cible, c’est-à-dire la machine sur laquelle sera exécutée le programme.
    Par exemple on aime bien SSA, parce que c'est bien utile pour faire des optimisations.

    https://fr.wikipedia.org/wiki/Static...ssignment_form
    En compilation informatique, static single assignment form (SSA), en français, forme statique à affectation unique est une représentation intermédiaire (RI) du code source d'un programme dont la particularité est d'astreindre chaque variable à n'être affectée qu'une et une seule fois. Les variables existantes dans la première représentation sont divisées en « versions », les nouvelles variables reprenant le nom original avec une extension.
    Au sujet de JIT
    https://fr.wikipedia.org/wiki/Compil..._la_vol%C3%A9e
    La compilation à la volée (aussi connue sous les noms de traduction dynamique, compilation juste-à-temps ou compilation JAT ; en anglais, just-in-time compilation ou JIT compilation), en programmation informatique, est une technique visant à améliorer la performance de systèmes bytecode-compilés par la traduction de bytecode en code machine natif au moment de l'exécution.
    En résumé, PHP a beaucoup évolué depuis ses premières versions,
    et bonnant malant il a intégré des techniques d'exécution très avancées.
    https://www.php.net/manual/fr/history.php.php

    Exemple #1 Exemple de code PHP/FI

    <!--include /text/header.html-->

    <!--getenv HTTP_USER_AGENT-->
    <!--ifsubstr $exec_result Mozilla-->
    Hé, vous utilisez Netscape !<p>
    <!--endif-->

    <!--sql database select * from table where user='$username'-->
    <!--ifless $numentries 1-->
    Désolé, cette ligne n'existe pas<p>
    <!--endif exit-->
    Bienvenue <!--$user--> !<p>
    Vous avez <!--$index:0--> crédits sur votre compte.<p>

    <!--include /text/footer.html-->
    Évidemment, un expert du domaine trouvera à commenter,
    il est le bienvenu.

    Bonne journée

  5. #5
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Au sujet de l'autoloader,
    j'entends que lorsque vous écrivez <?php print Does\Not\Exist::class;,
    l'autloader ne sera pas déclenché, puisque c'est une expression dite "compile time".

    En conséquence si l'appel est effectué sur une classe qui n'est pas statiquement
    disponible, l'expression est renvoyée telle quelle.

    Du moins c'est ce qu'en dit le documentation, en d'autres mots :

    Note:

    La résolution du nom de classe en utilisant ::class est une transformation lors de la compilation. C'est-à-dire à l'instant où la chaine du nom de classe est créé aucun autochargement n'a encore eu lieu. Par conséquent, les noms de classes sont étendues même si la classe n'existe pas. Aucune erreur n'est émise dans ce cas là.

    Exemple #16 Résolution de nom de classe manquante
    <?php
    print Does\Not\Exist::class;
    ?>

    L'exemple ci-dessus va afficher :

    Does\Not\Exist
    Bonne journée.

  6. #6
    Membre chevronné
    Homme Profil pro
    Urbaniste
    Inscrit en
    Août 2023
    Messages
    387
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Urbaniste

    Informations forums :
    Inscription : Août 2023
    Messages : 387
    Par défaut
    Finalement,

    si le sujet vous intéresse et que vous comprenez l'anglais,
    vous pouvez suivre Andreas Kling, qui nous propose un tas de vidéos.

    De plus, je vois qu'il a repris les posts vidéos depuis une paire de mois.



    Bon là vous êtes parti pour une dizaine d'heures... il y en a d'autres,
    au hasard, pas vraiment dans le sujet mais bon, vous n'y serez pas insensible.




    Bonne journée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 14/01/2013, 13h42
  2. c'est quoi cette syntaxe : class="<?=$test?>" ?
    Par Figaro90 dans le forum Langage
    Réponses: 5
    Dernier message: 20/04/2010, 15h41
  3. syntaxe classe anonyme?
    Par JCD21 dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 28/06/2008, 09h41
  4. [POO] Signification d'une syntaxe
    Par spaukensen dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 18/02/2008, 17h32
  5. [C#] Signification d'une syntaxe UserControl
    Par heavydrinker dans le forum Windows Forms
    Réponses: 2
    Dernier message: 17/08/2006, 10h21

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