Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> dlaczego exit nie dziala jak nalezy?, pytanie retoryczne
qbs
post 22.09.2008, 13:31:33
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" winksmiley.jpg

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 winksmiley.jpg

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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
nevt
post 22.09.2008, 14:10:44
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... -
Go to the top of the page
+Quote Post
qbs
post 22.09.2008, 14:29:18
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?
Go to the top of the page
+Quote Post
deirathe
post 22.09.2008, 14:30:37
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


--------------------
Kawałek mojego blogu
Everything should be as simple as possible but not simpler.
A Einstein
Go to the top of the page
+Quote Post
mike
post 22.09.2008, 14:33:00
Post #5





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(deirathe @ 22.09.2008, 15:30:37 ) *
exit() nie exit;
Nie ma różnicy.
Go to the top of the page
+Quote Post
qbs
post 22.09.2008, 20:12:37
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.
Go to the top of the page
+Quote Post
nevt
post 22.09.2008, 20:36:33
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 smile.gif wystarczy wygenerować FATAL ERROR (np. wywołanie niezdefiniowanej funkcji) i przykryć jego skutki operatorem @ ... to działa smile.gif
  1. <?php
  2. class innaklasa
  3. {
  4.    public function __construct()
  5.    {
  6.        print "inna klasa<br />";
  7.    }
  8.  
  9.    public function zrob()
  10.    {
  11.        try
  12.        {
  13.            throw new exception("test");
  14.        }
  15.        catch(Exception $e)
  16.        {
  17.            print "<pre>";
  18.            print_r($e);
  19.        }
  20.    }
  21. }
  22.  
  23. class klasa
  24. {
  25.    public function __construct()
  26.    {
  27.        print "konstruktor<br />";
  28.    }
  29.  
  30.    public function __destruct()
  31.    {
  32.        print "destruktor<br />";
  33.        $innaklasa = new innaklasa;
  34.        $innaklasa->zrob();
  35.    }
  36. }
  37.  
  38. $c = new klasa;
  39. @stop();
  40. ?>


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
qbs
post 23.09.2008, 07:55:43
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 blinksmiley.gif laugh.gif ale, przynajmniej mozna zrobic dosc prosto obsluge fatali.

no nic, nie ma co sie bawic w wynajdowanie dziury w calym, ewidetnie nie da sie zatrzymac watku z poziomu php. dzieki smile.gif
Go to the top of the page
+Quote Post
ddiceman
post 23.09.2008, 11:05:34
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
Go to the top of the page
+Quote Post
qbs
post 23.09.2008, 11:38:43
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 winksmiley.jpg cala historia zaczela sie od pewnej lamki co umiescila exita, a kod mimo to sie wykonywal dalej.
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.
Go to the top of the page
+Quote Post
ddiceman
post 23.09.2008, 12:22:48
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.
I da się wstrzymać destruktory (dodaj do swojego przykładu z pierwszego posta):
  1. <?php
  2. $c = new klasa;
  3. overload('klasa');
  4. exit();
  5. ?>


edit: mój bład, PHP 4 only

Ten post edytował ddiceman 23.09.2008, 13:11:16
Go to the top of the page
+Quote Post
qbs
post 23.09.2008, 12:36:56
Post #12





Grupa: Zarejestrowani
Postów: 22
Pomógł: 1
Dołączył: 22.09.2008

Ostrzeżenie: (0%)
-----


ale to php4 smile.gif

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 winksmiley.jpg

Ten post edytował qbs 23.09.2008, 12:39:40
Go to the top of the page
+Quote Post
ddiceman
post 23.09.2008, 12:40:52
Post #13





Grupa: Zarejestrowani
Postów: 326
Pomógł: 121
Dołączył: 23.07.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Sprawdzilem na PHP Version 5.2.3

edit: mój bład, PHP 4 only

Ten post edytował ddiceman 23.09.2008, 13:11:31
Go to the top of the page
+Quote Post
qbs
post 23.09.2008, 12:43:13
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
Go to the top of the page
+Quote Post
ddiceman
post 23.09.2008, 13:14:20
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

  1. <?php
  2. $c = new klasa;
  3. classkit_method_remove('klasa', '__destruct');
  4. exit();
  5. ?>


aczkolwiek nie jestem w stanie teraz tego sprawdzić.
Go to the top of the page
+Quote Post
qbs
post 23.09.2008, 13:28:38
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 winksmiley.jpg dzieki za opinie i czas smile.gif

Ten post edytował qbs 23.09.2008, 13:32:00
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.07.2025 - 20:35