Al revisar varias bibliotecas PHP, noté que muchas personas eligen prefijar algunos métodos de clase con un solo guión bajo, como
public function _foo()
...en vez de...
public function foo()
Me doy cuenta de que, en última instancia, esto se reduce a la preferencia personal, pero me preguntaba si alguien tenía alguna idea de dónde proviene este hábito.
Creo que probablemente se está transfiriendo de PHP 4, antes de que los métodos de clase se puedan marcar como protegidos o privados, como una forma de implicar "no llame a este método desde fuera de la clase". Sin embargo, también se me ocurrió que tal vez se origina en algún lugar (un idioma) con el que no estoy familiarizado o que puede haber un buen razonamiento detrás de esto que me beneficiaría saber.
Cualquier pensamiento, ideas y / u opiniones serán apreciadas.
fuente
Respuestas:
Es de los viejos tiempos de PHP orientado a objetos (PHP 4). Esa implementación de OO fue bastante mala y no incluyó cosas como métodos privados. Para compensar, los desarrolladores de PHP introdujeron métodos que pretendían ser privados con un guión bajo. En algunas clases anteriores, verás que le
/**private*/ __foo() {
das un poco de peso extra.Nunca he oído hablar de desarrolladores que introduzcan todos sus métodos con guiones bajos, por lo que no puedo comenzar a explicar qué causa eso.
fuente
Creo que la fuente más autorizada para este tipo de convenciones para PHP en este momento sería la Guía de estilo de codificación PSR-2 porque el Marco Zend es parte de PSR :
fuente
Ahora, en 2013, este es un estilo "oficialmente malo" según la directriz de codificación PSR-2:
Fuente: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
fuente
PSR-2
-> "NO DEBE" significa "NO RECOMENDAR" no está prohibido Eso significa que en algunos casos puede ser aceptable. PSR Doc -> ietf.org/rfc/rfc2119.txtEstaba totalmente en contra de prefijar métodos privados / protegidos con guión bajo ya que puede usar palabras clave privadas / protegidas para eso e IDE lo marcará por usted.
Y todavía lo estoy, pero encontré una razón por la cual puede ser una buena práctica. Imagine que tiene un método público
addFoo()
y dentro de ese método tiene una parte de la tarea que es común con otros métodosaddFooWhenBar()
,addFooWhenBaz()
... Ahora, el mejor nombre para ese método común seríaaddFoo()
, pero ya está en uso, por lo que debe encontrar algunos nombre feo comoaddFooInternal()
oaddFooCommon()
o ... pero_addFoo()
el método privado parece el mejor.fuente
Los guiones bajos principales se usan generalmente para propiedades y métodos privados . No es una técnica que suelo emplear, pero sigue siendo popular entre algunos programadores.
fuente
Utilizo un guión bajo destacado en la clase PHP 5 que escribo para métodos privados. Es una pequeña señal visual para el desarrollador que un miembro particular de la clase es privado. Este tipo de sugerencia no es tan útil cuando se utiliza un IDE que distingue a los miembros públicos y privados por usted. Lo recogí de mis días C #. Viejos hábitos ...
fuente
Creo que su suposición original era correcta, he encontrado que es una práctica común para algunos idiomas prefijar un guión bajo a métodos / miembros, etc. que deben mantenerse en privado con el "objeto". ¡Solo una forma visual de decir que aunque puedes, no deberías llamar a esto!
fuente
Estaba buscando la misma respuesta, investigué un poco y acabo de descubrir que los frameworks php sugieren diferentes estilos:
Code Igniter
El manual oficial tiene una sección de estilo de codificación que fomenta esta práctica :
Otros marcos hacen lo mismo, como
Cakephp:
hace lo mismo :
Y también
PERA
hace lo mismo :
Mientras
Drupal
el estilo de código advierte específicamente contra esto :
Sinfonía
por otro lado, declara :
fuente
Lo sé por python, donde el prefijo de sus variables con un guión bajo hace que el compilador traduzca una secuencia aleatoria de letras y números delante del nombre real de la variable. Esto significa que cualquier intento de acceder a la variable desde fuera de la clase daría como resultado un error de "variable indefinida".
Sin embargo, no sé si esta es la convención para usar en Python
fuente
En Drupal (un PHP CMS), los guiones bajos se pueden utilizar para evitar que se llamen ganchos ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).
Si tengo un módulo llamado "my_module" y quiero nombrar una función my_module_insert, se "enganchará" en la función hook_insert. Para evitar eso, puedo cambiar el nombre de mi función a _my_module_insert.
ps La forma en que los ganchos funcionan en Drupal es posible implementar un gancho por error, lo cual es muy malo.
fuente
Drupal, y usando guión bajo:
De manera general, el guión bajo es simplemente marcar el hecho de que una función probablemente solo sea llamada por una función padre relacionada ...
Por supuesto, solo un simple ejemplo ...
fuente
Usando subrayado solo para recordar el propósito de que no 'modificaremos la variable' / 'llamaremos a la función' fuera de la clase.
Como declaramos variables const en mayúsculas para que al ver el nombre de la variable podamos adivinar que es una variable const. Similar a la variable que no queremos modificar fuera de la clase, la declaramos con guión bajo para nuestra propia convención.
fuente
Se llaman "métodos mágicos" .
fuente
_foo()
con un solo guión bajo no es un método mágico. Los métodos mágicos se denotan por dos guiones bajos consecutivos. La pregunta aquí habla solo de uno.