2011-01-15 16 views
5

Przepraszamy za dramatyczny tytuł, chciał tylko wiedzieć, czy istnieje sposób, aby uniemożliwić wykonywanie wszystkich typów poleceń PHP, Z WYJĄTKIEM jednego.Czy istnieje alternatywa dla śmierci?

Na przykład teraz, gdy zabijam skrypt za pomocą metody die(), moje strony wyglądają na połowę zepsute, ponieważ nie udało się wczytać dolnej części strony HTML, ponieważ została wprowadzona przy użyciu funkcji include().

Czy istnieje sposób, aby powiedzieć PHP "nie pozwalają na więcej poleceń do wykonania z wyjątkiem funkcji włączenia"?

+1

Wtedy może 'die()' nie jest właściwym poleceniem do użycia. Jaki jest kontekst? Dlaczego w ogóle musisz zabić scenariusz? –

+0

Nie, jeśli to twój czas, po prostu musisz "umrzeć" ... Przepraszam. :) Poważnie, ale wydaje się, że źle to rozumiesz. Po prostu nie zabijaj swojej strony, póki jeszcze coś robi. Lepsza obsługa błędów! – deceze

+0

@Felix Kling Zabijam skrypt, jeśli wartość parametru GET jest inna niż 3 z góry ustalone wartości dopuszczalne ze względów bezpieczeństwa. – TJDeatwiler

Odpowiedz

2

Będziesz musiał użyć niestandardowej komendy die(), na przykład my_die(), aby dołączyć potrzebne pliki. Nie można zastąpić funkcji die(), ani żadna inna funkcja nie pozwoli ci robić tego, czego szukasz.

0

Każdy powód, dla którego nie możesz tego po prostu zrobić?

if(something didn't work) { 
    include('footer.php'); 
    die(); 
} 

Jeśli używasz go często, zamień go w funkcję.

function finish_and_die($message) { 
    print $message; 
    include('footer.php'); 
    exit; 
} 
+0

Nie, ponieważ mam więcej niż jeden plik na różnych poziomach na stronie, a część przetwarzania jest w środku, nie chcę martwić się o zamówienie, jeśli jest inny sposób. – TJDeatwiler

0

Można spróbować czegoś takiego:

if(is_secure($_GET['value'])) // Whatever you're using to check if the value is allowed 
{ 
    // Page content goes here 
} 

ten sposób wszystkich innych i zawiera kod przetwarzanie strona będzie nadal się nazywa.

Alternatywnie, jeśli nie jest prawidłowy, wyślij wyjątek i skorzystaj z procedury obsługi wyjątku, która wie, jak wykonać kod strony.

11

return można użyć do "wypowiedzenia" dołączonego pliku, bez zabijania cały skrypt:

test1.php

<?php 
include 'test2.php'; 
echo 'foo'; 

test2.php

<?php 
echo 'bar'; 
return; 
echo 'baz'; 

Wyjścia:

barfoo 
+0

Przydatny sposób kontynuowania skryptu. Po prostu załatwiaj wszystko, co ci się podoba, dzięki. – Andrew

-1

Jeśli używasz podejścia OOP w połączeniu z buforowaniem wyjściowym, w ten sposób możesz rozwiązać problem:

Klasa kontrolera (w której logika się znajduje) ma element członkowski będący instancją klasy Szablon. klasa Kontroler posiada __destruct metodę, która sprawia, że ​​szablon

gdy exit() lub die() są nazywane, __destruct metoda obiektu sterownika nazywa, co z kolei wywołuje render metodę obiektu szablonu.

+0

Logika należy do modeli, nie kontrolerów ... – netcoder

+1

Business Logic należy do kontrolerów. Storage/Data Logic należy do modeli. Logika wyświetlania należy do widoków. – Stephen

+0

Interesujące jest to, w jaki sposób właśnie zbudowałem framework do renderowania szablonów. :) – Spechal

1

exit() zakończy wykonywanie i uruchomi wszystkie zarejestrowane programy obsługi wyjścia.

Zgłaszanie wyjątków będzie zgłaszane wszędzie tam, gdzie jest to możliwe. Jeśli nie spróbujesz do najwyższego poziomu, zakończy ono wszystkie wykonanie skryptu.

Powrót w zasięgu globalnym spowoduje powrót z bieżącego pliku włączeń, z powrotem do tego, co zawierało/wymagało pliku.

Osobiście polecam przemyślane podejście do przekazywania wyjątków i używanie metody "try/throw".

Powiązane problemy