2010-10-11 32 views
12

Nếu tôi đặt một tuyên bố include hoặc require bên trong điều kiện đánh giá là false, liệu trình thông dịch PHP có bỏ qua tệp bao gồm hay không.Hành vi của PHP bao gồm/yêu cầu bên trong có điều kiện

Một ví dụ sẽ là:

if ($some_user_var) { 
    require 'this.php'; 
} else { 
    //do stuff 
} 

Tôi đọc ở đâu đó rằng require sẽ luôn luôn được bao gồm bởi các thông dịch viên không phụ thuộc vào điều kiện, nhưng include sẽ không. Nếu đúng như vậy, chỉ cần chuyển từ require sang include có thể có nghĩa là tăng tốc miễn phí do giảm I/O và phân tích chi phí phân tích.

Nó có thể tạo sự khác biệt nếu tôi đang chạy bộ tiền xử lý như eAccelerator, nhưng hãy giả sử là không.

+0

Tôi nghĩ rằng những gì bạn đọc ở đâu đó giống như thế này: 'require' sẽ hủy bỏ việc thi hành với lỗi nghiêm trọng trong khi' include' sẽ không (trên thất bại, tất nhiên). Điều này có thể được hiểu là 'require' sẽ luôn bao gồm tệp của bạn hoặc tập lệnh sẽ chết. – acm

+0

Bạn có cơ hội sở hữu cuốn sách này không? http://www.amazon.co.uk/PHP-World-Wide-Web-Quickstart/dp/0321245652 Tôi cũng được dạy lời nói dối này! – Matthew

Trả lời

20

Nó sẽ chỉ được bao gồm nếu điều kiện là đúng. Tôi không biết bạn đọc ở đâu khác, nhưng họ sai.

Sự khác biệt duy nhất giữa includerequireinclude sẽ cảnh báo nếu không thành công, trong khi require sẽ gây ra lỗi nghiêm trọng.

Để xác nhận điều này, hãy xem the PHP manual page for require.

(ps - nếu bạn đang làm có điều kiện bao gồm, tùy thuộc vào những gì reaon là, bạn có thể xem xét sử dụng include_once() hoặc require_once() thay)

+1

IIRC, hành vi mà ông mô tả được sử dụng là trường hợp cho đến khi PHP 4.cái gì đó. –

+0

Ồ, tôi thực sự đang sử dụng require_once, tôi đơn giản hóa vì lợi ích của câu hỏi. Nhưng cảm ơn –

+0

Cảm ơn bạn đã liên kết đến trang hướng dẫn sử dụng. Từ một trong các nhận xét: "Vì các trạng thái thủ công yêu cầu và require_once là của PHP 4.02 không còn gọi tệp nếu dòng mã nó đang chạy không nên được thực hiện". Hoàn hảo :) –

1

Điều này không đúng. require sẽ không bao gồm các tệp được gói trong các khối mà chúng không bao giờ được gọi, trình thông dịch php không bỏ qua chúng. includerequire có rất ít hoặc không có sự khác biệt về hiệu suất (đối với vấn đề đó không phải chúng có nhiều sự khác biệt từ _once, mặc dù nó quan trọng hơn).

1

Tôi đọc ở đâu đó rằng quá. Đối số diễn ra như sau:

Nếu bạn đặt một điều kiện xung quanh, PHP không có cách nào biết được nó có cần hay không cho đến khi nó bắt đầu diễn giải mã và không thể giải mã cho đến khi nó được giữ tất cả các biến và hàm và do đó - các tệp. Vì vậy, nó LOAD UP tất cả các tập tin bất kể điều kiện và sau đó thả chúng trở lại trong "biên dịch" cuối cùng.

Mặc dù sau đó một lần nữa, nếu bạn bọc một điều kiện xung quanh một tệp PHP có lỗi trong đó, nó sẽ không phá vỡ nó. Và nếu bạn khai báo biến trong tệp được bao gồm và sau đó sử dụng giá trị của biến để xác định có bao gồm biến hay không, nó không nhận giá trị của nó :)

Có thể đây là vấn đề trong phiên bản cũ của PHP?

Tôi chưa thử nghiệm nó liên quan đến tốc độ tải và sử dụng RAM - nhưng tôi rất muốn nhận được câu trả lời dứt khoát cho điều này. Có bất kỳ chi phí nào liên quan đến điều kiện bao gồm không?

+0

Quan sát tốt về việc bao gồm các tệp có lỗi trong đó. Nếu nó đang tải trước chúng, bạn có thể kiểm tra điều đó bằng cách bao gồm một tệp dữ liệu cực mạnh. – Frug

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