Quais são as diferenças em die () e exit () no PHP?

679

Quais são as diferenças entre die()e exit()funções no PHP?

Acho que os dois têm a mesma funcionalidade, mas duvido que exista algo diferente nos dois ... o que é?

coderex
fonte
2
exit () apenas interrompe o programa com um status de saída numérico, enquanto die () imprime a mensagem de erro em stderr e sai com o status EXIT_FAILURE. so exit() is exit and die() is also exit :)
Muhammad Shahzad 06/04

Respostas:

541

Não há diferença - eles são os mesmos.

Manual do PHP para exit:

Nota: Essa construção de idioma é equivalente a die().

Manual do PHP para die:

Essa construção de linguagem é equivalente a exit().

Marek Karbarz
fonte
17
aliases permite que os programadores usem o que é mais confortável. Lembro-me de sair melhor do que morrer. Alguns outros se lembram de morrer melhor que sair.
28509 mauris
28
este ( php.net/manual/en/aliases.php ) pode dar alguma explicação por 2 funções fazer a mesma coisa
Marek Karbarz
86
Mesmo que eles façam o mesmo, costumo reservar diepara paradas relacionadas a erros e exitpara todos os outros cenários. Parece apenas fluir melhor ao ler o código.
nextgentech
7
Desculpe reviver isso, mas pelo menos para mim ... dieé muito mais rápido escrever do que exit... Estou começando a usar exitporque é mais legível para programadores que não são PHP, mas dieé mais rápido para digitar quando você está em pressa. Além disso, pela maneira como digito, não preciso alterar a posição das minhas mãos para escrever die.
Alejandro Iván
7
@mauris, é muito melhor uma função ter apenas um nome . Imagine que toda função PHP tem dois nomes, isso seria uma bagunça completa .
Pacerier
221

DIFERENÇA NA ORIGEM

A diferença entre die()e exit()no PHP é sua origem .


FUNCIONALMENTE EQUIVALENTE

die()e exit()são funções equivalentes.

Manual do PHP

Manual do PHP para die:

Essa construção de linguagem é equivalente a exit().

Manual do PHP para exit:

Nota: Essa construção de idioma é equivalente a die().

Manual do PHP para aliases de funções :

die é um alias para a função mestre exit()


DIFERENTE EM OUTRAS LÍNGUAS

die()e exit()são diferentes em outras linguagens, mas no PHP são idênticas.

De outro discurso do PHP :

... Como codificador C e Perl, eu estava pronto para responder: "Ora, exit () apenas interrompe o programa com um status de saída numérico, enquanto die () imprime a mensagem de erro em stderr e sai com o status EXIT_FAILURE. " Mas então me lembrei de que estamos na área de sintaxe confusa do PHP.

No PHP, exit () e die () são idênticos.

Os designers obviamente pensaram "Hmm, vamos pegar emprestado exit () do C. E o pessoal do Perl provavelmente vai gostar se pegarmos die () como é do Perl também. Opa! Temos duas funções de saída agora! Vamos fazer com que ambos pode pegar uma string ou um número inteiro como argumento e torná-los idênticos! "

O resultado final é que isso realmente não tornou as coisas "mais fáceis", apenas mais confusas. Os codificadores C e Perl continuarão usando exit () para lançar apenas um valor inteiro de saída e die () para lançar uma mensagem de erro e sair com falha. Iniciantes e pessoas com PHP como primeira língua provavelmente se perguntarão "umm, duas funções de saída, qual devo usar?" O manual não explica por que existe exit () e die ().

Em geral, o PHP tem uma redundância estranha como essa - tenta ser amigável para pessoas que têm diferentes origens de linguagem, mas, ao fazê-lo, cria redundância confusa.

Geoffrey Hale
fonte
14
Embora essa seja a centésima resposta, afirmando que eles são equivalentes (como também visto na minha resposta ^^), isso realmente adiciona alguns pontos MUITO bons. Acima de tudo, eles NÃO são os mesmos em outras línguas (daí a confusão em primeiro lugar). (+1)
Levite
@ Levit, não, não, você está entendendo totalmente errado . Ninguém possui nomes e idiomas diferentes reutilizam os mesmos nomes de maneiras não iguais. Tudo bem, porque não precisamos de outra maneira padrão de fazer as coisas. A "confusão em primeiro lugar" é devido ao PHP atribuir dois nomes diferentes para uma função ..
Pacerier
2
@ Pacerier: Claro, se você olhar para o ponto de "quem é a culpa", isso é absolutamente certo. Ainda assim, é também um fato que eles simplesmente significam coisas diferentes em vários idiomas (o que é bom). Olhando para ele de uma perspectiva neutra, ele definitivamente é verdadeiro: existe confusão por causa dos diferentes significados (mesmo que seja culpa do php por criar dois apelidos de função iguais). Eu definitivamente não quero apontar um dedo em qualquer dessas línguas, se era isso que você entendeu do meu comentário ... (grande xkcd btw (Y) ^^)
levita
2
Definitivamente, essa deve ser a resposta escolhida, boa descrição!
Cody Brown
Outro usuário respondeu que exit()não fecha a conexão enquanto o die()faz, parece relevante.
Ner0
62

