if () {}와 if ()의 차이점 : endif;


159

차이점이 있습니까?

if ($value) {

}

...과...

if ($value):

endif;

?


두 번째 방법은 PHP4 이후에있었습니다.
Miles


1
대부분의 대답은 실제로 요점을 다루지 않습니다 . 일부 코드를 볼 때 더 잘 작동하고 } } } }(와 함께 수행 할 수있는) 닫는 명령이 많이 있으며 endif어디에서 열려 있는지 알고 싶습니까? 대답은 둘 다 아니다 . 기본적으로 파이썬 디자인 원칙첫 번째 "규칙"입니다 .
cregox

7
분명히 {}더 낫고 : endif;삶이 공평하다면 존재하지 않는 괴로움입니다. 좋은 텍스트 편집기를 사용하면 대괄호 일치를위한 바로 가기 키를 사용하여 시작에서 끝으로 또는 그 반대로 이동할 수 있습니다. 끔찍한 : endif;구문 에는 그런 것이 존재하지도 않았습니다 .
developerwjk

3
@developerwjk 어떻게 존재할 수 없었습니까?
alex

답변:


177

그것들은 동일하지만 두 번째 코드는 코드에 MVC가 있고 코드에 많은 에코를 원하지 않는 경우 좋습니다. 예를 들어 내 .phtml파일 (Zend Framework)에서 다음과 같이 작성합니다.

<?php if($this->value): ?>
Hello
<?php elseif($this->asd): ?>
Your name is: <?= $this->name ?>
<?php else: ?>
You don't have a name.
<?php endif; ?>

38
@alex 그것은 중괄호로도 작동하지만 적어도 개인적으로는 이런 식으로 더 명확합니다. 그들은 그것이 일종의 루프 또는 다른 것의 끝이 아니라 if의 끝이라는 것을 알고 있습니다. 끝이 있고 끝이 있거나 비슷한 것이 있다고 생각하십시오.
Svish

10
<? =?>는 모든 서버, 특히 php.ini를 변경할 수없는 공유 호스팅 서버에서 지원되지 않기 때문에 사용하지 않을 것입니다.
Siqi Lin

2
적절한 요점은 <? php endif; ?>-앞의 if / else와이 명령문 사이에 많은 HTML 행이 있어도 정확히 끝나는 것을 알 수 있습니다.
Fenton

7
왜 "두 번째 코드가 코드에 많은 에코를 원하지 않는다면 좋을까요?" 전통적인 구문 {}에서도 동일하다고 생각합니다 . 추가 에코가 필요하지 않습니다 <?php if(...){ ?> ... <?php }else{ ?> ... <?php } ?>. 차이점은 무엇입니까 <?php if(...): ?> ... <?php else: ?> ... <?php endif ?>?
Sithu

9
좋은 예가 아니기 때문에 왜이 대답이 가장 높은 지 확실하지 않습니다 (중괄호를 사용하여 정확히 동일한 결과를 얻을 수 있습니다).
Reinier Kaper

69

나는 개인적으로 대체 구문을 정말 싫어합니다. 중괄호에 대한 한 가지 좋은 점은 대부분의 IDE, vim 등이 모두 대괄호 강조 표시라는 것입니다. 내 텍스트 편집기에서 괄호를 두 번 클릭하면 청크 전체가 강조 표시되어 어디서 끝나고 쉽게 시작되는지 확인할 수 있습니다.

endif, endforeach 등을 강조 표시 할 수있는 단일 편집기를 모르겠습니다.


11
이것은 PHP 템플릿에서 사용되며, 블록의 시작과 끝은 외국어 덩어리로 구분됩니다. 만약 당신의 IDE가 PHP를 잘 해석 할 수있을만큼 충분히 이해한다면, 또한 endifend-of-block으로 강조해야합니다 . 그렇지 않으면 }어쨌든 일치 하지 않으므로 실제로 아무것도 사지 않습니다.
Pavel Minaev

2
대부분의 아이디어 (적어도 내가 사용한 것)는 {}
AntonioCS

11
Netbeans 7.x는 endforeach, endif 등과 일치하는 항목을 행복하게 강조합니다.
Jonathan Day

