Estou tentando aprender mais sobre a função PHP sprintf (), mas o php.net não me ajudou muito, pois ainda estou confuso, por que você gostaria de usá-lo?
Dê uma olhada no meu exemplo abaixo.
Por que usar isso:
$output = sprintf("Here is the result: %s for this date %s", $result, $date);
Quando isso faz o mesmo e é mais fácil escrever IMO:
$output = 'Here is the result: ' .$result. ' for this date ' .$date;
Estou faltando alguma coisa aqui?
$output
, enquanto o segundoecho
é o mesmo.Respostas:
sprintf
possui todos os recursos de formatação do printf original, o que significa que você pode fazer muito mais do que apenas inserir valores variáveis em strings.Por exemplo, especifique o formato numérico (hexadecimal, decimal, octal), número de decimais, preenchimento e muito mais. Google para printf e você encontrará muitos exemplos. O artigo da wikipedia sobre printf deve ajudá-lo a começar.
fonte
sprintf('%03d', $num)
%,8d
por exemplo, para obter um número inteiro de 8 dígitos e vírgulas alinhado corretamente. O usonumber_format
é menos conveniente em umprintf
estilo.sprintf('%2$s %1$s, my name is also %1$s.', 'World', 'Hello');
resultando emHello World, my name is also World.
Existem muitos casos de uso para o sprintf, mas uma maneira de usá-los é armazenando uma string como esta: 'Olá, meu nome é% s' em um banco de dados ou como uma constante em uma classe PHP. Dessa forma, quando eu quero usar essa string, posso simplesmente fazer o seguinte:
Essencialmente, permite uma certa separação no código. Se eu usar 'Olá, meu nome é% s' em muitos lugares do meu código, posso alterá-lo para '% s é meu nome' em um lugar e ele é atualizado automaticamente em qualquer outro lugar, sem necessidade de ir a cada instância e mover-se concatenações.
fonte
Outro uso de
sprintf
é em aplicativos localizados como os argumentos parasprintf
não precisam estar na ordem em que aparecem na string de formato.Exemplo:
Mas uma língua como o francês ordena as palavras de maneira diferente:
(Sim, meu francês é péssimo: eu aprendi alemão na escola!)
Na realidade, você usaria gettext para armazenar as seqüências localizadas, mas você entendeu a ideia.
fonte
É mais fácil de traduzir.
As strings de tradução (gettext) agora são:
Quando traduzido para outro idioma, pode ser impossível ou resultar em frases muito estranhas.
Agora se você tiver
As strings de tradução (gettext) agora são:
O que faz muito mais sentido e é muito mais flexível para traduzir para outros idiomas
fonte
echo sprintf(_("Here is the result: %1$s for this date %2$s"), $result, $date);
Isso permitiria que uma tradução para modificar a frase comoFor the date %2$s, the result is %1$s
A melhor razão que eu descobri é que ela permite que você coloque todas as seqüências de idiomas no seu arquivo de idioma, onde as pessoas podem traduzir e ordená-las conforme necessário - mas você ainda sabe que, independentemente do formato da sequência, deseja mostrar o nome do usuário.
Por exemplo, seu site dirá "Bem-vindo de volta [[Usuário]]" na parte superior da página. Como programador, você não sabe nem se importa com o que os caras da interface do usuário escreverão isso - você apenas sabe que o nome de um usuário será mostrado em algum lugar da mensagem.
Assim, você pode incorporar a mensagem ao seu código sem se preocupar com o que realmente é essa mensagem.
Arquivo Lang (EN_US):
Então você pode suportar qualquer tipo de mensagem em qualquer idioma usando isso no seu código php real.
fonte
Isso é muito útil ao usar uma fonte (externa) para seqüências de caracteres de idioma. Se você precisar de um número fixo de variáveis em uma determinada sequência multilíngue, precisará conhecer apenas a ordem correta:
en.txt
hu.txt
As variáveis inseridas nem precisam estar no início ou no fim em vários idiomas, apenas os pedidos são importantes.
Obviamente, você pode escrever sua própria função para executar essa substituição, sem dúvida, mesmo com alguns pequenos aumentos de desempenho, mas é muito mais rápido do que isso (desde que você tenha uma classe
Language
para ler as strings de idiomas) :Ele também vem com todos os recursos de
printf
, portanto, é também uma linha para formatar vários tipos de variáveis, por exemplo:fonte
Como mencionado, ele permite a formatação dos dados de entrada. Por exemplo, forçar números 2dp, 4 dígitos, etc. É bastante útil para criar strings de consulta do MySQL.
Outra vantagem é que ele permite que você separe o layout da string dos dados que estão sendo alimentados, quase como alimentar os parâmetros. Por exemplo, no caso de uma consulta MySQL:
É claro que esse método tem outros usos, como na impressão de saída como HTML, etc.
Edit: Por razões de segurança , ao usar uma técnica como acima, você deve limpar todas as variáveis de entrada
mysql_real_escape_string()
antes de usar este método , para evitar ataques de inserção do MySQL. Se você analisar entradas não autorizadas, seu site e servidor serão invadidos . (Com exceção de, é claro, variáveis que foram completamente construídas pelo seu código e são garantidas como seguras.)fonte
Usando sprintf () é muito mais limpo e seguro para formatar sua string.
Por exemplo, quando você lida com variáveis de entrada, evita surpresas inesperadas especificando o formato esperado com antecedência (por exemplo, que você está esperando a string [
%s
] ou o número [%d
]). Isso pode potencialmente ajudar com o possível risco de injeção de SQL , mas não impedirá que a string contenha aspas.Também ajuda a lidar com carros alegóricos, você pode especificar explicitamente a precisão do dígito (por exemplo,
%.2f
) que evita o uso de funções de conversão.As outras vantagens são que a maioria das principais linguagens de programação possui sua própria implementação de
sprintf()
. Assim, quando você se familiarizar com ela, fica ainda mais fácil usar, em vez de aprender uma nova linguagem (como concatenar seqüências de caracteres ou converter floats).Em resumo, é uma boa prática usar para ter um código mais limpo e legível.
Por exemplo, veja o exemplo real abaixo :
Ou algum exemplo simples que imprime, por exemplo
'1','2','3','4'
:e impressão com sequência formatada:
onde
printf()
é equivalentesprintf()
, mas gera uma sequência de caracteres formatada em vez de retorná-la (para a variável).Qual é mais legível?
fonte
sprintf()
quebra em várias linhas, onde a string com espaços reservados está em 1 linha e os valores estão em uma linha ou até várias linhas abaixo dela, todos recuados corretamente de curso. Usando sua demo da maneira que descrevi ... i.imgur.com/DFi3ur8.pngMesmo eu pensei a mesma coisa, a menos que eu o usei recentemente. Quando você gera documentos com base nas entradas do usuário, isso será útil.
O que pode ser facilmente escrito como
fonte
"<p>Some big paragraph {$a['name']} more words {$a['age']}</p>"
. NO ENTANTO, NÃO SE ESQUEÇA de higienizar a entrada do usuário ou você abre seu código com vulnerabilidades XSS.Este:
Também pode ser escrito:
Na minha opinião, isso é mais claro de ler, mas posso ver o uso para localizar ou formatar.
fonte
Alguns casos típicos são onde você precisa de um controle mais preciso sobre o formato de saída. Pode ser complicado, por exemplo, garantir que um valor específico tenha uma quantidade específica de espaços preenchidos para a frente, dependendo do comprimento, ou que um número seja emitido em um formato preciso específico.
Existem muitos exemplos no manual do PHP
Além disso, o que vem ao seu exemplo de "mais fácil de escrever". Embora o eco possa ser mais fácil de escrever, o sprintf é mais fácil de ler, especialmente se você tiver muitas variáveis.
Outro motivo para usar o sprintf ou printf pode ser que você queira permitir que um usuário defina o formato de saída de algum valor - você pode com segurança permitir que ele defina um formato de saída compatível com o sprintf.
Ah, e seu exemplo está realmente errado em uma parte.
sprintf
retorna a string, masecho
não -echo
imediatamente a produz e não retorna nada, enquantosprintf
apenas a retorna.fonte
Se você usou o C / C ++, estaria acostumado à função sprintf.
Há uma boa chance de que a segunda linha seja menos eficiente. O eco é projetado como um comando de saída, enquanto o sprintf é projetado para fazer a substituição do token de cadeia. Eu não sou uma pessoa PHP, mas suspeito que haja mais objetos envolvidos com o eco. Se ele agir como o Java, criará uma nova string sempre que algo for adicionado à lista, para que você acabe com 4 strings criadas.
fonte
Às vezes, tenho algo assim, que considero um pouco mais fácil de ler:
fonte
Normalmente, uso o sprintf para garantir que um ID proveniente da entrada do usuário seja um número inteiro, por exemplo:
Também é usado para criar modelos rudimentares (para emails html ou outras coisas), para que você possa reutilizar o modelo em muitos lugares:
Também é muito útil formatar números em diferentes representações (octal, controlar a casa decimal, etc.).
fonte
fonte
O sprintf é particularmente útil ao formatar strings que usam números. Por exemplo,
As laranjas são formatadas como um número inteiro (-2), mas serão agrupadas em números positivos se alguém usar% u para valores não assinados. Para evitar esse comportamento, eu uso a função absoluta, abs (), para arredondar o número para zero da seguinte maneira:
O resultado final é uma declaração com alta legibilidade, construção lógica, formatação clara e flexibilidade para adicionar variáveis adicionais conforme necessário. À medida que o número de variáveis aumenta em combinação com as funções que manipulam essas variáveis, os benefícios se tornam mais aparentes. Como exemplo final:
O lado esquerdo da instrução sprintf expressa claramente a sequência e os tipos de valores esperados, enquanto o lado direito expressa claramente as variáveis usadas e como elas estão sendo manipuladas.
fonte
sprintf
PHP, mas depois vejo esses exemplos complicados criando frutos de "falta" frutas :), cada uma mostrando apenas repetidamente%d
(eabs()
, o que é irrelevante para o tópico), em vez de mostrar algumas das inúmeras opções de formatação de números (que seriam relevantes), mudei de idéia. Mas se você atualizar a resposta, ainda terei meu voto positivo na geladeira para você. :) Thx, felicidades!Bem,
sprintf
tem muitos recursos, como conhecemos um exemplo abaixo:Poucos meses atrás, eu estava precisando converter segundos para horas: formato de minuto: segundos Como
$t = 494050 //seconds
eu queria imprimir assim,137 h 14 m 10 s
então eu vim com a função phpspringf()
Eu apenas segurei os segundos$t
eecho sprintf("%02d h %s%02d m %s%02d s", floor($t/3600), $f, ($t/60)%60, $f, $t%60);
me dei137 h 14 m 10 s
A função sprintf () é muito útil se soubermos usá-la.
fonte
O argumento é o mesmo para usar modelos. Você deseja separar seu Textsleev dos valores reais das variáveis. Além dos poderes adicionais do sprintf mencionados, é apenas uma coisa de estilo.
fonte
Um bom caso de uso para o uso do sprintf é a saída de formatos de números preenchidos e também, ao misturar tipos diferentes em uma sequência. Pode ser mais fácil de ler em muitos casos e torna super simples imprimir diferentes representações da mesma variável, especialmente as numéricas.
fonte
O uso da função sprintf () sobre a concatenação comum tem a vantagem de poder aplicar diferentes tipos de formatação nas variáveis a serem concatenadas.
No seu caso, você tem
e
Vamos dar
$result = 'passed'; date = '23rd';
Usando concatenação comum, você pode obter apenas a saída:
No entanto, se você usar,
sprintf()
poderá obter uma saída modificada, como:Resultado:
fonte
sprintf()
é bem parecido comprintf()
. Se você souberprintf()
em detalhes entãosprintf()
e atévsprintf()
é realmente difícil de entender.uma das coisas que difere
sprintf()
deprintf()
é que você vai precisar declarar uma variável para pegar a saída da função, pois não imprimir diretamente / echo nada. Vamos ver os seguintes trechos de código:Espero que ajude.
fonte
Um "sai", o outro "retorna", essa é uma das principais diferenças.
printf()
Saídassprintf()
Devoluçõesfonte
Você precisa ter cuidado ao usar o sprintf em loops:
O que leva aos seguintes horários (na minha máquina local com PHP 7.2):
Loops: 10000000
'$ a. $ b. $ c. $ d. $ e. $ f 'precisa de 1.4507689476013s
"$ a $ b $ c $ d $ e $ f" precisa de 1.9958319664001s
sprintf ('% s% s% s% s% s% s', $ a, $ b, $ c, $ d, $ e, $ f) precisa 9.1771278381348s
fonte
Eu o uso para mensagens para usuários ou outros tipos "bonitos" de funcionalidade. Por exemplo, se eu sei que vou usar o nome do usuário.
E tem várias mensagens para usar nessa situação. (Ou seja, bloqueando ou seguindo outro usuário)
Você pode criar uma função geral que faça algo com o usuário e adicionar essa string, e não importa qual seja a estrutura da frase, ela parecerá bastante agradável. Eu sempre não gosto de anexar seqüências de caracteres juntas e constantemente usar notação de ponto e fechar e reabrir seqüências apenas para fazer uma frase parecer boa. Eu era um fã no começo, como a maioria, mas isso parece bastante útil quando várias seqüências precisam ser manipuladas e você não deseja codificar permanentemente o posicionamento da variável.
Pense nisso, o que parece melhor?
Ou
Claro que é uma etapa extra, mas e se suas verificações condicionais fizerem um monte de outras coisas funcionais, as citações e os anexos começarão a atrapalhar a codificação funcional.
fonte