2009-02-03 4 views
40

성능면에서 어떤 점이 더 좋을까요? PHP를 사용하여 모든 HTML 출력을 에코하여 작업 코드 및 변수의 다양한 비트로 후 처리하거나 문서 전체에서 HTML을 PHP로 정기적으로 이스케이프 처리 할 수 ​​있습니다.HTML을 PHP로 이스케이프 처리하거나 에코를 사용 하시겠습니까? 어떤게 더 좋아?

일부 가독성 문제가있을 수 있음을 알고 있지만 걱정하지 않아도됩니다.

감사합니다.

예 1

echo '<html>', 
    '<body>', 
    'The content of the ',$container,' element is displayed in your ', $other_container, 
    '</body>', 
    '</html>'; 

OR

<html> 
<body> 
The content of the <?php echo $container; ?> element is displayed in your <?php echo $other_container; ?> 
</body> 
</html> 
+1

코드가 자동으로 수정되었습니다. 미래에, 들여 쓰기 코드 4 공백으로 stackoverflow 코드로 인식 : –

+0

두 번째 예제는 갈 방법입니다. 다른 것은 코드 냄새입니다. 진지한 사람이 동의하지 않을 것입니다. –

답변

33

당신이 가장 잘 읽을 수있는 것이 전부입니다. 물론 이것은 각 상황에 따라 다를 것입니다. 만약 당신이 전체 페이지를하고 있었고 거기에 PHP가없는 커다란 섹션이 있다면, PHP를 벗어나 일반 HTML을 작성하는 반면, 많은 PHP 변수를 가진 섹션이 있다면 , 나는 PHP에서 그것을 모두 할 것입니다.

<table> 
    <tr> 
     <td colspan="<?php echo $numCols; ?>"> 
      <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?> 
     </td> 
    </tr> 
</table> 

대 : 예를 들어

<?php 
echo "<table>" 
    . "<tr>" 
    . "<td colspan=\"" . $numCols . "\">" 
    .  $a . ", " . $b . " and " . $c 
    . "</td>" 
    . "</tr>" 
    . "</table>" 
; ?> 

또는 또한

<?php 
echo "<table> 
     <tr> 
      <td colspan='{$numCols}'> 
       {$a}, {$b}, and {$c} 
      </td> 
     </tr> 
     </table>"; 
?> 

에 대한 printf

<?php 
printf("<table>" 
    . "<tr>" 
    . "<td colspan=\"%d\">%s, %s and %s</td>" 
    . "</tr>" 
    . "</table>" 
    , $numCols 
    , $a 
    , $b 
    , $c 
); 
?> 
을 잊지 마세요 0
+1

처음 몇 장을 읽고 완전히 동의하지 않았습니다. 나는 당신의 제안에 훨씬 동의한다! 우세한 것이 무엇이든간에 붙어 라. – benlumley

+4

당신은 heredoc을 놓쳤다;) – MarcinWolny

5

이것은 마이크로 최적화의 영역에 빠진다. 시간의 가장 큰 부분은 PHP 엔진을 초기화하여 작업을 시작하는 것입니다.

수만 줄 (또는 그 이상)의 주문을하지 않는 한, 그것에 신경 쓰지 않아도됩니다.

덧붙여서, 나는 백만 줄의 작은 테스트를했는데, 어디에서 php를 사용하여 인쇄했는지, 그리고 PHP를 사용하여 같은 일을 한 c 프로그램을 호출했을 때 그 차이가 아주 작았습니다.

조금 더 자세히.

두 번째 예제에서 일어나는 일은 PHP가 "켜기/끄기"라는 것입니다. 정확하게 일어나지는 않지만이 예에서는 적합합니다.

당신이 걱정해야 할 것은 코드가 그 주위에 많은 논리를 가지고있을 것인가? 그 문자열을 더 많은 문자열로 나누거나 심지어 다른 장소에 배치할까요? 이 MVC 응용 프로그램의보기가 있습니까?

1과 2의 경우 두 방법 중 하나를 선택하는 것이 좋습니다. 그러나 3을 위해 나는이 이유를 위해 방법 2에 갈 텐데.

MVC 웹 응용 프로그램의보기는 주로 html/css입니다. 그래서 나는 그것이 올바르게 포맷 된 것을보고 싶다. 그리고 나는 편집자에게 html 컬러링을보고 싶다. 그래서 그것은 더하기입니다.

+0

나는 당신의 요지를 이해하지만, 여전히 차이점을 알고 싶습니다. 감사. –

8

앱의 전반적인 속도와 관련이 없습니다.