Como afirmado anteriormente, esses dois comandos produzem o mesmo token do analisador.

MAS

Há uma pequena diferença, e é quanto tempo leva para o analisador retornar o token.

Eu não estudei o analisador PHP, mas se for uma lista longa de funções começando com "d" e uma lista mais curta começando com "e", deve haver uma penalidade de tempo procurando o nome da função para funções começando com " e ". E pode haver outras diferenças devido à forma como o nome inteiro da função é verificado.

Duvido que seja mensurável, a menos que você tenha um ambiente "perfeito" dedicado à análise do PHP e muitas solicitações com parâmetros diferentes. Mas deve haver uma diferença, afinal, PHP é uma linguagem interpretada.

Prumo
fonte
4
@ Timeless, perfeccionistas não diriam "PHP é uma linguagem interpretada". PHP é uma linguagem que pode ser interpretada ou compilada, dependendo da configuração do servidor.
Pacerier
29
E ... "die" tem 3 caracteres e 4 para "exit". Portanto, são necessários 25% menos memória e espaço no arquivo! ;)
Jan Derk
2
'"se for uma lista longa de funções começando com" d "e uma lista mais curta começando com" e ", deve haver uma penalidade de tempo procurando o nome da função para funções começando com" e "'. significa que a penalidade de tempo aconteceria ao procurar a função iniciada por d ? Geralmente, quanto maior a lista, maior o tempo para encontrar um item nela.
Pere
9
Como você escreveu, você não estudou o analisador PHP. Obrigado por esta resposta inútil, pois se baseia nos seus sonhos sobre como o PHP é implementado.
dólmen
44

Manual do PHP sobre die :

die - Equivalente a sair

Você pode até fazer die;da mesma maneira queexit; - com ou sem parênteses.

A única vantagem de escolher die()mais exit(), pode ser o momento você poupar em digitando uma letra extra ;-)

Levita
fonte
1
também torna conveniente quando alguém vem de outro idioma, se eles se familiarizam de alguma maneira
Rohan Khude
nota que, se correr php interativamente ( php -a) die;, die();, exit;e exit();não têm nenhum efeito, enquanto exit(sem vírgula) sai do modo interativo.
santiago Arizti
31

Como todas as outras respostas corretas dizem, diee exitsão idênticos / aliases.

Embora eu tenha uma convenção pessoal de que, quando eu quiser terminar a execução de um script quando for esperado e desejado, eu o uso exit;. E quando preciso finalizar a execução devido a alguns problemas (não consegui conectar ao db, não consigo gravar no arquivo etc.), uso die("Something went wrong.");para "matar" o script.

Quando eu uso exit:

header( "Location: http://www.example.com/" ); /* Redirect browser */
/* Make sure that code below does not get executed when we redirect. */
exit; // I would like to end now.

Quando eu uso morrer:

$data = file_get_contents( "file.txt" );
if( $data === false ) {
    die( "Failure." ); // I don't want to end, but I can't continue. Die, script! Die!
}
do_something_important( $data );

Dessa forma, quando vejo exitem algum momento do meu código, sei que neste momento quero sair porque a lógica termina aqui. Quando vejo die, sei que gostaria de continuar a execução, mas não posso ou não devo devido a erro na execução anterior.

Claro que isso só funciona quando se trabalha em um projeto sozinho. Quando há mais pessoas, ninguém as impede de usar dieou exitonde não se encaixa nas minhas convenções ...

Lukas
fonte
30

Aqui está algo que é bastante interessante. Embora exit()e die()sejam equivalentes, die() fecha a conexão. exit() não fecha a conexão.

die():

<?php
    header('HTTP/1.1 304 Not Modified');
    die();
?>

exit():

<?php
    header('HTTP/1.1 304 Not Modified');
    exit();
?>

Resultados:

exit():