@씨. Minaev : 중괄호 매처는 아마도 98 %의 경우에 올바르게 구문 분석 할 것입니다. 내부에 외부 코드가 있더라도 말입니다. 내부에 "열기이지만 닫지 않는 코드"라는 중괄호가있는 경우에만 실패합니다. 그렇습니다. 그러나 거의 발생하지 않습니다. 왜 복잡한 "종말"이라고 생각 하는가? 파서 접근법은 간단한 솔루션보다 실제로 더 잘 수행됩니까?
PatlaDJ

가장 중요한 요점은 필요할 때 설명 적이 라고 생각합니다 . 따라서 어떤 도구를 사용해야하는지에 관계없이 열린 위치를 쉽게 찾을 수 있습니다. 때로는 가장 단순한 편집기를 사용해야하는 PHP의 경우 특히 그렇습니다.
cregox

49

나는 이것이 모든 것을 말한다고 생각한다.

이 대체 구문은 혼합 된 상황에서 가독성을 향상시키는 데 탁월합니다 (PHP 및 HTML 모두에 대해!).

http://ca3.php.net/manual/en/control-structures.alternative-syntax.php

HTML과 PHP를 혼합 할 때 대체 sytnax를 훨씬 쉽게 읽을 수 있습니다. 일반적인 PHP 문서에서는 전통적인 구문을 사용해야합니다.


7
+1, 목적이 무엇인지에 대한 좋은 답변. 개인적으로 나는 그것이 이미 어수선한 언어에 무의미한 추가라고 생각합니다.
Draemon

29

회사에서 HTML을 처리하는 기본 방법은 다음과 같습니다.

<? if($condition) { ?>
   HTML content here
<? } else { ?>
   Other HTML content here
<? } ?>

결국, 그것은 실제로 하나를 선택하고 고수하는 문제입니다.


감사합니다-이 답변을 업데이트했습니다. 덤불 주위를 약간 때리지만 도움이 될 수 있습니다.
gahooa

"우리"라고 말할 때 누구를 의미합니까?
Oddthinking

과도한 반향 문과 이스케이프 된 따옴표를 피하기 위해 +1 :)
John McCollum

오류 :<?php if(TRUE){?> test <?php }?> <?php else{ ?> test2 <?php }?>
Yousha Aleayoub

13

그것들은 실제로 기능적으로 동일합니다.

그러나 endif통신원으로부터 너무 멀어지면 if참조 의견을 제시하는 것이 훨씬 좋습니다. 열린 위치를 쉽게 찾을 수 있습니다. 어떤 언어인지에 관계없이 :

if (my_horn_is_red or her_umbrella_is_yellow)
{

    // ...

    // let's pretend this is a lot of code in the middle

    foreach (day in week) {
        sing(a_different_song[day]);
    }

    // ...

} //if my_horn_is_red

그것은 실제로 모든 유사한 "닫는 것"에 적용됩니다! ;)

또한 일반적으로 편집자는 중괄호를 더 잘 다루므로 열린 위치를 가리킬 수 있습니다. 그렇다고해서 설명적인 주석이 덜 유효한 것은 아닙니다.


1
endif를 입력하는 대신 이것이 훨씬 낫다는 데 동의하십시오 .if 조건이 실제로 무엇을하고 있는지 말할 수 있습니다.
cartalot

@cartalot 어쩌면 언어로 내장 된 것이 좋을 수도 있습니다 (선택적 인 named named block 인수로). 따라서 잘못된 장소에서 잘못된 블록을 닫는 데 오류가있을 수 있습니다! :)
cregox


9

뷰 스크립트에서 ifs, fors 및 foreaches 를 함께 사용할 때 특히 명확하다고 생각합니다 .

<?php if ( $this->hasIterable ): ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ):?>
        <?php for ( $i = 0; $i <= $val; $i++ ): ?>
        <li><?php echo $key ?></li>
        <?php endfor; ?>
    <?php endforeach; ?>
    </ul>
<?php elseif ( $this->hasScalar ): ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ): ?>
    <p>Foo = Bar</p>
    <?php endfor; ?>
<?php else: ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ): ?>
    <p>Spam</p>
    <?php else: ?>  
    <p>Eggs</p>  
    <?php endif; ?>
<?php endif; ?>

반대로 :

