web-dev-qa-db-fra.com

Quel est le problème avec un soulignement de premier plan dans PHP méthodes de classe?

En parcourant diverses bibliothèques PHP, j'ai remarqué que de nombreuses personnes préfèrent préfixer certaines méthodes de classe par un trait de soulignement unique, tel que

public function _foo()

...au lieu de...

public function foo()

Je me rends compte que cela dépend finalement de vos préférences personnelles, mais je me demandais si quelqu'un avait une idée de la provenance de cette habitude.

Je pense que cela a probablement été reporté de PHP 4, avant que les méthodes de classe puissent être marquées comme protégées ou privées, ce qui implique "ne pas appeler cette méthode de l'extérieur de la classe". Cependant, je me suis aussi rendu compte que cela a peut-être son origine quelque part (une langue) avec laquelle je ne suis pas familier ou qu'il peut y avoir un bon raisonnement derrière cela que je gagnerais à connaître.

Toutes les pensées, idées et/ou opinions seraient appréciées.

137
nocash

Cela vient du mauvais vieux temps d'Object Oriented PHP (PHP 4). Cette implémentation de OO était très mauvaise et n'incluait pas des méthodes telles que les méthodes privées. Pour compenser, les développeurs PHP ont préfacé les méthodes destinées à être privées avec un trait de soulignement. Dans certaines classes plus anciennes, vous verrez /**private*/ __foo() { pour lui donner un poids supplémentaire.

Je n'ai jamais entendu dire que les développeurs préfèrent toutes leurs méthodes avec des traits de soulignement. Je ne peux donc pas commencer à expliquer les causes de cela.

140
Jeremy DeGroot

Je pense que la source la plus fiable pour ce type de conventions pour PHP serait le PSR-2: Guide de style de codage car le Zend Framework fait partie de PSR

Les noms de propriété NE DEVRAIENT PAS être précédés d'un seul trait de soulignement pour indiquer une visibilité protégée ou privée.

67
joedevon

Maintenant, en 2013, ceci est "officiellement" un mauvais style par la directive de codage PSR-2: 

Les noms de propriété NE DEVRAIENT PAS être précédés d'un seul trait de soulignement pour indiquer une visibilité protégée ou privée.

Source: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md

37
Sliq

Les principaux tirets bas sont généralement utilisés pour les propriétés et méthodes privées . Ce n’est pas une technique que j’utilise habituellement, mais qui reste populaire chez certains programmeurs.

11
jonstjohn

J'étais fermement opposé à la préfixation des méthodes privées/protégées avec un trait de soulignement, car vous pouvez utiliser un mot clé privé/protégé pour cela et IDE le marquera pour vous.

Et je le suis toujours, mais j'ai trouvé une raison pour laquelle cela peut être une bonne pratique. Imaginez que vous avez la méthode publique addFoo() et qu’elle comporte une partie de la tâche qui est courante avec d’autres méthodes addFooWhenBar(), addFooWhenBaz()... Maintenant, le meilleur nom pour cette méthode courante serait addFoo(), mais il est déjà pris, vous devez donc inventez un nom moche comme addFooInternal() ou addFooCommon() ou ... mais _addFoo() méthode privée ressemble au meilleur choix.

11
umpirsky

J'utilise un trait de soulignement dans la classe PHP 5 que j'écris pour les méthodes privées. C'est un petit indice visuel pour le développeur qu'un membre de classe particulier est privé. Ce type de conseil n'est pas aussi utile lorsque vous utilisez un IDE qui distingue les membres publics et privés pour vous. Je l'ai ramassé de mes jours C #. Vieilles habitudes...

8
GloryFish

Je crois que votre hypothèse de départ était correcte. J’ai constaté qu’il était courant que certaines langues préfixent un trait de soulignement aux méthodes/membres, etc. censées rester confidentielles à "l'objet". Juste une façon visuelle de dire, même si vous le pouvez, vous ne devriez pas appeler cela!

5
Quintin Robinson

Je le sais depuis python, où le préfixe de vos variables avec un trait de soulignement force le compilateur à traduire une séquence aléatoire de lettres et de chiffres devant le nom de la variable réelle . Cela signifie que toute tentative d'accès à la variable de l'extérieur entraîner une erreur "variable non définie".

Je ne sais pas si c'est toujours la convention à utiliser en python, bien que

4
Matthew

Dans Drupal (un CMS php), les traits de soulignement peuvent être utilisés pour empêcher l’appel des hooks ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).

Si j'ai un module appelé "my_module" et que je souhaite nommer une fonction my_module_insert, il "accrochera" à la fonction hook_insert. Pour éviter que je puisse renommer ma fonction _my_module_insert.

ps La manière dont les crochets fonctionnent dans Drupal est possible de mettre en œuvre un crochet par erreur, ce qui est très mauvais.

3
maho

Drupal, et en utilisant le trait de soulignement:

De manière générale, le trait de soulignement est destiné à indiquer simplement le fait qu'une fonction ne serait probablement appelée que par une fonction parent associée ... 

function mymodule_tool($sting="page title"){
    $out ='';
    //do stuff 
    $out  .= _mymodule_tool_decor($sting);
    return $out;
}

function _mymodule_tool_decor($sting){
    return '<h1>'.$string.'</h1>';
}

Bien sûr, juste un exemple simple ...

3
user3613677

Je cherchais la même réponse, j'ai fait des recherches et je viens de découvrir que les frameworks php suggèrent différents styles:

Code Igniter 

Le manuel officiel comporte une section de style de codage qui encourage cette pratique :

Méthodes privées et variables

Les méthodes et les variables accessibles en interne, telles que les fonctions utilitaires et d'assistance utilisées par vos méthodes publiques pour l'abstraction de code, doivent être précédées d'un trait de soulignement.

public function convert_text()

private function _convert_text()

D'autres cadres font la même chose, comme 

Cakephp:

fait le même

Visibilité des membres

Utilisez les mots-clés privés et protégés de PHP5 pour les méthodes et les variables. De plus, les noms de méthodes ou de variables non publiques commencent par un seul soulignement (_). Exemple:

class A
{
    protected $_iAmAProtectedVariable;

    protected function _iAmAProtectedMethod()
    {
       /* ... */
    }

    private $_iAmAPrivateVariable;

    private function _iAmAPrivateMethod()
    {
        /* ... */
    }
}

Et aussi 

POIRE 

fait le même :

Les membres d'une classe privée sont précédés d'un seul trait de soulignement. Par exemple:

$_status    _sort()     _initTree()

Tandis que 

Drupal

le style de code spécifiquement met en garde contre ceci :

  1. Les propriétés et méthodes protégées ou privées ne doivent pas utiliser de préfixe de soulignement.

Symphonie

par contre, déclare

Symfony respecte les normes définies dans les documents PSR-0, PSR-1, PSR-2 et PSR-4.

2
m.ardito

Utiliser le trait de soulignement juste pour rappeler que nous ne «modifierons pas la variable»/«n'appellerons pas la fonction» en dehors de la classe.

Comme nous déclarons des variables const dans toutes les majuscules, le nom de la variable peut alors deviner qu’il s’agit d’une variable const. Semblable à la variable que nous ne voulons pas modifier en dehors de la classe, nous la déclarons avec un tiret bas pour notre propre convention.

0
Tassawer