[PHP] String 객체를 다루는 방법 (EOT, ob_start, ob_get_contents, ob_end_clean, ob_end_flush)


Development note/PHP  2019. 10. 26. 01:01

안녕하세요. 명월입니다.


이 글은 PHP에서 String 객체를 다루는 방법에 대한 글입니다.


기본적으로 PHP는 스크립트이기 때문에 String 객체를 다루는 것에 대해 컴파일 언어보다는 많이 편합니다. 뭐 요즘에는 Java나 C#의 경우도 Formatter나 보간법등을 통해 예전보다는 사용하기 많이 편해졌습니다.

링크 - [C#] String 보간법(interpolation)


PHP에서 String을 다루는 방법은 가장 기본적인 스트링 변수를 생성($str)하고 점(.)을 통해서 객체를 이어갑니다. 그리고 출력을 할 때는 echo나 <?=$str ?> 형식을 사용합니다.

<?php
  // 변수 선언
  $str = "hello";  
  // 문자열 연결하기
  $str = $str." world";
?>
<!DOCTYPE html>
<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    <?=$str?>
  </body>
</html>

여기서 String 내용이 길거나 많은 개행이 들어가 있는 글이라면 위처럼 사용하면 코딩 길이가 길어지게 됩니다. 그럴 때 사용할 수 있는 문법이 EOT 문법입니다.

링크 - https://www.php.net/manual/en/language.types.string.php

<?php
  // 시작은 <<<(구분문자)
  $str = <<<EOT
  Hello world <br />
  welcome <br />
EOT;
//(구분문자);
?>
<!DOCTYPE html>
<html>
  <head>
    <title>Test</title>
  </head>
  <body>
    <?=$str?>
  </body>
</html>

저는 예제로 구분문자를 EOT라고 했지만 만드시 「<<<EOT」가 아닌 「<<<TEST」 이런 식으로 구분문자를 만들면 됩니다.

그리고 EOT문법이 끝나는 부분에는 「(구분문자);」의 형식으로 끝나야 합니다. 주의할 점은 종료할 때 해당 행의 앞에 스페이스나 탭문자도 있어서는 안됩니다.


그리고 String 포멧 형식으로도 사용할 수 있습니다.

링크 - https://www.php.net/manual/en/language.types.string.php

(참고 - 사실 도큐멘트에는 Complex (curly) syntax이라고 표현이 되어 있는데.. 한국말로 표현이 어렵네요. 포멧팅 문법은 정식 용어가 아닙니다.)

<?php
  $insert = "insert";
  $str = <<<EOT
  Hello world <br />
  welcome <br />
  <!-- 변수의 형태로 데이터를 넣을 수 있다. -->
  {$insert}
EOT;
  // 변수의 형태로 데이터를 넣을 수 있다.
  $title = "title {$insert} end";
?>
<!DOCTYPE html>
<html>
  <head>
    <title><?=$title?></title>
  </head>
  <body>
    <?=$str?>
  </body>
</html>

그리고 PHP의 ob_start, ob_get_contents, ob_end_clean를 이용해서 PHP의 객체 버퍼를 이용해서 String를 작성할 수 있습니다.

링크 - https://www.php.net/manual/en/function.ob-start.php

링크 - https://www.php.net/manual/ja/function.ob-get-contents.php

링크 - https://www.php.net/manual/ja/function.ob-get-contents.php

<?php
  // php 버퍼 작성 개시
  ob_start();
  // 사실 여기에서 아래의 data.php를 include하면 아래 ob_end_clean함수를 사용하지 않았으면 그대로 화면에 표시가 됩니다.
  include "data.php";
  // 여기까지 php 버퍼에 쓰여진 response body 데이터를 $output 변수에 담습니다.
  $output = ob_get_contents();
  // response body 초기화
  ob_end_clean();
?>
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <?=$output?>
  </body>
</html>
<?php
  $data = 'data';
?>
hello world<br />
<?=$data?>

아마도 이 문법을 잘 사용하면 smarty나 twig같은 PHP 템플렛을 만들 수 있습니다.

이 ob_start()에 대한 설명이 나온 김에 갱신하는 방법까지 소개하겠습니다.

<?php
  function callback($buffer)
  {
    // 버퍼 안에 있는 값이 string으로 나온다.
    // ##data##의 문자를 hello world로 치환한다.
    return str_replace("##data##","hello world",$buffer);
  }
  // php 버퍼 작성 개시
  ob_start("callback");
?>
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    ##data##
  </body>
</html>
<?php
  // 버퍼 갱신을 하는데 start에서 선언 된 callback 함수가 호출된다.
  ob_end_flush();
?>

여기까지 PHP에서 사용하는 PHP 문법에 대해 설명헀는데 꽤 여러가지 형태로 String를 다룰 수 있습니다.

제 생각에는 이런 String을 다룰 수 있는 기법이 있어서 블로그 플랫폼이나 게시판 플랫폼이 PHP로 많이 작성되지 않을까 생각합니다.


여기까지 PHP에서 String 객체를 다루는 방법에 관한 설명이었습니다.


궁금한 점이나 잘못된 점이 있으면 댓글 부탁드립니다.