<?php if ( $this->hasIterable ){ ?>
    <h2>Iterable</h2>
    <ul>
    <?php foreach ( $this->iterable as $key => $val ){?>
        <?php for ( $i = 0; $i <= $val; $i++ ){ ?>
        <li><?php echo $key ?></li>
        <?php } ?>
    <?php } ?>
    </ul>
<?php } elseif ( $this->hasScalar ){ ?>
    <h2>Scalar</h2>
    <?php for ( $i = 0; $i <= $this->scalar; $i++ ){ ?>
    <p>Foo = Bar</p>
    <?php } ?>
<?php } else { ?>
    <h2>Other</h2>
    <?php if ( $this->otherVal === true ){ ?>
    <p>Spam</p>
    <?php } else { ?>  
    <p>Eggs</p>  
    <?php } ?>
<?php } ?>

이것은 바닥 괄호에서 상단 선언을 볼 수없는 긴 제어문에 특히 유용합니다.


7

나는 그것이 당신의 개인 코딩 스타일에 달려 있다고 생각합니다. C ++, Javascript 등에 익숙하다면 {} 구문을 사용하는 것이 더 편할 것입니다. Visual Basic에 익숙하다면 if : endif; 통사론.

한 사람이 다른 사람보다 읽기 쉽다고 확실히 말할 수 있는지는 확실하지 않습니다. 개인적인 취향입니다. 나는 보통 이런 식으로합니다 :

<?php
if ($foo) { ?>
   <p>Foo!</p><?php
} else { ?>
   <p>Bar!</p><?php
}  // if-else ($foo) ?>

그게 읽기 쉬운 지 아닌지 :

<?php
if ($foo): ?>
   <p>Foo!</p><?php
else: ?>
   <p>Bar!</p><?php
endif; ?>

의견의 문제입니다. 왜 일부 사람들이 두 번째 방법이 더 편하다고 생각하는지 알 수 있습니다.하지만 평생 Javascript와 C ++로 프로그래밍하지 않은 경우에만 가능합니다. :)


1
아니요, 괄호는 객관적으로 읽기 쉽습니다 (이집트 버전을 사용하지 않는 경우). 대괄호를 사용하여 이집트처럼 걷더라도 VB 구문보다 읽기 쉽습니다. 현대 텍스트 편집기에는 대괄호 일치 기능이있어 대괄호를 열거 나 닫는 등의 방법을 사용할 수 있기 때문입니다. VB 구문 일치 기능을 가질 수있는 방법은 없습니다. 또한 중첩을 고려해야하며 VB는 그에 대해 비참하게 실패합니다.
developerwjk

5

새 옵션에 관계없이 가능한 경우 첫 번째 옵션을 사용합니다. 구문은 표준이며 모든 사람이 알고 있습니다. 또한 이전 버전과 호환됩니다.


5

둘 다 동일합니다.

그러나 : 뷰 파일 (VVC의 V)에서 템플릿 언어로 PHP를 사용하려면이 대체 구문을 사용하여 비즈니스 논리 (MVC의 컨트롤러 및 모델 부분)를 구현하기 위해 작성된 PHP 코드와 gui- 논리. 물론 필수는 아니며 원하는 구문을 사용할 수 있습니다.

ZF는이 방법을 사용합니다.


5

두 구문 사이에는 기술적 인 차이가 없습니다. 대체 구문은 새로운 것이 아닙니다. 그것은 적어도 PHP 4까지, 그리고 아마도 이전에는 지원되었습니다.

: 명시 적으로 제어 구조가 종료되는 상태 때문에 대체 양식을 선호 할 수도 endwhile, 예를 들어이 만 종료 할 수 while블록을 당신이 중괄호가 발생하면 반면에, 그것은 아무것도 폐쇄 될 수있다.

그러나 다른 C 유사 구문에서 중괄호를 특별히 지원하는 편집기를 사용하는 경우 기존 구문을 선호 할 수 있습니다. 예를 들어, Vim은 일치하는 괄호와 괄호로 구분 된 블록의 시작과 끝으로 이동하기위한 여러 키 입력을 지원합니다. 대체 구문은 해당 편집기 기능을 손상시킵니다.


3

결국 다음 줄을 찾고 시작 위치를 추측하고 싶지 않습니다.

<?php } ?>

기술적으로나 기능적으로도 동일합니다.


1
좋은 텍스트 편집기에는 대괄호 일치 바로 가기가있어 시작 위치로 이동할 수 있습니다. 그 endif;그들은 그것에 대해 유사한 기능을하지 않으며, VB 스타일의 코드가 잘 둥지를하지 않습니다 때문에,의 시작을 찾기 어려울 것이다.
developerwjk

