Mais rápida maneira de carga / incluem template PHP?
Pergunta
Eu tenho uma função que percorre diferentes tipos de listagens puxado a partir do MySQL e exibe-os como um "feed" Facebook-esque. Cada tipo de lista tem uma aparência diferente, e, portanto, requer um modelo diferente.
Aqui está o exemplo abaixo função pode ser chamado 100 vezes (se houver 100 Resultados):
function display_listing($id,$type) {
global $abs_path;
switch($type) {
case 'photo':
include($abs_path . '/templates/photo.php');
break;
case 'video':
include($abs_path . '/templates/video.php');
break;
}
}
Existe uma maneira melhor de fazer isso, onde eu não potencialmente acabar com 100 inclui - o que pode retardar o meu processo de baixo? Posso de alguma forma salvar o incluem uma vez na página, e se referem a ele tantas vezes quanto necessário?
... ou isso é a melhor prática?
Além disso, eu quero saber como fazer isso no meu próprio, sem um modelo de motor ...
EDIT:. O problema não é resolvido apenas por include_once (Eu não acredito) ... Eu preciso ser capaz de reutilizar o arquivo incluído várias vezes, substituindo as variáveis ??de cada vez
Solução
Apesar de um switch não é a maneira mais escalável para escrever este código, eu tenho medo que inclui é a única maneira de manter seus modelos em arquivos separados, aqui.
Você poderia, de modo concebível, encapsular o código de cada modelo em uma função, no entanto:
/*
photoTemplate.php
*/
<?php
function loadPhotoTemplate($id) {
?>
<div id="photo">
...
</div>
<?php
}
?>
/*
listing.php
*/
function display_listing($id,$type) {
global $abs_path;
switch($type) {
case 'photo':
include_once($abs_path . '/templates/photo.php');
loadPhotoTemplate($id);
break;
case 'video':
include_once($abs_path . '/templates/video.php');
loadVideoTemplate($id);
break;
}
}
Isso vai carregar cada arquivo de modelo no máximo uma vez, e depois é só chamar a função cada vez que você deseja exibir o modelo com os dados específicos para esse item.
Editar
Provavelmente seria ainda melhor para incluir todos os arquivos de modelo no início, em seguida, basta chamar a função apropriada no switch. * _Once do PHP () funções são lentos, como eles devem consultar a lista dos anteriormente incluídas / arquivos necessários cada vez que eles são chamados.
Outras dicas
criar uma matriz de modelos permitidos. tê-lo funcionar olhada para ver se o modelo solicitado é na matriz. se for, em seguida, usar a variável $ tipo de incluir o arquivo. sim, em geral, você não deve usar dados fornecidos pelo usuário em um nome de arquivo incluem, mas desde que você tenha validado contra uma matriz em boas condições de valores, é seguro.
Se a sua preocupação é o desempenho, eu, pessoalmente, não iria entrar neste circuito em tudo.
presumindo que os itens da lista são vistos com mais freqüência do que eles são criados, gostaria de gerar o HTML como os itens são criados e armazenar a saída ao lado dos dados no banco de dados. (Ou em memcache ou arquivos ou em outro lugar -. Mas gerá-lo e armazená-lo)
Ao fazer isso você mover esta de volta a lógica no processo de criação dos itens que você está fazendo a mesma declaração switch
, mas somente para um item de cada vez -. Você está cortando o laço
Em seguida, em tempo de exibição, em vez de chamar display_listing()
, você apenas ecoar o HTML que você já tenha armazenado.
Eu acho que você deve olhar para algumas coisas. Em primeiro lugar, há ainda a possibilidade de você incluir o mesmo "modelo" 100 vezes? Isso parece uma enorme quantidade de conteúdo para colocar em uma página.
Se eu estou usando minúsculos "snippets" - digamos, uma linha da tabela que de repetir muitas vezes - que tendem a utilizar uma função que retorna uma string, assim:
/* snippets.php */
function tableRow( $row )
{
return
'<tr><td>' . $row['var1'] . '</td>' .
'<td>' . $row['var2'] . '</td></tr>';
}
/* main page/view */
foreach ( $data as $row )
echo tableRow( $row );
A principal vantagem aqui é que você pode ter loops e todos os tipos na função.
Se você está procurando uma variável de substituição reta, você pode criar seus próprios mini-modelos em um arquivo HTML; algo como:
<p>{name}<br />
Posted {date} by {author}</p>
Então leia no modelo, passar a corda toda para a sua função display_listing
, que corre str_replace
em todos os {} variáveis. Eu não acho que seria muito de um acerto de desempenho, mas você tem que experimentar para ter certeza.
Você quer usar a função include_once
em vez de include
.
O include_once () declaração inclui e avalia o arquivo especificado durante a execução do script. Este é um comportamento semelhante ao include (), com a única estar diferença de que, se o código de um arquivo já foi incluído, ele não será incluído novamente. Enquanto o nome sugere, ele será incluído apenas uma vez.
Se você estiver indo para ser incluindo modelos usando uma chave para diferentes palavras-chave, então você deve definir uma variável, digamos $ template_filename, no interruptor e, em seguida, uma vez que você sair da chave, faça o incluem assim:
include_once("/templates/{$filename}.php");
Se você não quiser usar incluindo em tudo, então você também pode usar um motor de templates ...
Este método parece-me razoável no entanto.