내가 말했듯이, 당신이 신경 쓰지 않는다고 말했지만, 제 2의 것을 사용해보십시오. 그리고 가독성은 거대한입니다.

30

어느 것이 든 읽기 쉽습니다.

성능 차이는 발생할 수있는 거의 모든 다른 문제에 비해 무시해도됩니다. 명확하게 가독성은 여기서 첫 번째 문제를 다루고 있습니다.

2

작은 비트의 경우 목록을 생성하기 위해 배열을 반복 할 때처럼 PHP 문자열로 모두 유지합니다. 그러나 큰 마크 업 더미의 경우 PHP에서 제외하고 필요한 경우 PHP로 가져갑니다.

주로 유지 관리 가능성을 위해 최적화하는 것이 좋습니다. html에 적절한 구문 강조가 적용될 때 진행 상황을 보는 것이 더 빠르기 때문에뿐만 아니라 오류 발생 가능성이 낮은 코드로 인해 실수가 발생하기 때문에.

정말 좋은 방법은 없습니다. 나는 위에서 묘사 한 것과 일관되게하려고 노력할 것이고, 아마도 다른 방향으로 그것을 처리하는 더 좋은 방법이 될 수있는 상황에 대해 내 눈을 열어 두십시오.

22

의이 the manual을 인용 보자 :

는 물론,하지만, 큰 블록 텍스트의를 출력 PHP 중퇴에 대한 구문 분석 모드가 모든 보내는 것보다 일반적으로 더 효율적입니다 여기에 지정된 예는 인위적인한다 echo() 또는 print()를 통해 텍스트 의


그러나 다른 사람을 듣고 마이크로 최적화 이런 종류를 방지하고 더 읽을 수있는 하나를 선택하십시오.

세 번째 솔루션을 제안 할 수 있습니까? 템플릿 엔진에 대해 들어 보셨습니까? 코드와 프레젠테이션을 명확하게 분리하여 유지 보수가 쉬운 코드를 작성하는 데 도움이됩니다. 널리 사용되는 이러한 템플릿 엔진은 예를 들어, smarty,하지만 강점이 다른 수백 가지가 있습니다.

+0

나는 반향을 일으킨 html에서 html 형식을 무시한 채로 나는 쉽게 읽을 수있는 에코를 발견하게되어 놀라웠다. – Ishmael

+0

플러스 1은 성능과 관련하여 설명서를 인용 한 것입니다. – lowtechsun

1

후자는 훨씬 더 읽기 쉽습니다. 또한 더 쉽게 편집 할 수 있습니다 (예 : HTML에서 따옴표를 이스케이프하지 않아도 됨). 그리고 특히 디버깅 목적으로 선호 될 수있는 번거 로움없이 공백을 보존합니다.

거의 PHP가 print()echo()을 사용하면 사람들이 HTML 생성에 사용하지 못하도록 HTML 문자를 자동으로 변환 할 수 있습니다.

3

성능면에서 ... 중요하지 않습니다. 코드의 가독성은 매우 중요합니다. 성능 차이의 아주 작은 부분만으로는 아무 것도 변하지 않을 것입니다.

원시 HTML 버전은 일반적으로 가장 쉽게 읽을 수 있습니다 (그리고 가치가있는 부분에 대해서는 최상의 성능을 지니고 있지만 가치는 없습니다). 이것은 놀라운 일이 아닙니다 : PHP는 HTML 템플릿 언어이며 전체 은 언어 구문 수준에서 HTML을 인터리빙합니다.

nickf의 코드에서 어떻게 읽을 수 있는지 확인하십시오. 들여 쓰기가 중요합니다! 각 PHP 컨트롤 구조 안에 들여 쓰기 수준을 지정하여 추적 할 수 있습니다. 예.: 같은 귀하의 예제에서 $ 컨테이너 등의 내용을 출력 할 때

<?php if ($error) { ?> 
    <p> Oh no, error! </p> 
<?php } ?> 

마지막으로, 당신은 항상()를 반드시 htmlspecialchars해야한다, 또는 당신은 다른 모든 PHP 초보자와 같은 HTML 인젝션 보안 구멍의 전체 응용 프로그램을해야합니다 (그리고 많은 전문 개발자들조차도 슬프게도). 이는 콘텐츠를 출력하는 데 사용하는 방법에 관계없이 중요합니다.

반드시 htmlspecialchars 매우 짜증나 긴 함수 이름이기 때문에, 당신은 당신의 자신의 바로 가기 기능을 정의하는 시도 할 수 :

<?php 
    function h($s) { 
     echo(htmlspecialchars($s, ENT_QUOTES)); 
    } 
