2010-06-14 5 views
2

참고 : 출력 버퍼링을 사용하고 있습니다. 그것은 단지 head() 및 foot() 함수로 싸여 있습니다.die()의 적절한 사용?

나는 다음과 같은 템플릿을 사용하여 현재 PHP 프로젝트 페이지를 만들 :

<?php 
include 'bootstrap.php'; 
head(); 
?> 

<!-- Page content here --> 

<?php 
foot(); 
?> 

는 다음 예는 다이의 적절한 사용이다()? 또한, 어떤 종류의 문제로 인해 이것이 발생할 수 있습니까?

<?php 
include 'bootstrap.php'; 
head(); 

try 
{ 
    //Simulate throwing an exception from some class 
    throw new Exception('Something went wrong!'); 
} 
catch(Exception $e) 
{ 
    ?> 
    <p>Please fix the following error:</p> 
    <p><?php echo $e->getMessage(); ?></p> 
    <?php 
    foot(); 
    die(); 
} 

//If no exception is thrown above, continue script 
doSomething(); 
doSomeOtherThing(); 

foot(); 
?> 

기본적으로, 나는 그것에 여러 작업에 스크립트를하고 난 실행에서 스크립트의 나머지 부분을 방지하면서 입력 오류의 사용자에게 통지하는 우아한 방법을 설정하려합니다.

감사합니다.

+7

'die ('PHP')' 나는 꼬마 야. –

답변

3

전체 페이지 구조가 잘못되었습니다.
초보자에게 가장 널리 퍼진 실수이지만.

모든 데이터를 준비하기 전에 한 가지를 출력해서는 안됩니다.
스크립트에서 일부 HTTP 헤더를 보내거나 헤더() 또는 기타 변수에 사용할 변수를 설정할 수 있습니다.

따라서 템플릿을 사용해야합니다.
스크립트를 데이터 부분과 데이터 부분을 표시하는 두 부분으로 나눠야합니다.
그래서 header() 함수를 훨씬 더 낮게 이동해야합니다.
그리고 Amadan의 답변에 따라이

<?php 
include 'bootstrap.php'; 
try { 
    getData(); 
} catch (Exception $e) { 
    handleError(); 
} 
head(); 
body(); 
foot(); 
?> 

는 handleError() 함수는 오류 메시지 텍스트 적절한 HTTP 오류 코드 (404 또는 500) 및 대체 몸 템플릿을 설정할 수 있습니다 될 수 있습니다.

+0

출력 버퍼링은 여기에 있습니다. 때로는 원하는 데이터가 스크립트가 이미 보내려고했던 데이터입니다. 하지만 그래, 더 나은 별도의 출력에서 ​​데이터 처리 HTML 코드 (또는 당신이 사용하는 템플릿 시스템) PHP 코드의 중간에 엉망이 없어. – Arkh

+1

@Arkh no, 출력 버퍼링은 변수의 페이지 제목을 설정하는 데 도움이되지 않습니다. –

+0

안녕하세요. 답변 해 주셔서 감사합니다. 그래도 나는 부분적으로 의견을 달리해야합니다. "전체"페이지 구조가 잘못되었습니다. bootstrap.php include (스크립트 시작 부분)를 통해 대부분의 데이터를 얻습니다. head() 내부에서 출력 버퍼링을 시작합니다. b/c 전에 출력 할 확률이 없으며 head() 함수에 변수를 전달할 수 있습니다. 출력 버퍼링은 foot() 함수 내에서 끝납니다. 이제 스크립트의 중간 부분 (head()와 foot() 사이)에 대해 전적으로 동의합니다. 보기 전에 데이터를 검색 할 수 있도록 리팩터링해야합니다. 감사! –

4

나는이 작업을 수행 할 것 :

head(); 
try { 
    somethingPossiblyWithError(); 
    somethingElse(); 
} catch (Exception $e) { 
    handleError(); 
} 
foot(); 

아니 죽음 필요. somethingPossiblyWithError에서 오류가 발생하면 somethingElse은 건너 뜁니다. foot 두 경우 모두에서 실행됩니다.

업데이트 : 나는 당신이 그것에 대해 생각하지 않았으며 지식의 귀중한 부분이라고 생각하기 때문에 Shrapnel의 대답을 강조했다. PHP에서 값을 명시 적으로 전달하지 않고도 output buffering에 의해 동등한 기능을 얻을 수 있지만 꽤 좋지는 않습니다. 그러나 일을 인쇄하고 값으로 반환하지 않는 함수를 호출 할 때 작동하므로 가끔은 유용합니다. .

+0

예를 들어 주셔서 감사합니다. 나는 그것이 가능하다고 생각하지는 않았지만, 분명히 die()를 사용하는 것을 피하는 좋은 방법이다. –

1

당신의 접근 방식은 여러 가지 이유로 권장되지 않습니다.당신은해야한다 :

  • 프리젠 테이션 및 논리는
,
  • 하는 절차 코드를 피하기 (MVC 패턴을 살펴) 객체 지향 PHP
  • 별도의 사용자 및 관리 경험을 쓰기 (부드럽게 오류를 처리) 별도

    예, 위의 구현 :

    <? $page->debug = true; ?> 
    <?= $page->getHead(); ?> 
    <?= $page->getBody(); ?> 
    <?= $page->getFoot(); ?> 
    
    class page { 
    
        public debug; 
    
        public function getBody() { 
         try { 
          // 
         } catch (Exception $e) { 
          $this->_errorhandler('message'); 
         } 
        } 
    
        protected function _errorhandler($message) { 
         if ($this->debug) { 
           // display error message 
          } else { 
          // display nothing, log the error 
          // or throw concrete exception 
          // or redirect 
          } 
        } 
    ... 
    } 
    

    이 너무 사용하지 않는 것이 좋습니다 (이 아칸소 각 작업에 필요한 많은 별도의 클래스),하지만 당신은 요점을 보게됩니다 : 분리, 모든 것을 섞어서는 안됩니다.

  • +0

    짧은 태그를 제안하지 마십시오. –