![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
witam wszystkich z gory na dol.
w dniu dzisiejszym, wraz z kumplem od spizowego kufla udalo nam sie znalezc pewna bardzo przykra rzecz. co prawda 99% osob ma to gdzies, jak i ja dotychczas, lecz w swojej ulomnosci nawet nie zdawalem sobie sprawy ze funkcja oferowana przez php, jaka jest exit() jest niezbyt poprawna. mianowicie, dziala ona w identyczny sposob jak die() i w brew temu co pisze w dokumentacji, mozna je bezczelnie obejsc. oczywiscie nie ma to wplywu na dzialanie poprawnie napisanego kodu, lecz dla osob poczatkujacych moze to byc zwyczajny "kwas" ![]() nie wiem czemu bylem przekonany, ze funkcja exit, zabija z miejsca watek w ktorym wykonywany jest skrypt (w przeciwienstwie do die ktory pozwala jeszcze destruktorom na dzialanie). chcialem przez ten post zapytac czy jest cos co moglem pominac w dokumentacji, na tym forum tudziez konfiguracji php? dla leniwych wrzucam kod ![]() Kod <?php
class innaklasa { public function __construct() { print "inna klasa<br />"; } public function zrob() { try { throw new exception("test"); } catch(Exception $e) { print "<pre>"; print_r($e); } } } class klasa { public function __construct() { print "konstruktor<br />"; } public function __destruct() { print "destruktor<br />"; $innaklasa = new innaklasa; $innaklasa->zrob(); } } $c = new klasa; exit; Ten post edytował qbs 23.09.2008, 13:32:37 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
nie wiem z jakiego manuala PHP korzystasz, ale najwyraźniej z kiepskiego. w najpopularniejszym manualu w opisie funkcji exit(...); pisze jak wół:
Cytat Informacja: This language construct is equivalent to die().
-------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
auć, racja. mimo wszystko czemu ta funkcja nie potrafi zabic skrypt od reki? po kiego grzyba w takim razie die jest jeszcze stosowany? kompatybilnosc wstecz? kiedys zalecali uzywanie exit'a po die(), wiec?
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 426 Pomógł: 32 Dołączył: 24.05.2007 Ostrzeżenie: (0%) ![]() ![]() |
exit() nie exit;
Ten post edytował deirathe 22.09.2008, 14:30:50 -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Przyjaciele php.pl Postów: 7 494 Pomógł: 302 Dołączył: 31.03.2004 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
zadam pytanie troche inaczej bo jak teraz przeczytalem na spokojnie to sam nie wiem o co mi chodzi.
skoro exit() zamierzenie dziala tak jak die(), w jaki sposob mozna byc pewnym ze skrypt zakonczyl dzialanie? bo jak juz wiadomo odpalane sa jeszcze destruktory, w ktorych mozna robic co sie zywnie podoba. btw, dzieki nevt, manuala na php.net nie odwiedzalem juz od dosc dawna, jesli chodzi o podstawy. |
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 595 Pomógł: 282 Dołączył: 24.09.2007 Skąd: Reda, Pomorskie. Ostrzeżenie: (0%) ![]() ![]() |
a tak przy okazji, pobawiłem się chwilę i znalazłem sposób na przerwanie skryptu bez odpalania destruktorów obiektów
![]() ![]()
-------------------- - Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... - |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
dzieki nevt, ale rozczaruje cie. to dalej dziala
![]() ![]() no nic, nie ma co sie bawic w wynajdowanie dziury w calym, ewidetnie nie da sie zatrzymac watku z poziomu php. dzieki ![]() |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 326 Pomógł: 121 Dołączył: 23.07.2008 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Zastanów się tak naprawdę, dlaczego tak jest a dojdziesz do tego, że jest to zamiarem a nie przypadkiem. Destruktor ma za zadanie wykonanie czynności przed usunięciem obiektu innych niż zwolnienie pamięci (co odbywa się samoczynnie). A zatem np. pokasowanie tymczasowych plików/tabel etc. Dlatego też zablokowanie obsługi destruktorów po exit()/die() powodowałoby pozostawianie w systemie różnorakich śmieci.
PHP przed zakończeniem wykonywania skryptu niszczy wszystkie referencje do wszystkich zadeklarowanych obiektów, co implikuje wywołanie destruktorów dla każdego obiektu. Nazywa się to cleanup routine |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
ddiceman, przeczytaj uwazniej o co mi chodzi. przede wszystkim, nie chodzi mi o mnie, gdyz skrypty pisac jeszcze w miare sensownie potrafie
![]() i wiem ze chodzi o zarzadzanie pamiecia itp stuff, poporstu chodzilo o to czy jest jakis sposob by upewnic sie ze skrypt zakonczyl dzialanie bez odpalania destruktorow. jak widac nie ma. i wiem, ze w poprawnie napisanym skrypcie nie ma z tym problemu. |
|
|
![]()
Post
#11
|
|
Grupa: Zarejestrowani Postów: 326 Pomógł: 121 Dołączył: 23.07.2008 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Przeczytałem uważnie - twierdzisz, że
Cytat exit() jest poprostu schrzaniona podczas gdy ja twierdzę, że to było zamiarem a nie przypadkiem.
edit: mój bład, PHP 4 only Ten post edytował ddiceman 23.09.2008, 13:11:16 |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
ale to php4
![]() poza tym nie twierdze ze to nie bylo zamierzone. skoro tak juz jest, to napewno bylo to zamierzone w mniejszym lub wiekszym stopniu. ale jak powiedzialem 3krotnie, chodzi mi o fakt zabicia skryptu od reki ![]() Ten post edytował qbs 23.09.2008, 12:39:40 |
|
|
![]()
Post
#13
|
|
Grupa: Zarejestrowani Postów: 326 Pomógł: 121 Dołączył: 23.07.2008 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
edit: mój bład, PHP 4 only Ten post edytował ddiceman 23.09.2008, 13:11:31 |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
dziwne, http://pl2.php.net/manual/pl/function.overload.php mowi co innego, a tymbardziej moja kompilacja php 5.2.5
Kod konstruktor
Fatal error: Call to undefined function overload() in D:\htdocs\test.php on line 39 destruktor inna klasa Exception Object ( [message:protected] => test [string:private] => [code:protected] => 0 [file:protected] => D:\htdocs\test.php [line:protected] => 13 [trace:private] => Array ( [0] => Array ( [file] => D:\htdocs\test.php [line] => 34 [function] => zrob [class] => innaklasa [type] => -> [args] => Array ( ) ) [1] => Array ( [function] => __destruct [class] => klasa [type] => -> [args] => Array ( ) ) ) ) Ten post edytował qbs 23.09.2008, 12:46:56 |
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 326 Pomógł: 121 Dołączył: 23.07.2008 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Masz racje - rzeczywiscie tylko PHP4, na tym serwerze miałem maskowanie błędów, przepraszam.
Jedyne, co mi się teraz nasuwa to rozszerzenie PECL classkit
aczkolwiek nie jestem w stanie teraz tego sprawdzić. |
|
|
![]()
Post
#16
|
|
Grupa: Zarejestrowani Postów: 22 Pomógł: 1 Dołączył: 22.09.2008 Ostrzeżenie: (0%) ![]() ![]() |
e tam, szkoda twojego czasu. jedyna rada - nie pisac bzdur w destruktorach
![]() ![]() Ten post edytował qbs 23.09.2008, 13:32:00 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 24.07.2025 - 20:35 |