Je lisais cette question sur stackoverflow:
/programming/104516/calling-php-functions-within-heredoc-strings
et la réponse acceptée dit de faire des modèles PHP simples comme ceci:
template.php:
<html> <head> <title><?=$title?> </title> </head> <body> <? = getContent ()?> </body> </html>
index.php:
<? php $ title = 'Titre de démonstration'; fonction getContent () { return '<p> Hello World! </p>'; } include ('template.php'); ?>
Pour moi, ce qui précède n'est pas bien structuré dans le sens où template.php dépend de variables définies dans d'autres scripts. Et vous utilisez un include () pour exécuter du code lorsque vous le faites include('template.php')
(par opposition à l'utilisation de include () pour inclure une classe ou une fonction qui n'est pas immédiatement exécutée).
Je pense qu'une meilleure approche consiste à envelopper votre modèle dans une fonction:
template.php:
<? php modèle de fonction ($ title, $ content) { ob_start (); ?> <html> <head> <title><?=$title?> </title> </head> <body> <? = $ content?> </body> </html> <? php return ob_get_clean (); } ?>
index.php:
<? php require_once ('template.php'); modèle d'impression ('Titre de démonstration', '<p> Bonjour tout le monde! </p>'); ?>
La deuxième approche est-elle meilleure? Existe-t-il une meilleure façon de procéder?
extract($this->properties);
pour extraire les propriétés en variables, juste avant l'instruction include.Un modèle dépendra toujours de variables externes, et avec PHP étant un langage dynamique, il n'y a aucun moyen d'imposer au moment de la compilation qu'elles seront là. La première approche est donc probablement très bien; il reste cependant quelques problèmes:
Une approche très simple consiste à écrire une fonction, de préférence avec un nom très court, qui prend en charge les deux; appeler cela
_()
semble être une convention commune. Une version simple pourrait ressembler à ceci:Et puis dans votre modèle, vous feriez:
Plus de choses à faire avec la
_()
fonction:htmlspecialchars
appel, dans les cas où vous souhaitez lui passer du HTML plutôt que des chaînes brutes.Array
etObject
, mais plutôt quelque chose de significatif (ou chaîne vide).la source
Le premier
template.php
est plus facile à charger tel quel dans dreamweaver / bluegriffon / que ce soit et édité par un concepteur Web non averti côté serveur, le second ... eh bien, il pourrait toujours le faire, mais il est beaucoup plus susceptible de se briser pendant le processus d'édition .J'irais avec le premier pour qu'il ressemble à du HTML avec des avantages , comme le préfèrent généralement les concepteurs tiers.
la source
Parce que Codeigniter est mon framework préféré, je vous propose une solution Codeigniter-ish:
Votre modèle ressemblerait à:
Et vous le rendriez en instanciant la classe, en passant des données dans un tableau en tant que paramètre constructeur et en appelant la méthode 'render':
De cette façon, vous n'exécutez pas directement le code inclus et vous gardez également votre modèle lisible, donc les concepteurs seront heureux.
la source
Php n'est pas un langage de programmation. L'écriture fortement typée n'est donc pas possible si votre langue n'a pas de véritable système de typage. Mais vous pouvez aider votre IDE comme PHP-Storm à faire le tour que vous voulez ...
Votre définition de vue:
Votre fichier modèle:
la source