За последние 24 часа нас посетили 15545 программистов и 1612 роботов. Сейчас ищут 832 программиста ...

exit или die, нормальное завершение скрипта?

Тема в разделе "PHP для новичков", создана пользователем VLK, 20 мар 2015.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Подскажите, есть скрипт и в конце нет я ставлю exit или die (на сколько я знаю это одно и тоже), это нормально? нормально в смысле со стороны клиента (браузера), не будут ли ему еще до отправлены какие то хреновые заголовки или типа того.
     
  2. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    1. разница между ними есть
    2. заголовков ни одна из этих функций не модифицирует
    3. exit; отличная практика при редиректах

    в общем "нормально" или "не нормально" это всё зависит от того как конкретно взятый ты смог использовать эти конструкции и функции.
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Ну вот есть 2 скрипта:

    первое (без exit):
    Код (Text):
    1. <!doctype html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>PAGE</title>
    6. </head>
    7. <body>
    8. <?php echo '<h1>Hello</h1>'; ?>
    9. </body>
    10. </html>
    Второе (с exit):
    Код (Text):
    1. <!doctype html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>PAGE</title>
    6. </head>
    7. <body>
    8. <?php echo '<h1>Hello</h1>'; ?>
    9. </body>
    10. </html>
    11. <?php exit(); ?>
    тот кто зайдет на эти страницы у него результат в обоих случаях будет одинаковый? Ну возможно во втором будет на 1 пустую строчку больше в конце, но это не критично, не об этом речь.

    PS только не спрашивайте к чему это все и почему нельзя обойтись без exit, в реальности не все так как в примере, просто долго объяснять :)
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    экзит не нужен. инфа 136%
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    в приведенном примере можно без экзита обойтись ведь это и так конец сценария.
    die() - экстренное прерывание исполнения. единственным аргументом принимает сообщение которое последним печатается в STDOUT.
    exit / exit() - завершение процесса с возвратом сигнала родительскому процессу.
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    пшшшшшшшшшшшшшшшшшшшшшшшш.....

    есть 2 файла, они подключаются и между ними функция:
    Код (PHP):
    1. include 'first.php';
    2. myFns();
    3. include 'second.php'; 
    во втором файле собственно происходит генерация страницы HTML и ее вывод, у меня нет доступа к этому файлу, в принципе как и доступа к файлу скрипта приведенного выше, но есть доступ к myFns, я могу в этой функции все что угодно написать, вот я и хочу в этой функции генерировать свою страницу HTML и выводить, но как тогда быть с подключением второго файла? мне не надо его подключать, вот я и хочу его обрубить при помощи exit, т.е. функция myFns будет заканчиваться exit.
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    да, так и делай. exit часто используется в момент когда логически скрипт уже завершен но ниже есть еще тонна кода которую уже не надо выполнять.
     
  8. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    exit(0); кажись в некоторых ООП нормальное завершение программы
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    0 это статус для родительского процесса. к ООП никакого отношения не имеет. учи матчасть =)
     
  10. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Niet...
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    хм, ок. я лет десять назад видимо между строк прочитал что exit с аргументом общается с родителем а die прерывает работу скрипта с текстовым сообщением. так и использую. и код логически более понятно обрывается.
     
  12. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Так почему же не имеет:)
    к примеру JAVA:
    System - системный класс http://docs.oracle.com/javase/7/docs/api/java/lang/System.html
    exit() - его метод http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)
    Так получается, он имеет отношение к ООП.
    Вот с нормальным завершением я погорячился. "0" - это аварийное завершение программы.
    т.е. Указав статус "0" методу exit() мы сообщаем, что JVM завершится аварийно.
    пример:
    Код (Text):
    1. package com.tutorialspoint;
    2.  
    3. import java.lang.*;
    4.  
    5. public class SystemDemo {
    6.  
    7.    public static void main(String[] args) {
    8.  
    9.       int arr1[] = { 0, 1, 2, 3, 4, 5 };
    10.       int arr2[] = { 0, 10, 20, 30, 40, 50 };
    11.       int i;
    12.      
    13.       // copies an array from the specified source array
    14.       System.arraycopy(arr1, 0, arr2, 0, 1);
    15.       System.out.print("array2 = ");
    16.       System.out.print(arr2[0] + " ");
    17.       System.out.print(arr2[1] + " ");
    18.       System.out.println(arr2[2] + " ");
    19.      
    20.       for(i = 0;i < 3;i++) {
    21.          if(arr2[i] > = 20) {
    22.             System.out.println("exit...");
    23.             System.exit(0);
    24.          }
    25.          else {
    26.             System.out.println("arr2["+i+"] = " + arr2[i]);
    27.          }
    28.       }
    29.    }
    30. }
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.250
    Адрес:
    там-сям
    я привык писать die там, где аварийное завершение и exit при запланированном выходе. никакого тайного смысла в этом нет, просто сами слова подталкивают к этому )))
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это как так вышло?
     
  15. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Причём здесь JAVA? Там вообще не бывает функций, которые не методы
     
  16. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    вот так. не имеет. это считай выход из функции main() с сообщением статуса в родительскую функцию - родительский процесс. приведенный пример джавы - неудачный пример. сорри))))
    ты невнимателен. во всех реализациях системных вызовов статус 0 означает однозначное успешное завершение программы. пул 1-254 можно использовать для указания фейлов и софтфейлов. значение 255 вообще магическое. более никаких кодов быть не может потому что почти 99% реализаций на статус выделяют всего один октет. ну и как бы если ты JVM приводишь в пример - не поленись сходить в офмануал и так убедиться что ща ляпнешь полную фигню)))
    учи матчасть.
     
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    И не ты один. Собсно, это, вероятно, основная причина, почему обе инструкции все еще существуют вместе.
    Присоединяюсь к вопросу.
     
  18. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    ну извините, не по теме, выржеите в другое место. Хочется прдолжить.
    согласен, просто увлекся.
    Бро, я это привел из документации. и привел ссылки откуда взял, получается ты не внимателен
    Конечно, я сам не особо это переведу, перевод был машинный. И читал про это я в одной книжке, давно, книжки которой уже нет на руках(подарил), но такое помнится. Вот нашел в доках, что так и написано.
    http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#exit(int)
    Ну так в строчке выше написано
    машинный перевод:
    Функция тоже часть большой программы. Если System - это класс a exit() его метод, по почему это не ООП?:)
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    mahmuzar, я тебя не понимаю. ты то говоришь что ноль это ок то говоришь что ноль это не ок. я тебе коротко обозначил что это вообще из операционных систем. а ты лепишь ООП. помидор красный у трактора дверь вот так открывается. если тебе нравится везде ООП видеть - видь.

    из вот этих вот строк кода я так и не понял что именно ты для себя решил. ноль это ок или не ок?
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    С этим согласен, код может быть и не ООП-ным
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    то есть всё таки НОЛЬ ЭТО ПЛОХО ? я правильно тебя понимаю?
     
  22. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    есть два класса:
    Код (Text):
    1. package javaapplication1;
    2.  
    3. /*
    4.  * To change this license header, choose License Headers in Project Properties.
    5.  * To change this template file, choose Tools | Templates
    6.  * and open the template in the editor.
    7.  */
    8. /**
    9.  *
    10.  * @author life
    11.  */
    12. public class JavaApplication1 {
    13.  
    14.     public JavaApplication1() {
    15.  
    16.     }
    17.  
    18.     /**
    19.      * @param args the command line arguments
    20.      */
    21.     public static void main(String[] args) {
    22.  
    23.     }
    24.  
    25.     public void test() {
    26.         System.out.println("JavaApplication1 0");
    27.         System.exit(0);
    28.         System.out.println("JavaApplication1 1");
    29.     }
    30.  
    31. }
    Код (Text):
    1. /*
    2.  * To change this license header, choose License Headers in Project Properties.
    3.  * To change this template file, choose Tools | Templates
    4.  * and open the template in the editor.
    5.  */
    6. package javaapplication1;
    7.  
    8. /**
    9.  *
    10.  * @author life
    11.  */
    12. public class NewClass {
    13.  
    14.     public static void main(String[] args) {
    15.         System.out.println("Hello NewClass 0");
    16.         JavaApplication1 obj = new JavaApplication1();
    17.         obj.test();
    18.         System.out.println("HelloNewClass 1");
    19.  
    20.     }
    21.  
    22. }
    при System.exit(0);
    вывод будет:
    Код (Text):
    1. run:
    2. Hello NewClass 0
    3. JavaApplication1 0
    4. BUILD SUCCESSFUL (total time: 0 seconds)
    при при System.exit(1);
    Код (Text):
    1. run:
    2. Hello NewClass 0
    3. JavaApplication1 0
    4. Java Result: 1
    5. BUILD SUCCESSFUL (total time: 0 seconds)
    Заметь, завершается выполнение, не только метода JavaApplication1.test() но и метода NewClass.main()

    Ну если произошла авария в программе, стоит ли продолжать выполнение в другой части программы?

    Добавлено спустя 35 секунд:
    Ноль это авария в программе, можно было понять, о чем я, вроде расписал как мог:)
     
  23. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ты сам себе противоречишь
    ну ладно ты меня в хер не ставишь с тем что я тебе говорю. а я ведь сказал что и как. просто ты не всосал через свою призму ООПэшности вселенной. но мануал-то ты сам переводишь. и он сообщает (внимание!!!) Аргумент служит в качестве кода состояния; по соглашению, ненулевой код состояния указывает аварийное завершение. и тут ты мне опять туда-сюда пятое десятое.

    будь любезен, приди к единому мнению в своей головушке
    НОЛЬ ЭТО ЗАЕ6ИСЬ ИЛИ ПИ3ДЕЦ?
     
  24. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    О чем спор вообще? JAVA, уровни ОС.. Как разработчики PHP решат, так и будет exit() в PHP работать. А то, как они решили, четко прописано в документации к PHP:

    Всеу. Неважно, в традициях чего и под влиянием чего это сделано, поведение однозначно прописано в официальной документации.
     
  25. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    ДААА, невгимательность вгоняет в краску:-D

    Короче, ноль это норма, а остальное *ИЗДЕЦ.

    Спасибо всем, и зрителям и участникам:)

    Добавлено спустя 1 минуту 14 секунд:
    Ага, прописано. Моя невнимательность во всем виновата.