Ao examinar várias bibliotecas PHP, notei que muitas pessoas optam por prefixar alguns métodos de classe com um único sublinhado, como
public function _foo()
...ao invés de...
public function foo()
Percebo que, no final das contas, isso se resume à preferência pessoal, mas fiquei imaginando se alguém teria alguma ideia de onde esse hábito vem.
Meu pensamento é que provavelmente está sendo transferido do PHP 4, antes que os métodos de classe possam ser marcados como protegidos ou privados, como uma maneira de sugerir "não chame esse método de fora da classe". No entanto, também me ocorreu que talvez ele se origine em algum lugar (um idioma) com o qual eu não esteja familiarizado ou que possa haver um bom raciocínio por trás dele que eu me beneficiaria de saber.
Quaisquer pensamentos, idéias e / ou opiniões serão apreciados.
fonte
Respostas:
É dos velhos tempos do PHP Orientado a Objetos (PHP 4). Essa implementação do OO foi muito ruim e não incluiu coisas como métodos privados. Para compensar, os desenvolvedores de PHP precederam métodos que deveriam ser privados com um sublinhado. Em algumas aulas mais antigas, você verá
/**private*/ __foo() {
um peso extra.Eu nunca ouvi falar de desenvolvedores precedendo todos os seus métodos com sublinhados, então não posso começar a explicar o que causa isso.
fonte
Acredito que a fonte mais autorizada para esses tipos de convenções para PHP no momento seria o PSR-2: Coding Style Guide, porque o Zend Framework faz parte do PSR :
fonte
Agora, em 2013, isso é "oficialmente" um estilo ruim, segundo a diretriz de codificação PSR-2:
Fonte: https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md
fonte
PSR-2
-> "NÃO DEVE" significar "NÃO RECOMENDAR" não proibido Isso significa que em alguns casos pode ser aceitável. PSR Doc -> ietf.org/rfc/rfc2119.txtFui fortemente contra a prefixação de métodos privados / protegidos com sublinhado, pois você pode usar uma palavra-chave privada / protegida para isso e o IDE marcará isso para você.
E ainda estou, mas encontrei um motivo pelo qual pode ser uma boa prática. Imagine que você tem um método público
addFoo()
e, dentro desse método, você tem alguma parte da tarefa que é comum a outros métodosaddFooWhenBar()
,addFooWhenBaz()
... Agora, o melhor nome para esse método comum seriaaddFoo()
, mas já está sendo usado, então você deve criar algumas nome feio comoaddFooInternal()
ouaddFooCommon()
ou ... mas_addFoo()
o método privado parece o melhor.fonte
Os sublinhados principais geralmente são usados para propriedades e métodos privados . Não é uma técnica que costumo empregar, mas permanece popular entre alguns programadores.
fonte
Eu uso um sublinhado líder na classe PHP 5 que escrevo para métodos privados. É uma pequena dica visual para o desenvolvedor que um determinado membro da classe é privado. Esse tipo de dica não é tão útil ao usar um IDE que distingue membros públicos e privados para você. Peguei nos meus dias de C #. Velhos hábitos...
fonte
Acredito que sua suposição original estava correta, achei uma prática comum que alguns idiomas prefixassem um sublinhado de métodos / membros etc. que devem ser mantidos em sigilo no "objeto". Apenas uma maneira visual de dizer, embora você possa, você não deveria estar ligando para isso!
fonte
Eu estava procurando a mesma resposta, fiz algumas pesquisas e acabei de descobrir que os frameworks php sugerem estilos diferentes:
Code Igniter
O manual oficial possui uma seção de estilo de codificação que incentiva essa prática :
Outras estruturas fazem o mesmo, como
Cakephp:
faz o mesmo :
E também
PERA
faz o mesmo :
Enquanto
Drupal
O estilo do código alerta especificamente contra isso :
Sinfonia
por outro lado, declara :
fonte
Eu sei disso em python, onde o prefixo de suas variáveis com um sublinhado faz com que o compilador traduza alguma sequência aleatória de letras e números na frente do nome da variável real. Isso significa que qualquer tentativa de acessar a variável de fora da classe resultaria em um erro "variável indefinida".
Não sei se essa ainda é a convenção a ser usada em python, embora
fonte
No Drupal (um php CMS), sublinhados podem ser usados para impedir que os ganchos sejam chamados ( https://api.drupal.org/api/drupal/includes!module.inc/group/hooks/7 ).
Se eu tiver um módulo chamado "my_module" e desejar nomear uma função my_module_insert, ele "ganchará" a função hook_insert. Para impedir que eu possa renomear minha função para _my_module_insert.
ps Como o hooks funciona no Drupal, é possível implementar um hook por engano, o que é muito ruim.
fonte
Drupal e usando sublinhado:
De maneira geral, o sublinhado é simples para marcar o fato de que uma função provavelmente seria chamada apenas por uma função pai relacionada ...
Claro, apenas um exemplo simples ...
fonte
Usando sublinhado apenas para lembrar que não 'modificaremos a variável' / 'chamaremos a função' fora da classe.
Como declaramos variáveis const em todas as letras maiúsculas, de modo que, ao ver o nome da variável, possamos adivinhar que é uma variável const. Semelhante à variável que não queremos modificar fora da classe, a declaramos com sublinhado para nossa própria convenção.
fonte
Eles são chamados de "métodos mágicos" .
fonte
_foo()
com um único sublinhado à esquerda não é um método mágico. Os métodos mágicos são indicados por dois sublinhados principais consecutivos. A pergunta aqui fala sobre apenas um.