En examinant diverses bibliothèques PHP, j'ai remarqué que beaucoup de gens choisissent de préfixer certaines méthodes de classe avec un seul trait de soulignement, tel que
public function _foo()
...au lieu de...
public function foo()
Je me rends compte qu'en fin de compte, cela revient à une préférence personnelle, mais je me demandais si quelqu'un avait un aperçu de l'origine de cette habitude.
Ma pensée est qu'elle est probablement reportée de PHP 4, avant que les méthodes de classe ne puissent être marquées comme protégées ou privées, comme une manière d'impliquer "n'appelez pas cette méthode de l'extérieur de la classe". Cependant, il m'est également venu à l'esprit que peut-être que cela provient de quelque part (une langue) que je ne connais pas 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.
la source
Réponses:
C'est du mauvais vieux temps de PHP orienté objet (PHP 4). Cette implémentation d'OO était assez mauvaise et n'incluait pas des choses comme les méthodes privées. Pour compenser, les développeurs PHP ont précédé les méthodes qui étaient censées être privées d'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 parler de développeurs faisant précéder toutes leurs méthodes de traits de soulignement, je ne peux donc pas commencer à expliquer ce qui cause cela.
la source
Je pense que la source la plus fiable pour ce type de conventions pour PHP à l'heure actuelle serait le PSR-2: Coding Style Guide car le Zend Framework fait partie de PSR :
la source
Maintenant, en 2013, c'est "officiellement" un mauvais style selon la directive de codage PSR-2:
Source: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
la source
PSR-2
-> "NE DEVRAIT PAS" signifie "NE PAS RECOMMANDER" non interdit Cela signifie dans certains cas peut être acceptable. PSR Doc -> ietf.org/rfc/rfc2119.txtJ'étais fermement contre le préfixe 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 l'EDI 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 ayez une méthode publique
addFoo()
et à l'intérieur de cette méthode, vous avez une partie de la tâche qui est commune avec d'autres méthodesaddFooWhenBar()
,addFooWhenBaz()
... Maintenant, le meilleur nom pour cette méthode commune seraitaddFoo()
, mais il est déjà pris, vous devez donc en trouver vilain nom commeaddFooInternal()
ouaddFooCommon()
ou ... mais_addFoo()
la méthode privée semble la meilleure.la source
Les traits de soulignement de premier plan sont généralement utilisés pour les propriétés et méthodes privées . Ce n'est pas une technique que j'emploie habituellement, mais qui reste populaire parmi certains programmeurs.
la source
J'utilise un trait de soulignement principal dans la classe PHP 5 que j'écris pour les méthodes privées. C'est un petit signal visuel pour le développeur qu'un membre de classe particulier est privé. Ce type d'indication 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...
la source
Je crois que votre hypothèse originale était correcte, j'ai trouvé que c'est une pratique courante pour certaines langues de préfixer un trait de soulignement aux méthodes / membres, etc. qui sont censées rester privées de l '"objet". Juste une façon visuelle de dire, même si vous le pouvez, vous ne devriez pas appeler ça!
la source
Je cherchais la même réponse, j'ai fait quelques recherches, et je viens de découvrir que les frameworks php suggèrent différents styles:
Allumeur de code
Le manuel officiel a une section de style de codage qui encourage cette pratique :
D'autres frameworks font de même, comme
Cakephp:
fait la même chose :
Et aussi
POIRE
fait la même chose :
Tandis que
Drupal
le style de code met spécifiquement en garde contre ceci :
Symphonie
d'autre part, déclare :
la source
Je le connais depuis python, où le préfixe de vos variables avec un trait de soulignement oblige 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 depuis l'extérieur de la classe entraînerait une erreur "variable non définie".
Je ne sais pas si c'est toujours la convention à utiliser en python, cependant
la source
Dans Drupal (un CMS php), les traits de soulignement peuvent être utilisés pour empêcher les hooks d'être appelés ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).
Si j'ai un module appelé "my_module" et que je veux nommer une fonction my_module_insert, il "accrocherait" la fonction hook_insert. Pour éviter cela, je peux renommer ma fonction en _my_module_insert.
ps La façon dont les hooks fonctionnent dans Drupal, il est possible d'implémenter un hook par erreur, ce qui est très mauvais.
la source
Drupal et en utilisant un trait de soulignement:
D'une manière générale, le trait de soulignement consiste simplement à marquer le fait qu'une fonction ne serait probablement appelée que par une fonction parent liée ...
Bien sûr, juste un exemple simple ...
la source
Utiliser le trait de soulignement juste pour se souvenir que nous ne «modifierons pas la variable» / «n'appellerons la fonction» en dehors de la classe.
Comme nous déclarons les variables const en toutes majuscules afin que tout en voyant le nom de la variable puisse deviner qu'il s'agit d'une variable const. Similaire à la variable que nous ne voulons pas modifier en dehors de la classe, nous la déclarons avec un soulignement pour notre propre convention.
la source
Ils sont appelés «méthodes magiques» .
la source
_foo()
avec un seul trait de soulignement n'est pas une méthode magique. Les méthodes magiques sont indiquées par deux traits de soulignement consécutifs. La question ici ne parle que d'un seul.