HTTP/1.1 304 Not Modified 
Connection: Keep-Alive 
Keep-Alive: timeout=5, max=100

die():

HTTP/1.1 304 Not Modified 
Connection: close

Basta considerar a necessidade de levar isso em conta no seu projeto.

Créditos: https://stackoverflow.com/a/20932511/4357238

Edward
fonte
1
Essa deve ser a resposta aceita.
Ner0
2
Apenas testei e exite diefuncionam da mesma maneira, ambos estreita ligação.
Grzegorz Adam Kowalski
12

Em termos de funcionalidade, eles são idênticos, mas eu os uso nos seguintes cenários para tornar o código legível:

Use die () quando houver um erro e precise interromper a execução.

por exemplo die( 'Oops! Something went wrong' );

Use exit () quando não houver um erro e precise interromper a execução.

por exemplo exit( 'Request has been processed successfully!' );

aagjalpankaj
fonte
11

Esta página diz que dieé um aliado de exit, então eles são idênticos. Mas também explica que:

existem funções que mudaram de nome devido a uma limpeza de API ou por algum outro motivo e os nomes antigos são mantidos apenas como aliases para compatibilidade com versões anteriores. Geralmente, é uma má idéia usar esse tipo de alias, pois eles podem estar vinculados à obsolescência ou renomeação, o que levará a scripts não portáveis.

Então, me chame de paranóica, mas pode não haver nada dieno futuro.

Pedram Behroozi
fonte
3
Ele também diz que, em alguns casos, não há nome preferido entre os vários is_int()e is_integer()é igualmente bom, por exemplo. Observando o php-srchistórico de consolidação no GitHub, a die()construção está no PHP desde 1999, quando foi convertida em um repositório SVN, e provavelmente pelo tempo em que a linguagem existir. Parece absurdo imaginar que isso será depreciado.
Mark Amery
2
@ MarkAmery, embora suas instalações não levem à sua conclusão, a conclusão em si é válida: ~ "Me chame de paranóica, mas pode não haverexit no futuro. Ou pode não haver dieno futuro"
Pacerier
@Pacerier Muito bem. Pode não haver PHP no futuro, então vamos todos sair desse show de programação e nos tornar empreendedores ou cobradores de impostos. Afinal, nada é certo senão a morte e os impostos.
Mark Amery
@ MarkAmery, "Nenhum PHP no futuro" parece estar acima da média paranóica. A história mostrou que idiomas incrivelmente populares não morrem tão facilmente (Fortran!).
Pacerier
1
Não seja paranóico. a saída nunca morrerá . :)
dólmen
10

Esta saída de https://3v4l.org demonstra que die e exit são funcionalmente idênticos. insira a descrição da imagem aqui

Simon77
fonte
6

Eles são essencialmente os mesmos, embora este artigo sugira o contrário.

okw
fonte
1
Esse artigo é simplesmente estranho; pela definição do scanner, você pode dizer que eles são equivalentes; se houver alguma diferença, talvez o teste tenha sido executado sem um opcache.
Ja͢ck 25/11/14
O artigo é sobre uma referência que não pode ser reproduzida, pois o código não é publicado. Ignore isso.
dólmen
0

Funcionalmente, eles são idênticos. Portanto, escolher qual usar é uma preferência totalmente pessoal. Semanticamente em inglês, eles são diferentes. Morrer soa negativo. Quando tenho uma função que retorna dados JSON para o cliente e encerra o programa, pode ser terrível se eu chamar essa função jsonDie (), e é mais apropriado chamá-la de jsonExit (). Por esse motivo, eu sempre uso exit em vez de morrer.

Luo Jiong Hui
fonte
O OP está perguntando apenas sobre as funções de saída e morte do PHP.
Black Mamba
1
Sim, e eu estava respondendo apenas a essa pergunta. No entanto, para estar ciente, a questão não é apenas sobre a diferença de funcionalidade.
Luo Jiong Hui
Uma das minhas funções mais adoráveis ​​é chamada pd () - o que significa Please Die. Então, eu não tenho certeza de que morrer é uma coisa ruim em tal contexto a :)
Ivan Ponomarev
Como desenvolvedor de pilha cheia, não me vejo apenas como programador, mas também como designer de experiência do usuário. E neste contexto, a simpatia é importante. A simpatia não afeta apenas como eu design a interface do usuário, mas também como codifico.
Luo Jiong Hui
0

Pelo que sei quando olho para esta pergunta aqui

