Tổng quanPHP - tạo khuôn mẫu với các thẻ tùy chỉnh - đây có phải là cách sử dụng hợp pháp của eval không?
Khoảng cuối năm 2009, tôi đã viết một hệ thống khuôn mẫu đơn giản cho PHP/HTML để được sử dụng trong nhà bởi nhà thiết kế của chúng tôi cho các trang web loại tài liệu-ware. Mục tiêu của hệ thống là cho phép tạo khuôn mẫu trong HTML thuần túy khác thông qua các thẻ tùy chỉnh được xử lý bởi PHP. Ví dụ, một trang templated có thể trông như thế này:
<tt:Page template="templates/main.html">
<tt:Content name="leftColumn">
<p> blah blah </p>
...
</tt:Content>
<tt:Content name="rightColumn">
<p> blah blah </p>
...
</tt:Content>
</tt:Page>
Mẫu bản thân có thể trông như thế này:
<html>
<head>...</head>
<body>
<div style="float:left; width:45%">
<tt:Container name="leftColumn" />
</div>
<div style="width:45%">
<tt:Container name="rightColumn" />
</div>
</body>
</html>
Bên cạnh những trang và nội dung/thẻ container, có một vài thẻ khác bao gồm trong cốt lõi cho các công cụ như kiểm soát luồng, lặp qua bộ sưu tập, xuất các giá trị động, v.v. Khung được thiết kế để dễ dàng thêm bộ thẻ của riêng bạn được đăng ký theo tiền tố và không gian tên khác.
Tuỳ Thẻ để PHP
Làm thế nào để chúng ta phân tích các thẻ tùy chỉnh? Vì không bảo đảm rằng tệp HTML là XML được định dạng tốt nên các giải pháp như XSLT/XPATH sẽ không đáng tin cậy. Thay vào đó, chúng tôi sử dụng regex để tìm các thẻ có tiền tố đã đăng ký và thay thế bằng các mã PHP. Các mã PHP là một thiết kế dựa trên stack ... khi gặp phải một thẻ mở, một đối tượng đại diện cho thẻ được tạo ra đẩy vào stack, và "chức năng khởi tạo" của nó (nếu có) chạy. Bất cứ khi nào một thẻ đóng đã đăng ký được gặp phải, đối tượng gần đây nhất được bật ra khỏi ngăn xếp và "hàm kết xuất" của nó chạy.
Vì vậy, sau khi khuôn khổ thay thế các thẻ khuôn mẫu với PHP, trang ví dụ của chúng ta có thể trông giống như thế này (trong bất động sản đó là một chút xấu hơn):
<?php $tags->push('tt', 'Page', array('template'=>'templates/main.html')); ?>
<?php $tags->push('tt', 'Content', array('name'=>'leftColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->push('tt', 'Content', array('name'=>'rightColumn')); ?>
<p> blah blah </p>
...
<?php $tags->pop(); ?>
<?php $tags->pop(); ?>
Các tốt, xấu, và eval
Bây giờ, làm cách nào để thực thi mã PHP mới được tạo của chúng tôi? Tôi có thể nghĩ ra một vài lựa chọn ở đây. Cách đơn giản nhất là chỉ đơn giản là eval
chuỗi và hoạt động đủ tốt. Tuy nhiên, bất kỳ lập trình viên sẽ cho bạn biết "eval là ác, không sử dụng nó ..." vì vậy câu hỏi là, liệu có bất cứ điều gì thích hợp hơn eval
rằng chúng ta có thể sử dụng ở đây?
Tôi đã xem xét sử dụng tệp tạm thời hoặc được lưu trong bộ nhớ cache, sử dụng các luồng đầu ra, v.v., nhưng theo như tôi thấy, chúng không cung cấp bất kỳ lợi thế thực nào trên eval
. Caching có thể tăng tốc mọi thứ, nhưng trong thực tế tất cả các trang web chúng tôi có trên điều này đã nhanh chóng nhanh chóng, vì vậy tôi thấy không cần phải thực hiện tối ưu hóa tốc độ vào thời điểm này.
Câu hỏi
Đối với mỗi trong những điều trong danh sách này: nó là một ý tưởng tốt? Bạn có thể nghĩ ra một giải pháp thay thế tốt hơn không?
- toàn bộ ý tưởng nói chung (tags tùy chỉnh cho html/php)
- chuyển đổi thẻ mã php thay vì xử lý trực tiếp
- cách tiếp cận dựa trên stack
- việc sử dụng
eval
(hoặc tương tự)
Cảm ơn bạn đã đọc và TIA để được tư vấn. :)
+1 cho câu hỏi được định dạng tốt, được viết tốt và được suy nghĩ kỹ lưỡng. – gpmcadam
Cảm ơn. OT: Tôi thích avatar của bạn. Gigantor từ Evol Intent đang mặc một chiếc áo thun với thiết kế y hệt như vậy khi anh đến đây vài năm trước. Nó có phải là logo cho một hãng thu âm hay một thứ gì đó, hay chỉ là một thiết kế ngẫu nhiên? Đã tự hỏi rằng trong nhiều năm. –