2010-01-13 6 views
6

Au lieu d'utiliser un include, qui exécute le php inclus dans le fichier ... est-il possible d'enregistrer le contenu d'un fichier php dans une variable - mais avec le php encore intact et exécutable?PHP file_get_contents avec PHP intact?

Mon but ressemble à:

$template = some_imaginary_include_function('myfile.php'); 
foreach($list_of_blogs as $blog) { 
    // somehow get blog content in template and render template; 
} 

Je sais que ce un exemple stupide ... mais je l'espère, elle illustre l'idée générale. Si je dois parcourir le modèle 50 fois sur une page (disons que c'est une liste de blogs), il semble stupide de courir et d'inclure pour chacun.

Je me trompe? Y a-t-il un moyen de faire cela?

+0

Cela ressemble à une optimisation prématurée. Utilisez un cache d'opcode si vous êtes inquiet de lire et de compiler le fichier plusieurs fois. –

+0

@BenJames PHP n'optimise-t-il pas nativement les inclusions répétées? IIRC quelqu'un a mentionné cela dans une discussion de la même question; sera source si trouvé. – Dan

Répondre

16

Que diriez-vous ... ce

function getTemplate($file) { 

    ob_start(); // start output buffer 

    include $file; 
    $template = ob_get_contents(); // get contents of buffer 
    ob_end_clean(); 
    return $template; 

} 

Fondamentalement, cela obtenir ce $file est, et analyser avec PHP, puis revenir la sortie dans une variable.

+0

donc c'est cool ... mais le template $ préservera-t-il les trucs PHP dans le fichier?ou va-t-il se transformer en texte brut? – johnnietheblack

+1

il sera exécuté – OcuS

+0

Comme l'a dit OcuS, il sera analysé et exécuté: par ex. deviendra/yoursite/etc – alex

0

Écrire une fonction dans le script PHP inclus qui renvoie la sortie désirée. Définir une constante dans le script PHP principal. Dans le script PHP inclus, vérifiez l'absence de ladite constante et renvoyez la valeur de retour de la fonction si c'est le cas.

0

Même si elle est souvent prétendu être le mal, vous pouvez essayer d'utiliser eval() avec get_file_contents()

+0

J'utilise 'eval()' dans le CMS de base de mon site web. Woops. –

0

Si vous développez en 5.3, il est beaucoup plus facile, mais même sur 5.2, vous pouvez utiliser ce qu'on appelle une fonction anonyme à faire ce.

Une fonction anonyme vous permettra de faire passer le code en tant que variable. Pour charger ce code à partir d'un fichier, vous devrez peut-être fichier_get_bytes dans une chaîne, eval cela, puis mettre dans une variable, mais vous obtenez le point que j'espère.

5,3: Anonymous functions

5,2: create_function

1

Faire l'inclure dans la boucle est pas SO muet.

Toutes les variables définies avant l'inclusion seront accessibles dans votre modèle.

Restez simple!

== EDIT ==

Ou vous pourriez peut-être améliorer la réponse de alex:

function getTemplate($file, $template_params = array()) { 

    ob_start(); // start output buffer 
    extract($template_params); // see PHPDoc 
    // from here $var1 will be accessible with value "value1" 
    // so your template may contain references to $var1 

    include $file; 
    $template = ob_get_contents(); // get contents of buffer 
    ob_end_clean(); 
    return $template; 

} 
echo getTemplate('your_template.php', array('var1' => 'value1')); 

(Pas si simple plus ^^)

+0

haha, K.I.S.S. - Gardez-le simple stupide. Le meilleur conseil que j'ai jamais eu. blesse mes sentiments à chaque fois. bon appel, merci :) – johnnietheblack

+0

question cependant ... je m'attends littéralement à ce que certaines pages aient 50-100 listes à parcourir ... pensez-vous qu'il commencera à effectuer des performances si j'inclus à chaque fois? – johnnietheblack

+0

Je suis sûr que c'est rapide et je suppose que php-engine a un système de cache donc le template n'est pas complètement analysé à chaque fois (pas sûr de ça, big big guess :)) – OcuS

4

En utilisant $content = file_get_contents('/path/to/your/file.php'); toutes les balises PHP seront préservé, vous pouvez alors eval() ou tokenize pour faire ce que vous voulez.

+2

+1 Malgré les implications en matière de sécurité et de performance que les non-voyants peuvent tirer de leurs chapeaux, je crois que c'est la bonne réponse selon la question. – Dan

+0

eval ... tousse ... mal ... désolé pour ça. – Mayhem

Questions connexes