Ele disse que "no PHP, há uma diferença distinta na saída do cabeçalho. Nos exemplos abaixo, eu escolhi usar um cabeçalho diferente, mas para mostrar a diferença entre exit () e die () que não importa", e testado (pessoalmente)

Dhiva Banyu Wigara
fonte
-3

No questionário do w3schools: As funções die () e exit () fazem exatamente a mesma coisa? minha resposta é falsa. Essa é uma resposta incorreta. A resposta certa é verdadeira.

Aqui está a captura de tela: insira a descrição da imagem aqui

li bing zhao
fonte
-5

Algo que eu notei nos meus scripts pelo menos é que exit () interrompe o script atualmente em execução e passa o controle de volta para qualquer script de chamada, enquanto o die interrompe o php em suas trilhas. Eu diria que é uma grande diferença?

noowie
fonte
1
@AdarshMadrecha isso não é verdade. Se eles estão dentro ou fora de uma subfunção, o script php sempre pára.
MERT DOĞAN
-5

O resultado da função exit () e da função die () é sempre o mesmo. Mas, como explicado na página de manual de alias ( http://php.net/manual/en/aliases.php ), ele diz que a função die () chama a função exit. Eu acho que é codificado como abaixo:

function die($msg){
  exit($msg);
}

Isso não é um problema de desempenho para projetos pequenos, médios e grandes, mas se o projeto tiver bilhões, bilhões, processos bilhões, bilhões de processos serão multiplicados, isso acontecerá com um estado de otimização de desempenho muito importante.

Mas muitas pessoas não acham que isso é um problema, porque se você tiver tantos processos, deverá pensar em mais problemas do que se uma função for mestre ou alias.

Mas, a resposta exata é essa; A função principal é sempre mais rápida que o alias.

Finalmente; A página de manual do alias diz que você não pode mais usar o dado. É apenas um alias e está obsoleto.

Geralmente, é uma má idéia usar esse tipo de alias, pois eles podem estar vinculados à obsolescência ou renomeação, o que levará a scripts não portáveis. Esta lista é fornecida para ajudar aqueles que desejam atualizar seus scripts antigos para uma sintaxe mais recente.

MERT DOĞAN
fonte
2
O aliasing não está 'chamando uma função'. Verifique suas suposições antes de elaborar hipóteses.
dólmen
@dolmen Aliases sempre chama funções principais em códigos físicos. Esta é uma regra geral de programação.
MERT DOĞAN
@ MERTDOĞAN Um alias não chama nada. Um alias (na programação ou na vida real) é apenas outro nome de um objeto (que já tem um nome). die()não é uma função separada. É apenas outro nome de exit(). Esta resposta contém instruções incorretas sobre aliases e seu desempenho.
axial em 15/03
docs.php.net/manual/en/… Aliases sempre chamam como no exemplo acima. Aprenda alguma coisa e volte.
MERT DOĞAN 16/03/19
-10

Eles soam iguais, no entanto, o exit () também permite definir o código de saída do seu script PHP.

Geralmente, você realmente não precisa disso, mas ao escrever scripts PHP no console, convém verificar, por exemplo, o Bash, se o script concluiu tudo da maneira correta.

Então você pode usar exit () e capturar isso mais tarde. Die () no entanto não suporta isso.

Die () sempre existe com o código 0. Portanto, essencialmente, um comando die () faz o seguinte:

<?php
echo "I am going to die";
exit(0);
?>

Qual é o mesmo que:

<?php
die("I am going to die");
?>
Icheb
fonte
42
Isso não é verdade. diee exitsão idênticos (eles produzem o mesmo token do analisador ( T_EXIT) e são executados pelo mesmo código). Se o parâmetro for um número inteiro, ele retornará esse código para o shell. Se não estiver, ele irá imprimir-lo e retornar 0. Assim, diee exitsão, literalmente, aliases para cada-outro.
precisa saber é o seguinte
6
bem, se você sabe que pode usar exit ("Estou saindo ...");
Yuda Prawira
4
23 upvotes até agora por uma resposta que é simplesmente falsa! É por isso que nunca voto nas respostas até ler todas as respostas concorrentes da pergunta e compreendê-las todas (exceto as terrivelmente escritas das quais não consigo entender).
Mark Amery
3
É exatamente sobre isso que @GeoffreyHale escreve em sua resposta. O que você postou como resposta é o que se espera, vindo de um idioma como Perl ou C. Mas, como os outros mencionaram, não é verdade para php. Você pode realmente considerar editar sua resposta para refletir isso ou excluí-la de outra forma.
levita