2010-03-29 14 views
5

Jak sprawdzić, czy funkcja return() została wywołana z dołączonego pliku. Problem polega na tym, że include() zwraca 'int 1', nawet jeśli return() nie został wywołany. Oto przykład ...PHP - Jak mogę sprawdzić, czy funkcja return() została wywołana z pliku include()?

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

Edycja: Jako rozwiązanie tymczasowe, łapie się wyjście z include() (z instrukcji echo/print). Jeśli utworzono jakieś wyjście, ignoruję wartość zwracaną przez include().

Nie ładne, ale zapewnia funkcjonalność potrzebną w mojej aplikacji internetowej/strukturze.

Odpowiedz

2

Dobre pytanie. Patrząc na przykłady w manual, myślę, że nie możesz.

Najlepszym rozwiązaniem, które przychodzi na myśl, jest to, aby wszystkie twoje elementy w projekcie nie zwracały nagich wartości, ale tablicę zawierającą wartość zwracaną (return array(1);).

Wszystko inne, co przychodzi mi do głowy (przynajmniej moje), polega na definiowaniu pewnych stałych lub zmiennych w celu oznaczenia, czy znajdujesz się w pliku włączającym czy nie. Nic eleganckiego.

0

Jeśli nie ma nic do zwrócenia w dołączonym pliku, funkcja włączania domyślnie zwraca wartość 1. W przeciwnym razie zwróci to, co zostanie wysłane przez dołączony plik. Instrukcje Echo i print nie są zwrotem, musi to być instrukcja "return" wyznaczona przez PHP. Cała reszta będzie przetwarzana normalnie. Ten kod zasadniczo mówi: "czy plik został poprawnie wykonany?" i wraca 1, "tak, tak".

PHP: include - Manual - Zobacz "Obsługa zwrotów" poniżej komunikatów ostrzegawczych, a następnie spójrz na przykład 5 i tekst tuż pod nim. Wyjaśnia to doskonale.

+0

Tak, ale jeśli skrypt jest włączony, funkcja include() zwróci wartość przekazaną do return() w dołączonym pliku LUB "int 1", aby wskazać pomyślne uwzględnienie. Tak więc, gdy include() zwraca "int 1", nie mogę stwierdzić, czy jest to wartość zwracana z dołączonego pliku lub include(). –

+0

Nonsens. Jeśli wiesz, że plik zwraca jego własną wartość, możesz założyć, że wartość jest wartością, którą chcesz zwrócić. Uwzględnij nigdy nie zastąpi twojej wartości zwracanej, aby wysłać 1, że została zakończona. Chodzi o to, że wiesz dokładnie, co robią twoje pliki i jakie wartości z nich wynikają. Jeśli wiesz, że twój plik nic nie zwraca, to wartość powinna zawsze wynosić 1. – animuson

+0

Animuson: Tak, ale nie wiem, co robią inne pliki. Pojawią się również przypadki skrajne, które wyskakują z ramek i będą pita dla każdego, kto będzie debugować. –

1

To zachowanie jest zgodne z projektem - rachunek include zwraca 1 gdy to się powiedzie (lub wartość return „ed za pomocą dołączonego pliku), jak wykonanie skryptu może trwać nawet jeśli include zawodzi i programista może co do sprawdzenia w tym przypadku.

z podręcznika:

[wartość powrotu] oznacza jeden, ponieważ obejmują powiodło. Zwróć uwagę na różnicę między powyższymi przykładami. Pierwszy używa funkcji return() w obrębie dołączonego pliku , a drugi nie. Jeśli pliku nie można dołączyć, zwracana jest FAŁSZ, a E_WARNING jest wydawane .

W tym przypadku, po prostu nie używać 1 w kodzie jako wartości zwracanej do pliku, to znaczy, to wartość zwracana jest skutecznie zarezerwowana do użycia przez oświadczenie PHP include.

+0

To śmierdzi, to nie będę w stanie z wdziękiem obsłużyć wyjścia :(Myślę, że moją jedyną alternatywą jest sprawdzenie czy include() wytworzył jakieś wyjście (echo/print). Jeśli tak, to zignoruje zwracana wartość: –

0

$ ret = include ("..."); Zawsze zwróci 1, jeśli plik istnieje.

Spróbuj utworzyć zmienną i sprawdź, czy jest ustawiona.

include_file_1.php

<?php 
$includeFile1 = true; 

main.php

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

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

Prawdopodobnie mógł skorzystać z debug_backtrace(), ale to naprawdę nie jest idealnym rozwiązaniem. Jest powolny i musisz dużo pracować, aby uzyskać pożądane wyniki.

Niestety, opisywana sytuacja wykracza poza standardowe korzystanie z include i return. Po prostu zmieniłbym twoją logikę, aby z nią pracować. Dlaczego nie masz plików, które zwykle nie wywołują na końcu nazwy return, po prostu zadzwoń pod numer return 2? W ten sposób otrzymasz wartość, która wciąż będzie się sprawdzać w przypadku normalnych porównań, ale możesz użyć jej jako rozróżnienia między innymi połączeniami return 1.

+0

Świetny pomysł z 'debug_backtrace' - nie myślał o tym.Jednak nie sądzę, że to zadziała, ponieważ dołączony plik nie pozostawi żadnego śladu (gra słów nie jest przeznaczona) w śladzie po wywołaniu po zawarciu. –

+0

Zombat: Świetna rada, ale debug_backtrace() przeskakuje przez include(), a nie na. Ale mógłbym użyć eval() do wykonania kodu, z dołączoną debug_backtrace(). Ale to podejście jest zbyt niechlujne i może powodować inne, trudniejsze do debugowania, skrajne przypadki. Smutny dzień :(. –

0

Nigdy nie potrzebowałem, i nigdy nie wiedział, że może, ale mogę to wykorzystać na koniec każdego dołączonego skryptu:

return __FILE__; 

czyli

return basename(__FILE__); 

lub jeśli nie musisz tę specyfikę, użyj 2 zgodnie z sugestią wcześniej.

Powiązane problemy