2010-03-29 29 views
5

Làm cách nào để biết liệu hàm return() có được gọi từ bên trong tệp được bao gồm hay không. Vấn đề là include() trả về 'int 1', ngay cả khi return() không được gọi. Dưới đây là một ví dụ ...PHP - Làm thế nào tôi có thể kiểm tra xem return() có được gọi từ tệp include() 'd không?

included_file_1.php

<?php 

return 1; 

included_file_2.php

<?php 

echo 'no return here, meep'; 

main.php

<?php 

$ret = include('included_file_1.php'); 

// This file DID return a value, int 1, but include() returns this value even if return() wasn't called in the included file. 
if ($ret === 1) 
{ 
    echo 'file did not return anything'; 
} 

var_dump($ret); 

$ret = include('included_file_2.php'); 

// The included file DID NOT return a value, but include() returns 'int 1' 
if ($ret === 1) 
{ 
    echo 'file did not return anything'; 
} 

var_dump($ret); 

Chỉnh sửa: Là một giải pháp tạm thời, tôi đang thu được đầu ra từ include() (từ các câu lệnh echo/print). Nếu bất kỳ đầu ra nào được tạo ra, tôi bỏ qua giá trị trả về từ include().

Không đẹp, nhưng nó cung cấp chức năng tôi cần trong ứng dụng/khung web của tôi.

Trả lời

2

Câu hỏi hay. Nhìn vào các ví dụ trong manual, tôi đoán bạn không thể.

Ý tưởng giải pháp tốt nhất mà bạn nghĩ đến là làm cho tất cả các gói của bạn trong dự án của bạn không trả lại giá trị khỏa thân, nhưng một mảng chứa giá trị trả về (return array(1);).

Mọi thứ khác đến với tâm trí (ít nhất là tôi) liên quan đến việc xác định một số hằng số hoặc biến để gắn cờ cho dù bạn đang ở trong bao gồm hay không. Không có gì tao nhã.

0

Nếu không có gì để trả lại trong tệp được bao gồm, thì hàm include trả về 1 theo mặc định. Nếu không, nó sẽ trả lại bất cứ điều gì được gửi bởi tệp được bao gồm. Echo và báo cáo in không phải là một sự trở lại, nó phải là câu lệnh 'return' được chỉ định bởi PHP. Mọi thứ khác sẽ được xử lý bình thường. Mã này về cơ bản nói, 'tệp đã thực thi đúng chưa?' và nó trở lại 1, 'có nó đã làm.'

PHP: include - Manual - Hãy xem "Xử lý trả lại" ngay bên dưới thông báo cảnh báo bảo mật và sau đó xem Ví dụ 5 và văn bản ngay bên dưới. Nó giải thích nó một cách hoàn hảo.

+0

Có, nhưng nếu tập lệnh được bao gồm, hãy bao gồm() sẽ trả về giá trị được chuyển đến trả về() trong tệp được bao gồm HOẶC 'int 1' để cho biết bao gồm thành công. Vì vậy, khi include() trả về 'int 1', tôi không thể biết đó là giá trị trả về từ tệp được bao gồm hay include(). –

+0

Vô nghĩa. Nếu bạn BIẾT rằng tệp trả về giá trị của riêng nó thì bạn có thể giả định rằng giá trị là giá trị bạn muốn nó trả về. Bao gồm sẽ không bao giờ ghi đè giá trị trả về của bạn để gửi 1 mà nó đã hoàn thành. Đây là về bạn biết chính xác những gì các tập tin của bạn làm và những giá trị đi ra khỏi chúng. Nếu bạn biết tập tin của bạn không trả lại bất cứ điều gì, sau đó giá trị luôn luôn là 1. – animuson

+0

Animuson: Có, nhưng tôi không biết những gì các tập tin của người khác đang làm. Cũng sẽ có trường hợp cạnh mà popup sẽ phá vỡ khuôn khổ, và sẽ là một pita cho bất cứ ai khác để gỡ lỗi. –

1

Hành vi này là do thiết kế - báo cáo kết quả include trả về 1 khi bao gồm là thành công (hoặc giá trị return 'ed bởi các tập tin bao gồm), như thực hiện kịch bản có thể tiếp tục ngay cả khi một include thất bại và một lập trình viên có thể những gì để kiểm tra đối với trường hợp này.

Từ hướng dẫn:

[giá trị trả về] là 1 vì bao gồm đã thành công. Để ý sự khác biệt giữa các ví dụ trên, hãy chú ý sự khác biệt của . Sử dụng đầu tiên return() trong số tệp được bao gồm trong khi tệp còn lại không. Nếu không thể đưa tệp vào, FALSE được trả lại và E_WARNING là đã được phát hành.

Trong trường hợp này, chỉ cần không sử dụng 1 trong mã của bạn làm giá trị trả về cho tệp, tức là giá trị trả lại này được dành riêng để sử dụng bởi câu lệnh PHP include.

+0

Điều này stinks, sau đó tôi sẽ không thể gracefully xử lý đầu ra :(.Tôi đoán thay thế duy nhất của tôi là để kiểm tra nếu bao gồm() sản xuất bất kỳ đầu ra (echo/in) .Nếu nó đã làm, sau đó tôi sẽ bỏ qua –

0

$ ret = include ('...'); Sẽ luôn trả về 1 nếu tệp tồn tại.

Thử tạo biến và kiểm tra xem biến đó đã được đặt chưa.

include_file_1.php

<?php 
$includeFile1 = true; 

main.php

<?php 
include('included_file_1.php'); 

if (isset($includeFile1) == true) 
{ 
    echo "It was included"; 
} 
1

Bạn có thể có thể tận dụng debug_backtrace(), nhưng nó không phải là thực sự là một giải pháp lý tưởng. Nó rất chậm và bạn phải làm rất nhiều việc để có được kết quả mong muốn.

Rất tiếc, tình huống bạn mô tả nằm ngoài mức sử dụng thông thường là includereturn. Tôi sẽ đơn giản thay đổi logic của bạn để làm việc với nó. Tại sao không có các tệp thường không gọi return ở cuối, chỉ cần gọi return 2? Bằng cách đó bạn sẽ nhận được một giá trị mà vẫn đánh giá đúng trên các so sánh bình thường, nhưng bạn có thể sử dụng nó như một sự phân biệt giữa các cuộc gọi return 1 khác.

+0

Ý tưởng tuyệt vời với 'debug_backtrace' - không nghĩ về điều đó.Tuy nhiên, tôi không nghĩ rằng nó sẽ làm việc, như các tập tin bao gồm sẽ không để lại bất kỳ dấu vết (không có ý định chơi chữ) trong backtrace khi được gọi sau khi bao gồm. –

+0

Zombat: Lời khuyên tuyệt vời nhưng tôi debug_backtrace() bỏ qua bao gồm() và không vào. Nhưng, tôi có thể sử dụng eval() để thực thi mã, với một debug_backtrace được nối thêm(). Nhưng cách tiếp cận đó quá lộn xộn và có thể gây ra các trường hợp khác, khó khăn hơn để gỡ lỗi. Ngày buồn :(. –

0

Không cần thiết để, và không bao giờ biết bạn có thể, nhưng tôi có thể sử dụng điều này vào cuối mỗi kịch bản bao gồm:

return __FILE__; 

hay:

return basename(__FILE__); 

hoặc nếu bạn không cần cụ thể, sử dụng 2 như được đề xuất trước đó.

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