2010-01-13 32 views
6

Trái ngược với việc sử dụng lệnh include, thực thi php được bao gồm trong tệp ... có thể lưu nội dung của tệp php vào biến không - nhưng với php vẫn còn nguyên vẹn và có thể thực thi được không?PHP file_get_contents với php còn nguyên vẹn?

Mục tiêu của tôi trông giống như sau:

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

Tôi biết thats một ví dụ câm ... nhưng tôi hy vọng nó minh họa ý tưởng chung. Nếu tôi phải lặp qua các mẫu 50 lần trên một trang (nói rằng nó là một danh sách các blog), có vẻ như câm để thực sự chạy và bao gồm cho mỗi trang.

Tôi có sai không? Có cách nào để làm việc này không?

+0

Âm thanh như tối ưu hóa sớm. Sử dụng bộ nhớ cache opcode nếu bạn lo lắng về việc đọc và biên dịch tệp nhiều lần. –

+0

@BenJames Không PHP tự nhiên tối ưu hóa các tạp chí lặp đi lặp lại? IIRC ai đó đã đề cập đến điều này trong một cuộc thảo luận về cùng một vấn đề; sẽ tìm nguồn nếu tìm thấy. – Dan

Trả lời

16

Làm thế nào về vấn đề này ...

function getTemplate($file) { 

    ob_start(); // start output buffer 

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

} 

Về cơ bản, điều này sẽ có được bất cứ điều gì $file là, và phân tích nó với PHP, sau đó trở về đầu ra vào một biến.

+0

để thats mát ... nhưng sẽ $ mẫu bảo quản các công cụ PHP trong tập tin?hoặc nó sẽ biến thành văn bản thuần túy? – johnnietheblack

+1

nó sẽ được thực thi – OcuS

+0

Như OcuS đã nói, nó sẽ được phân tích cú pháp và thực hiện: ví dụ: sẽ trở thành/yoursite/etc – alex

0

Viết hàm trong tập lệnh PHP đi kèm trả về kết quả mong muốn. Xác định một hằng số trong tập lệnh PHP chính. Trong tập lệnh PHP được bao gồm, hãy kiểm tra sự vắng mặt của hằng số đã nói và lặp lại giá trị trả về của hàm nếu trường hợp này xảy ra.

0

Mặc dù nó thường được mục đích để được cái ác, bạn có thể thử sử dụng eval() cùng với get_file_contents()

+0

Tôi sử dụng 'eval()' trong CMS cơ bản của trang web của mình. Woops. –

0

Nếu bạn đang phát triển trong 5.3 nó dễ dàng hơn nhiều nhưng ngay cả trên 5.2, bạn có thể sử dụng những gì được gọi là một chức năng ẩn danh để làm điều này.

Chức năng ẩn danh sẽ cho phép bạn chuyển mã xung quanh dưới dạng biến. Để tải mã này từ một tập tin bạn có thể phải file_get_bytes vào một chuỗi, eval đó, sau đó đưa vào trong một biến nhưng bạn nhận được điểm tôi hy vọng.

5.3: Anonymous functions

5,2: create_function

1

Làm bao gồm vào vòng lặp không phải là SO câm.

Tất cả các biến được xác định trước khi bao gồm sẽ có thể truy cập được vào mẫu của bạn.

Hãy đơn giản!

== EDIT ==

Hoặc có thể bạn có thể cải thiện alex của câu trả lời:

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')); 

(Không đơn giản như vậy nữa ^^)

+0

haha, K.I.S.S. - giữ cho nó đơn giản ngu ngốc. lời khuyên tốt nhất mà tôi từng có. làm tổn thương cảm xúc của tôi mỗi lần. cuộc gọi tốt, cảm ơn :) – johnnietheblack

+0

câu hỏi mặc dù ... tôi theo nghĩa đen mong đợi cho một số trang có 50-100 danh sách để lặp qua ... bạn có nghĩ rằng nó sẽ bắt đầu thực hiện hiệu suất nếu tôi bao gồm mọi thời gian? – johnnietheblack

+0

Tôi chắc chắn rằng nó nhanh và tôi đoán php-engine có một hệ thống bộ nhớ đệm để mẫu không được phân tích cú pháp hoàn toàn mỗi lần (không chắc chắn 'bout, big big guess :)) – OcuS

4

Bằng cách sử dụng $content = file_get_contents('/path/to/your/file.php'); tất cả các thẻ PHP sẽ được bảo quản, sau đó bạn có thể eval() hoặc tokenize chúng để làm bất cứ điều gì bạn muốn.

+2

+1 Mặc dù có ý nghĩa về mặt an ninh và hiệu suất mà những người nói tiếng này có thể lấy từ mũ của họ, tôi tin rằng đây là câu trả lời đúng theo câu hỏi. – Dan

+0

eval ... ho .. ác ... xin lỗi về điều đó. – Mayhem

Các vấn đề liên quan