Saya membaca pertanyaan ini di stackoverflow:
/programming/104516/calling-php-functions-within-heredoc-strings
dan jawaban yang diterima mengatakan untuk melakukan templat PHP biasa seperti ini:
template.php:
<html> <head> <title><?=$title?> </title> </head> <body> <? = getContent ()?> </body> </html>
index.php:
<? php $ title = 'Judul Demo'; function getContent () { return '<p> Hello World! </p>'; } termasuk ('template.php'); ?>
Bagi saya hal di atas tidak terstruktur dengan baik dalam arti bahwa template.php tergantung pada variabel yang didefinisikan dalam skrip lain. Dan Anda menggunakan include () untuk mengeksekusi kode ketika Anda melakukannya include('template.php')
(bukan menggunakan include () untuk menyertakan kelas atau fungsi yang tidak segera dieksekusi).
Saya merasa pendekatan yang lebih baik adalah dengan membungkus template Anda di dalam suatu fungsi:
template.php:
<? php templat fungsi ($ judul, $ konten) { ob_start (); ?> <html> <head> <title><?=$title?> </title> </head> <body> <? = $ content?> </body> </html> <? php return ob_get_clean (); } ?>
index.php:
<? php require_once ('template.php'); print template ('Demo Title', '<p> Hello World! </p>'); ?>
Apakah pendekatan kedua lebih baik? Apakah ada cara yang lebih baik untuk melakukannya?
extract($this->properties);
untuk mengekstrak properti ke dalam variabel, tepat sebelum pernyataan include.Templat akan selalu bergantung pada variabel luar, dan dengan PHP sebagai bahasa yang dinamis, tidak ada cara untuk menegakkan pada waktu kompilasi bahwa mereka akan ada di sana. Jadi pendekatan pertama mungkin baik-baik saja; masih ada beberapa masalah:
Pendekatan yang sangat mudah adalah menulis suatu fungsi, lebih disukai dengan nama yang sangat pendek, yang menangani keduanya; menyebutnya
_()
tampaknya menjadi konvensi umum. Versi sederhana mungkin terlihat seperti ini:Dan kemudian di templat Anda, Anda akan melakukan:
Lebih banyak hal yang harus dilakukan dengan
_()
fungsi:htmlspecialchars
panggilan, untuk kasus-kasus di mana Anda ingin meneruskan HTML ke dalamnya daripada string mentah.Array
danObject
, tetapi sesuatu yang bermakna (atau string kosong).sumber
Yang pertama
template.php
lebih mudah untuk memuat apa adanya ke dreamweaver / bluegriffon / apa pun dan diedit oleh perancang web non-savvy sisi-server, yang kedua ... well itu masih bisa, tetapi jauh lebih mungkin untuk istirahat selama proses pengeditan .Saya akan menggunakan yang pertama untuk membuatnya tetap terlihat seperti HTML dengan manfaat , seperti yang biasanya disukai oleh desainer pihak ke-3.
sumber
Karena Codeigniter adalah kerangka kerja favorit saya, saya mengusulkan solusi Codeigniter-ish:
Template Anda akan terlihat seperti:
Dan Anda akan merendernya dengan membuat instance kelas, meneruskan data dalam array sebagai parameter konstruktor dan memanggil metode 'render':
Dengan cara ini Anda tidak secara langsung mengeksekusi kode yang disertakan, dan Anda juga membuat template Anda dapat dibaca, sehingga desainer akan senang.
sumber
Php bukan bahasa pemrograman. Jadi menulis dengan mengetik sangat tidak mungkin jika bahasa Anda tidak memiliki sistem tipe nyata. Tetapi Anda dapat membantu IDE Anda seperti PHP-Storm untuk melakukan trik yang Anda inginkan ...
Definisi tampilan Anda:
File template Anda:
sumber