3

개인적으로 나는 매우 쉽게 읽을 수 있기 때문에 에코와 많은 들여 쓰기가있는 전통적인 구문을 선호합니다.

<?php
    if($something){
        doThis();
    }else{
        echo '<h1>Title</h1>
            <p>This is a paragraph</p>
            <p>and another paragraph</p>';
    }
?>

나는 alt 구문이 다른 end 절로 더 깨끗하다는 데 동의하지만 텍스트 편집기 강조 표시의 도움없이 실제로 처리하는 데 어려움을 겪고 있으며 다음과 같이 "압축 된"코드를 보는 데 익숙하지 않습니다.

<?php if( $this->isEnabledViewSwitcher() ): ?>
<p class="view-mode">
    <?php $_modes = $this->getModes(); ?>
    <?php if($_modes && count($_modes)>1): ?>
    <label><?php echo $this->__('View as') ?>:</label>
    <?php foreach ($this->getModes() as $_code=>$_label): ?>
        <?php if($this->isModeActive($_code)): ?>
            <strong title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></strong>&nbsp;
        <?php else: ?>
            <a href="<?php echo $this->getModeUrl($_code) ?>" title="<?php echo $_label ?>" class="<?php echo strtolower($_code); ?>"><?php echo $_label ?></a>&nbsp;
        <?php endif; ?>
    <?php endforeach; ?>
    <?php endif; ?>
</p>
<?php endif; ?>

2

나는 중괄호를 사용했지만 지금은 코드 가독성과 접근성 때문에이 짧은 대안 구문을 사용하는 것을 선호합니다.


뷰 템플릿에서 사용합니다.
alex

2

개인적으로 나는 두 개의 별도 섹션에서 같은 PHP 내에서 만드는 것을 선호합니다.

<?php 
    if (question1) { $variable_1 = somehtml; }
    else { $variable_1 = someotherhtml; } 

    if (question2) {
        $variable_2 = somehtml2;
    }

    else { 
        $variable_2 = someotherhtml2;
    }         

etc.
$output=<<<HERE
htmlhtmlhtml$variable1htmlhtmlhtml$varianble2htmletcetcetc
HERE;
echo $output;

?>

그러나 아마도 느릴까요?


1

나는 그것이 선호의 문제라고 생각합니다. 나는 개인적으로 사용합니다 :

if($something){
       $execute_something;
}

1
전체 스레드를 읽은 경우 : PHP보기에서 외국어를 템플릿으로 사용하거나 사용할 때 대체 구문이 선호되고 훨씬 더 깨끗합니다.
Juraj Blahunka

1

"if, else"조건에 중괄호를 사용했습니다. 그러나 "if (xxx) : endif;"를 찾았습니다. 코드가 크게 래핑되어 모든 편집기에서 쉽게 읽을 수 있으면 더 의미가 있습니다.

물론 많은 편집자들은 중괄호가 선택 될 때 코드 덩어리를 인식하고 강조 할 수 있습니다. 일부는 "if (xxx) : endif"쌍 (예 : NetBeans)에서도 잘 수행됩니다.

개인적으로, 나는 "if (xxx) : endif"를 추천하지만 작은 상태 점검 (예를 들어, 한 줄의 코드)의 경우에는 큰 차이가 없습니다.


1

기존 답변 중 어느 것도 여기에서 답변을 완전히 식별하지 못한다고 생각하므로 내 관점을 분명히 표현할 것입니다. 기능적으로 두 방법은 동일합니다. 프로그래머가 C 구문을 따르는 다른 언어에 익숙하다면 중괄호에 더 익숙 할 것입니다. 그렇지 않으면 PHP가 배우는 첫 번째 언어 인 경우 if endif구문에 더 익숙해집니다. 일반 언어로.

당신이 정말로 심각한 프로그래머이고 빨리 일을해야한다면, 나는 중괄호 구문이 타이핑하는 시간을 절약하기 때문에 우수하다고 생각합니다

if(/*condition*/){
    /*body*/ 
}

에 비해

if(/*condition*/):
    /*body*/
endif;

이것은 다른 루프, 특히 foreach10자를 추가로 입력하는 곳에서 특히 그렇습니다 . 중괄호를 사용하면 두 문자 만 입력하면되지만 키워드 기반 구문의 경우 모든 루프 및 조건문에 대해 추가 키워드를 모두 입력해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.