PHP에서“do something OR DIE ()”는 어떻게 작동합니까?


99

MySQL 데이터베이스에 액세스하기 위해 PHP 앱을 작성 중이며 자습서에서 다음과 같은 형식을 말합니다.

mysql_connect($host, $user, $pass) or die("could not connect");

PHP는 함수가 실패하여 die 부분을 실행한다는 것을 어떻게 알 수 있습니까? 나는 그것의 "또는"부분이 어떻게 작동하는지 묻는 것 같다. 전에 본 적이없는 것 같아요.


3
제쳐두고 실제 응용 프로그램에서 이러한 종류의 논리를 사용하지 마십시오. 얼마나 많은 자습서가 그렇게하는지 여전히 놀랍습니다.
Eran Galperin

2
왜 사용하지 않습니까? 정말 멋지고 읽기
쉽습니다

11
자습서에는 간단하고 적절할 수 있지만 실제 사용자 앞에서와 같은 오류 메시지와 함께 스크립트가 비정상적으로 종료되는 것을 원하지 않습니다. 사용자 정의 오류 페이지 표시 (실제 오류를 지정하지 않고!) + 오류 로깅은 필수입니다.
Eran Galperin

4
나는 "죽음"이 아니라 "또는"에 대해 이야기하고있다.
Artelius

21
mysql_connect ($ host, $ user, $ pass) 또는 PrintNiceError ( 'DatabsaeConnectionError');
matpie

답변:


133

첫 번째 명령문 true이을 반환 하면 전체 명령문이되어야 true하므로 두 번째 부분은 실행되지 않습니다.

예를 들면 :

$x = 5;
true or $x++;
echo $x;  // 5

false or $x++;
echo $x; // 6

따라서 쿼리가 실패하면 die()문 을 평가 하고 스크립트를 종료합니다.


1
좋은 설명입니다. PHP의이 "묵시적 if"언어 구조는 약간 위험합니다. 왜냐하면 실행될 것이라고 생각하지만 실제로는 실행하지 않는 명령문을 가질 수 있기 때문입니다. 이것은 if 블록이있는 것처럼 명확하지 않습니다.
Petruza

6
이를 단락 평가라고하며 PHP 이외의 언어에서도 유용합니다.
Mr Griever

1
그건 그렇고 OR 뒤에는 하나의 문만 사용할 수 있습니다. 블록 문이 구문 검사에 실패합니다 (예 : 실제 오류 메시지는 구문 분석 오류 일 수 있음 : 구문 오류, ...에서 예기치 않은 '{')
Scott Chu

그리고 여기 저는 이것이 파이썬의 with진술 과 같은 일종의 고급 기능 이라고 생각했습니다. 실제로 부울 표현식 일 때 ... 나는이 표현식을 사용할 때 특별히주의를 기울여야한다고 생각합니다. 오류. 제가 틀렸다면 저를 정정하십시오.하지만 그렇게 func_call($file) or die();하여 기능이 실패하면 스크립트가 죽을 때 파일이 열린 상태로 유지됩니다.
pedromanoel 2012

@Petruza가 작동 할 수 or있는 상황에서 사용하는 것이 좋은 습관 if입니까?
limeandcoconut

32

PHP or는 C와 비슷하게 작동합니다 ||(부수적으로 PHP에서도 지원됩니다. or더보기 좋고 연산자 우선 순위가 다릅니다 . 이 페이지 참조 ).

그것은로 알려진 단락 이 최종 값을 결정하기에 충분한 정보를 가지고 일단 어떤 평가를 건너 뛸 수 있기 때문에 운영자.

경우의 예에서, mysql_connect()반환 TRUE, 다음 PHP는 이미 전체 문장이 무엇인지에 상관없이 TRUE로 평가 없다는 것을 알고 die()에 evalutes, 따라서 die()평가되지 않습니다.

경우 mysql_connect()반환 FALSE, PHP는 evalute으로 진행하고 시도 때문에 전체 문이 TRUE 또는 FALSE로 평가할지 모르는 die()- 그 과정에서 스크립트를 종료.

or작동 방식을 활용하는 멋진 트릭입니다 .


이름 단락에 +1. "부작용"이라는 이름도있을 수 있습니다. 우리는 die () 반환 코드에 전혀 관심이 없으며 실행 효과 만 원합니다. (항상 die ()가되는 것은 아닙니다). 일부 효과가 모호 할 수 있으므로 순수 주의자들에게 항상 인기있는 것은 아닙니다.
mckenzm

그리고 이것이 전부가 아닙니다. 두 번째 작업을 수행하기 전에 한 가지가 확실히 작동하기를 원하는 곳에서 항목을 사용하고 결합 할 수도 있습니다.
My1

11

다른 사람들이 설명한대로 작동합니다.

PHP에서는 예외를 발생시키지 않으므로 "die"를 사용하지 마십시오 (Perl에서와 같이). 대신 정상적인 방식으로 예외를 올바르게 처리하십시오.

die는 PHP에서 잡힐 수 없으며 기록하지 않습니다. 대신 메시지를 비정상적으로 인쇄하고 아무에게도 알리거나 이벤트를 기록하고 재 시도 할 기회를주지 않고 즉시 스크립트를 종료합니다.


-1
$con=mysql_connect($host, $user, $pass)
if(!$con)
{
     die("could not connect");
}
else
{
     echo "Connected";
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.