Na maioria das linguagens de programação, as variáveis não possuem caracteres de identificação como no PHP. No PHP, você deve prefixar uma variável com o $
caractere.
Exemplo;
var $foo = "something";
echo $foo;
Estou desenvolvendo uma nova linguagem de script para um aplicativo de negócios, e meus usuários de destino não têm experiência em programação. Esses caracteres facilitam a leitura e o uso do código?
Uma razão pela qual o PHP usa o $
é porque, sem ele, o PHP não pode dizer se um nome é uma referência de função ou referência de variável. Isso ocorre porque o idioma permite referências estranhas a funções. Portanto, o $
símbolo ajuda o analisador a separar o espaço para nome.
Eu não tenho esse problema no meu analisador. Portanto, minha pergunta é puramente sobre legibilidade e facilidade de uso. Eu tenho codificado por tantos anos em PHP que, quando vejo $foo
, é fácil para mim identificar isso como uma variável. Estou apenas dando uma preferência de viés a esse identificador?
fonte
sigils
três vezes hoje em conversas.var $x = ...
outype $x = ...
então acho que $ é um exagero. Se você tivesse,$x = ...
então poderia valer a pena. Especialmente se você não deseja dar suporte ao realce de sintaxe em editores comuns. No entanto, como uma preferência, eu não gostosigils
Respostas:
As reais possibilidades e limitações técnicas não são do tipo sugerido ao longo deste segmento. Vamos esclarecer aqueles primeiro.
Aqui está o que $ está possibilitando no PHP:
$return
ou poder usar o mesmo nome para uma variável e uma função / constante, por exemplo$__FILE__
Limitações ou recursos não relacionados ao prefixo $:
Isso significa que não há razão técnica que você não poderia ter
ou
No entanto, você não pode ter (supondo que
return
seja uma palavra-chave)Sem complicações sérias. Se você usasse um prefixo como
$
, não haveria nenhum problema.É uma opinião, mas acredito que um sigilo valeria a pena para não programadores, pois permite que eles usem palavras-chave como nomes de variáveis; para eles, de outra forma, seria uma limitação arbitrária: P
fonte
return = "something";
, o C # possui "palavras-chave contextuais", que também é uma opção que vale a pena conferir ao criar idiomas.@return = "something;"
. Existe alguma quantidade de palavras-chave contextuais, sim, mas torná-las contextuais significaria uma implementação muito mais complicada.Os sigilos realmente fazem muito mais sentido em perl, onde fornecem uma certa quantidade de verificação de tipo. No php, eles não ajudam muito fora do modelo. Você pode ter uma idéia de sua utilidade e legibilidade olhando em diferentes idiomas. Quase ninguém os usa.
Em uma linguagem direcionada ao usuário final em que estou trabalhando, vou ainda mais longe, tornando os identificadores sem distinção entre maiúsculas e minúsculas e permitindo espaços e apóstrofes. Isso me permite criar nomes de variáveis assim
Karl's height
muito mais próximos das linguagens naturais.fonte
At Karl's for the night = true;
map sum
é uma chamada de função parcialmente aplicada - a funçãosum
é passada como um parâmetro paramap
. Mas esses dois são apenas nomes de bibliotecas; portanto, com identificadores de várias palavras, o compilador não pode saber semap sum
é um identificador de várias palavras ou um aplicativo de função baseado em dois identificadores de uma única palavra.Anos atrás, eu aprendi a Applesoft Basic. As strings sempre tinham o sufixo
$
e as matrizes tinham o sufixo%
. É assim que a linguagem funcionou. Você olhou para algo, sabia o que era. Eu nunca mergulhei muito no intérprete para entender por que esse era o caso ou as decisões de design que o fizeram.O sigil no php vem de sua influência perl (que foi influenciada por
awk
esh
). O sigil no perl é um pouco mais do$
que pode identificar muitos tipos diferentes:$
escalar@
Lista%
cerquilha&
codeblock*
typeglobO sigilo identifica qual parte da estrutura da tabela de símbolos você está vendo. Nos bastidores, a entrada da tabela de símbolos para foo (acessada via
*foo
- o typeglob) tem tudo o que pode ser um foo. Há$foo
,@foo
,%foo
, o formatofoo
,&foo
o foo filehandle, etc ...Isso também permite criar um alias de uma variável para outra:
Isto imprime
foo 1 2
- em perl, isso é o que os sigilos são realmente para, não que você deve fazer isso, mas sim que há esta por trás da cenas coisa que eles fazem.Os sigilos não existem tanto para facilitar a leitura, mas para que se possa ter
$foo
e@foo
sem ter uma colisão no espaço para nome (compare outros idiomas onde não se pode ter os doisint foo; int[] foo;
)Sigilos para facilitar a leitura são algo que é aprendido como parte de qualquer idioma - lendo a sintaxe. Hipóteses, você pode impor o próprio tipo (como notação húngara) para fazer parte do identificador.
Algo no lex ao longo das linhas de:
E então você poderia ter código como
Não estou dizendo que essa é uma boa ideia, mas alguém que está acostumado ao idioma poderá lê-lo nativamente e pensar que ele aprimora a legibilidade, enquanto alguém que não está familiarizado com o idioma pode pensar que apenas acrescenta um monte de barulho para o idioma.
No entanto, depois de trabalhar com um idioma definido dessa maneira, eu provavelmente poderia lê-lo sem problemas.
Algumas pessoas gostam deles, outras não. Existem grandes guerras sagradas em vários fóruns debatendo isso e realmente se resume ao quanto você as usou.
Pode-se projetar uma nova linguagem para não-programadores que usa sigils e quem nunca programou antes nunca reclamará um pouco sobre eles. Por outro lado, você não pode tê-los como parte do idioma e, em seguida, os programadores de ruby ou perl reclamam que estão perdendo algumas informações importantes.
Realmente não importa. O que importa é como os sigilos se encaixariam no idioma, se você os usar ou não. Você quer poder fazer
"123 $foo 456"
ou precisa fazer"123 " + foo + " 456"
? É aqui que a decisão deve ser tomada.fonte
"123 $foo 456"
não é ativada pelo prefixo sigil e é completamente ortogonal a ela.$asd
na sintaxe de interpolação de cadeias se$
já fosse usada para prefixos de variáveis, mas não tinha nada a ver com a possibilidade real de implementar a interpolação de cadeias em primeiro lugar.#
que é usado no coffeescript, por exemplo. E coffeescript não prefixa variáveis com#
- na verdade ele não prefixo variáveis em tudo)Não concordo que o PHP use $ para diferenciar vars de funcs. Pelo menos porque o PHP tem sintaxe do tipo C e funcs () parens após o nome.
Leia este post no stack overflow sobre por que $ está no PHP.
Muitas linguagens populares, como C, C ++, C #, Java, não usam $ e podemos diferenciar var fácil de função.
No PHP $ ajuda, por exemplo, quando você escreve: echo "var = $ var"
Sem $ esse truque será impossível.
fonte
echo "var = $var"
fn()[]
onde, com gramática sensata, que teria funcionado imediatamente, sem sequer pensar nisso.Depois de todas essas respostas, quero dar mais alguns pontos a Mathew Foscarini.
são efeitos colaterais deste LEXER , porque é capaz de reconhecer um token.
Tomemos como exemplo: no SQL, usamos "" para poder usar identificadores com palavras reservadas e até identificadores com espaços "Primeiro Nome", "Nome do Grupo". GROUP é uma palavra-chave. Houve um problema - houve uma solução especial.
PS Muito bom comentário de MichaelT.
fonte
$
. Além disso, a "capacidade de colocar variável dentro da string" não se deve ao fato de as variáveis serem prefixadas com um símbolo como$
. Ou seja,"123 $foo 456"
funcionará se a sintaxe da variável for semelhantefoo = 3
ou@foo = 3
. Eles não estão relacionados um com o outro.... um sigilo permite:
Melhor distinguir variáveis de não variáveis . As pessoas que ainda estão aprendendo conceitos básicos podem ter problemas para descobrir quais palavras são variáveis e quais não. Eles geralmente começam lendo exemplos ou códigos de outras pessoas sem formação adequada.
Use palavras - chave reservadas ou nomes de funções como nomes de variáveis . Às vezes, eu achava que alguns desses nomes eram os corretos para uma variável (ou seja,
$count
enquanto havia umacount()
função definida) e agradecia aos sigilos por me permitir usá-los.fonte
$
sinal. Lembro-me do cifrão me confundindo quando eu era criança por causa de sua associação monetária inerente.%
pode ser uma alternativa viável.