web-dev-qa-db-fra.com

Pourquoi l'indication de type est-elle nécessaire en PHP?

J'ai du mal à comprendre pourquoi il est important d'indiquer le type en PHP.

Apparemment, "type hinting" dans PHP peut être défini comme suit:

"Type hinting" vous oblige à passer uniquement des objets d'un type particulier. Cela vous empêche de transmettre des valeurs incompatibles et crée une norme si vous travaillez avec une équipe, etc.

Donc, taper des indices au niveau le plus basique, n'est pas nécessaire pour faire fonctionner le code?

J'ai le code suivant pour essayer de comprendre ce qui se passe ...

Index.php

<?php
include 'Song.php';

$song_object = new Song;

$song_object->title = "Beat it!";
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!";


function sing(Song $song)
{
    echo "Singing the song called " . $song->title;
    echo "<p>" . $song->lyrics . "</p>";
}

sing($song_object);

Song.php

<?php

class Song
{
    public $title;
    public $lyrics;
}

le code fait son travail avec ou sans le petit indice de type dans la fonction sing ();

enter image description here

Donc, cela m'amène à croire que l'indication de type est simplement une convention de codage pour s'assurer que seules certaines classes sont utilisées et ne sont pas nécessaires pour produire du code fonctionnel, est-ce correct?

La suggestion de type, comme le suggère la citation ci-dessus, est là pour créer une norme si vous travaillez avec une équipe.

Est-ce que j'ai râté quelque chose?

22
Jethro Hazelhurst

L'indication de type n'est pas requise, mais elle peut vous permettre de détecter certains types d'erreurs. Par exemple, vous pourriez avoir une fonction ou une méthode qui nécessite un entier. PHP va convertir heureusement "chaînes de recherche de nombres" en nombres entiers, et cela peut entraîner un comportement difficile à déboguer. Si vous spécifiez dans votre code que vous avez spécifiquement besoin d'un entier, cela peut empêcher ces types de bogues en premier lieu. De nombreux programmeurs considèrent la protection de leur code de cette manière comme une meilleure pratique.

Comme exemple concret de ceci en action, regardons une version mise à jour de votre fichier index.php:

index.php

<?php
include 'Song.php';
include 'Test.php';

$song_object = new Song;
$test_object = new Test;

$song_object->title = "Beat it!";
$song_object->lyrics = "It doesn't matter who's wrong or right... just beat it!";

$test_object->title = "Test it!";
$test_object->lyrics = "It doesn't matter who's wrong or right... just test it!";


function sing(Song $song)
{
    echo "Singing the song called " . $song->title;
    echo "<p>" . $song->lyrics . "</p>";
}

sing($song_object);
sing($test_object);

En plus du nouveau fichier Test.php, J'ai ajouté:

Test.php

<?php

class Test
{
    public $title;
    public $lyrics;
}

Lorsque j'exécute index.php Maintenant, j'obtiens l'erreur suivante:

Sortie:

Singing the song called Beat it!<p>It doesn't matter who's wrong or right...
just beat it!</p>PHP Catchable fatal error:  Argument 1 passed to sing() must
be an instance of Song, instance of Test given, called in test/index.php on
line 22 and defined in test/index.php on line 15

Catchable fatal error: Argument 1 passed to sing() must be an instance of
Song, instance of Test given, called in test/index.php on line 22 and defined
in test/index.php on line 15

C'est PHP me faisant savoir que j'ai essayé d'utiliser le mauvais type de classe lorsque j'ai appelé la fonction sing().

27
Gavin Anderegg

L'indication de type est un processus naturel. Au début, cela peut sembler un travail supplémentaire, mais il est très utile à mesure que votre projet se développe en PHP. Il permet une meilleure lisibilité et facilite le contrôle des erreurs et les conventions de programmation strictes.

Initialement, vous devez implémenter le "contrat", où le contrat est une interface php qui peut "verrouiller" les constantes et les principales méthodes publiques et leurs arguments, en tant que tels:

interface SongInterface {
    //...
}

class Song implements SongInterface
{
    public $title;
    public $lyrics;
    //...
}

Continuez ensuite avec la partie d'exécution réelle:

$song = (object) new Song;

$song->title = (string) "Beat it!";
$song->lyrics = (string) "It doesn't matter who's wrong or right... just beat it!";


function sing(SongInterface $song): string
{
    $html = (string)  "Singing the song called " . $song->title
    . "<p>" . $song->lyrics . "</p>";

    return htmlentities($html, ENT_QUOTES, 'utf-8');
}

echo sing($song);

À l'aide d'une interface, vous définissez uniquement les fonctions, puis vous l'implémentez dans une classe de morceaux. De cette façon, vous pouvez toujours injecter une autre classe de morceau (avec des fonctionnalités et des changements plus récents) sans interrompre votre application. Découvrez les interfaces oop: http://php.net/manual/en/language.oop5.interfaces.php

Depuis php7, vous pouvez également définir le type de retour d'une fonction. https://wiki.php.net/rfc/return_types

6
Nitin

Est-ce nécessaire? Non

Est-ce une meilleure pratique? Oui

Quelle version PHP la prend en charge? PHP 5.6 pour les classes uniquement, PHP 7+ permet une indication de type pour les primitives (int , chaîne, booléen, etc.) également.

Comment est-ce utile?

  1. Obtenir des conseils par le IDE (dépend de l'IDE).
  2. Standardisation du style de codage dans les projets d'équipe.
  3. Réduction erreurs logiques .
  4. Passer de PHP étant un langage de type lossy, à un PHP typiquement fort, mais en gardant la possibilité d'utiliser lossy ou fortement aux mains des développeurs.
1
evilReiko

L'indication de type est comme le nom en dit plus. Il permet aux développeurs de voir quelles classes peuvent être passées en tant qu'arguments et les empêche de passer des arguments incorrects. C'est particulièrement utile si vous travaillez sur le même projet avec plus d'une seule personne et/ou si le code est destiné à l'open source.

Dans le type php7, des indices pour la chaîne, l'int, (mixte) et le tableau ont été ajoutés afin que vous n'ayez pas seulement besoin de classes, mais que vous puissiez également utiliser les types php standard

1
Marvin Fischer
  • vous rend le code plus stable, surtout si le projet est volumineux

  • le code est plus lisible, plus propre et plus professionnel

  • vous donne la saisie semi-automatique dans l'IDE

  • renifleurs de code comme phpstan peuvent trouver où vous appelez une méthode avec un mauvais paramètre

  • vous pouvez mieux comprendre le code et le fonctionnement des méthodes lorsque vous arrivez à un nouveau projet

  • sans indice de type si vous appelez votre méthode avec un objet incorrect, rien ne se passerait car $ song-> title et $ song-> lyrics renverrait null, avec l'exception d'indicateur de type est jeté

0
fico7489