No PHP, as declarações de string HEREDOC são realmente úteis para a saída de um bloco de html. Você pode fazer com que ele analise as variáveis apenas prefixando-as com $, mas para uma sintaxe mais complicada (como $ var [2] [3]), você deve colocar sua expressão entre {} colchetes.
No PHP 5, é possível fazer chamadas de função entre {} colchetes dentro de uma string HEREDOC, mas você precisa trabalhar um pouco. O nome da função em si deve ser armazenado em uma variável e você deve chamá-la como se fosse uma função nomeada dinamicamente. Por exemplo:
$fn = 'testfunction';
function testfunction() { return 'ok'; }
$string = <<< heredoc
plain text and now a function: {$fn()}
heredoc;
Como você pode ver, isso é um pouco mais confuso do que apenas:
$string = <<< heredoc
plain text and now a function: {testfunction()}
heredoc;
Existem outras maneiras além do primeiro exemplo de código, como sair do HEREDOC para chamar a função ou reverter o problema e fazer algo como:
?>
<!-- directly output html and only breaking into php for the function -->
plain text and now a function: <?PHP print testfunction(); ?>
O último tem a desvantagem de que a saída é colocada diretamente no fluxo de saída (a menos que eu esteja usando buffer de saída), o que pode não ser o que desejo.
Então, a essência da minha pergunta é: existe uma maneira mais elegante de abordar isso?
Editar com base nas respostas: certamente parece que algum tipo de mecanismo de modelo tornaria minha vida muito mais fácil, mas exigiria que eu basicamente invertesse meu estilo PHP usual. Não que isso seja uma coisa ruim, mas explica minha inércia. Porém, estou disposto a descobrir maneiras de tornar a vida mais fácil, então estou procurando modelos agora.
Text {$string1} Text {$string2} Text
no heredoc.Respostas:
Eu não usaria HEREDOC para isso, pessoalmente. Simplesmente não é um bom sistema de "construção de modelos". Todo o seu HTML está bloqueado em uma string que tem várias desvantagens
Obtenha um mecanismo de modelo básico ou apenas use PHP com inclusões - é por isso que a linguagem tem os delimitadores
<?php
e?>
.template_file.php
index.php
fonte
<?=$valueToEcho;?>
ou<%=$valueToEcho;%>
depende de suas configurações INI.<?=$title?>
é muito mais agradável do que <? Php echo $ title; ?>. A desvantagem é, sim, para a distribuição, muitos ini têm tags curtas. Mas , adivinhe ?? A partir do PHP 5.4 , as tags curtas são habilitadas no PHP independentemente das configurações ini! Então, se você está programando com um requisito 5.4+ (digamos que você esteja usando características, por exemplo), vá em frente e use essas tags curtas incríveis !!Se você realmente deseja fazer isso, mas um pouco mais simples do que usar uma classe, você pode usar:
fonte
$my_string = "Half the number of seconds since the Unix Epoch: {$fn(time() / 2 . ' Yes! Really!')}";
$fn = function fn($data) { return $data; };
$fn = function ($data) { return $data; };
$fn=function($data){return $data;};
rhis deve ser o mais curtoEu faria o seguinte:
Não tenho certeza se você consideraria isso mais elegante ...
fonte
Tente isto (como uma variável global ou instanciada quando você precisar):
Agora, qualquer chamada de função passa pela
$fn
instância. Portanto, a função existentetestfunction()
pode ser chamada em um heredoc com{$fn->testfunction()}
Basicamente, estamos agrupando todas as funções em uma instância de classe e usando o
__call magic
método do PHP para mapear o método da classe para a função real que precisa ser chamada.fonte
call_user_func_array
, da última vez nos comentários em php.net: php.net/manual/en/function.call-user-func-array.php # 97473Para completar, você também pode usar o hack do analisador de
!${''}
magia negra:fonte
false == ''
. Defina uma variável com um nome de comprimento 0 (''
). Defina-o com o valor desejado (${''} = date('Y-m-d H:i:s', strtotime('-1 month'))
). Negue-o (!
) e converta-o em uma variável (${false}
).false
precisa ser convertido em uma string e(string)false === ''
. Se você tentar imprimir um valor falso, ocorrerá um erro. A seqüência de caracteres a seguir funciona em ambos truthy e valores Falsas, à custa de ser ainda mais ilegível:"${(${''}=date('Y-m-d H:i:s', strtotime('-1 month')))!=${''}}"
.NAN
também, use"${(${''} = date('Y-m-d H:i:s', strtotime('-1 month')) )==NAN}"
.Estou um pouco atrasado, mas me deparei com isso aleatoriamente. Para qualquer futuro leitor, eis o que eu provavelmente faria:
Gostaria apenas de usar um buffer de saída. Então, basicamente, você inicia o buffer usando ob_start (), então inclui seu "arquivo de modelo" com quaisquer funções, variáveis, etc. dentro dele, pega o conteúdo do buffer e grava em uma string e então fecha o buffer. Então, você usou todas as variáveis de que precisa, pode executar qualquer função e ainda tem o realce de sintaxe HTML disponível em seu IDE.
Aqui está o que quero dizer:
Arquivo de modelo:
Roteiro:
Portanto, o script inclui o template_file.php em seu buffer, executando quaisquer funções / métodos e atribuindo quaisquer variáveis ao longo do caminho. Em seguida, você simplesmente grava o conteúdo do buffer em uma variável e faz o que quiser com ele.
Dessa forma, se você não quiser ecoá-lo na página naquele segundo, não será necessário. Você pode fazer um loop e continuar adicionando à string antes de enviá-la.
Acho que essa é a melhor maneira de fazer se você não quiser usar um mecanismo de templates.
fonte
Este trecho definirá variáveis com o nome de suas funções definidas dentro do escopo do usuário e as vinculará a uma string que contém o mesmo nome. Deixe-me demonstrar.
Agora funcionará.
fonte
encontrou uma boa solução com a função de agrupamento aqui: http://blog.nazdrave.net/?p=626
fonte
Acho que usar o heredoc é ótimo para gerar código HTML. Por exemplo, acho o seguinte quase completamente ilegível.
No entanto, para alcançar a simplicidade, você é forçado a avaliar as funções antes de começar. Não acredito que seja uma restrição tão terrível, já que, ao fazer isso, você acaba separando seu cálculo da exibição, o que geralmente é uma boa ideia.
Acho que o seguinte é bastante legível:
Infelizmente, embora tenha sido uma boa sugestão que você fez em sua pergunta vincular a função a uma variável, no final, isso adiciona um nível de complexidade ao código, que não vale a pena, e torna o código menos legível, o que é a principal vantagem do heredoc.
fonte
Eu daria uma olhada no Smarty como um mecanismo de template - eu não tentei nenhum outro, mas me fez bem.
Se você quiser manter sua abordagem atual sem modelos, o que há de tão ruim no buffer de saída? Isso lhe dará muito mais flexibilidade do que ter que declarar variáveis que são os nomes das strings das funções que você deseja chamar.
fonte
Um pouco tarde, mas ainda assim. Isso é possível no heredoc!
Dê uma olhada no manual do php, seção "Sintaxe complexa (curva)"
fonte
Aqui está um bom exemplo usando a proposta @CJDennis:
Por exemplo, um bom uso para a sintaxe HEREDOC é gerar formulários enormes com relacionamento mestre-detalhe em um banco de dados. Pode-se usar o recurso HEREDOC dentro de um controle FOR, adicionando um sufixo após cada nome de campo. É uma tarefa típica do lado do servidor.
fonte
você está se esquecendo da função lambda:
Você também pode usar a função create_function
fonte
Caras devem notar que também funciona com strings entre aspas.
http://www.php.net/manual/en/language.types.string.php
Dica interessante de qualquer maneira.
fonte
fonte
você deveria tentar . após terminar o ETO; comando você deve dar um enter.
fonte
Isso é um pouco mais elegante hoje no php 7.x
fonte