?> 

<ul> 
    <?php foreach ($things as $thing) { ?> 
     <li> <?php h($thing['name']) ?> </li> 
    <?php } ?> 
</ul> 
8

나는이의 성능에 대해 알고하지 않습니다,하지만 PHP에서 당신은 또한 사용할 수있는 I 믿음은 "Heredoc"이라고 불리우며, 이런 산출물 내에서 가독성에 도움이된다고 생각합니다.

Nickf의 예 :

<table> 
    <tr> 
     <td colspan="<?php echo $numCols; ?>"> 
      <?php echo $a; ?>, <?php echo $b; ?>, and <?php echo $c?> 
     </td> 
    </tr> 
</table> 

이된다 :

<?php 
echo <<<EOT 
<table> 
    <tr> 
     <td colspan="$numCols"> 
      $a , $b, and $c 
     </td> 
    </tr> 
</table> 

EOT; 

?> 

내가 궁극적으로 가독성이 너무 귀하의 마일리지가 다를 수 있으며, 주관적인 것입니다 믿습니다!

루스

+1

heredoc은 완벽하다고 생각했지만 사용 사례에 따라 조심해야 할 경고가있을 수 있습니다. 마지막'EOT; 앞에 공백이 있으면 모든 것이 끊어집니다. 실수로 이러한 일이 발생할 수있는 데에는 여러 가지 이유가 있습니다. 그냥 알고 있어야합니다. – user1167442

1

PHP를 HTML 내부에 배치하지 마십시오. 당신은 프로젝트를 지저분하게 만드는 뷰와 로직을 섞고 있습니다. 다른 사람이 말했듯이 당신은 정보의 톤이 출력 버퍼링을 들여다 출력이있는 경우

, HTML로 출력 할 경우, <?php echo $whatever; ?>

를 사용합니다.

3

프로젝트를 인수하는 다음 프로그래머가 연쇄 살인범 인 것처럼 코딩하십시오. 즉, 언급 한 두 번째 옵션을 사용하십시오.

+1

따라야 할 좋은 규칙. – edude05

3

이것은 성능 문제보다 가독성 및 유지 관리 문제로 더 많이 고려해야합니다.

  1. 코드 색상 :

    따라서, 옵션 2는 몇 가지 구체적인 장점이 있습니다. 옵션 1을 사용하면 HTML을 더 읽기 어렵게 만드는 echo 문으로 모든 것이 색칠됩니다.

  2. Intellisense - 많은 IDE가 있기 때문에 PHP echo 문 내의 HTML은 인텔리 센스에 영향을 미치지 않으므로 모든 HTML을 손으로 입력하게됩니다.
2

나는이 방법은 내가 어떤 문자를 이스케이프 할 필요가 없습니다 PHP heredoc 기능을 사용하는 것을 선호 예는 :

<?php 

$title = "heredoc is cool!!!"; 
$mySite = "http://www.php.net"; 

echo <<<LOL 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml" lang="en"> 
<head> 

    <meta charset="utf-8"> 
    <meta name="viewport" content="width=device-width"> 
    <meta name="viewport" content="width=device-width, initial-scale=1.0"> 

    <title> $title </title> 

<link rel="shortcut icon" href="$mySite/favicon.ico"> 
<link rel="search" type="application/opensearchdescription+xml" href="$mySite/phpnetimprovedsearch.src" title="Add PHP.net search"> 
<link rel="alternate" type="application/atom+xml" href="$mySite/releases/feed.php" title="PHP Release feed"> 
<link rel="alternate" type="application/atom+xml" href="$mySite/feed.atom" title="PHP: Hypertext Preprocessor"> 

<link rel="canonical" href="$mySite/manual/en/language.types.string.php"> 
<link rel="shorturl" href="$mySite/types.string"> 

<link rel="contents" href="$mySite/manual/en/index.php"> 
<link rel="index" href="$mySite/manual/en/language.types.php"> 
<link rel="prev" href="$mySite/manual/en/language.types.float.php"> 
<link rel="next" href="$mySite/manual/en/language.types.array.php"> 
LOL; 
?> 

참고 :

히어 닥 텍스트는 이중처럼 작동큰 따옴표없이 - 따옴표 붙은 문자열. 즉, heredoc의 따옴표는 일 필요는 없지만 위에 나열된 이스케이프 코드는 계속 사용할 수 있습니다. 변수는 확장되지만 문자열과 마찬가지로 heredoc 내부에서 복잡한 변수를 표현할 때 동일한주의를 기울여야합니다 ( ).

관련 문제