2010-01-26 3 views
1

저는 약 1 년 동안 PHP로 작업 해 왔으며 마침내 OOP에 대한 이해를 돕기 시작했습니다. 이제는 클래스를 작성하면서 PHP를 HTML로 가장 깨끗하게 처리하는 방법을 찾고 있습니다. 필자는 본질적으로 데이터베이스에 저장된 데이터를 출력하는 몇 가지 클래스를 작성했습니다.PHP는 HTML을 깨끗하게 유지합니다

예를 들어 getUserNameByIndex ($ index)라는 함수를 작성한 "사용자"클래스의 인스턴스를 인스턴스화합니다.이 값은 내가 선호하는 매너의 HTML에 쓸 수있는 값을 "에코"합니다. like :

<h1> The <?php $user->getUserNameByIndex($index) ?> is not online </h1> 

내게 부끄러워하는 것은 내가 필요한 문자열 배열을 가지고 있다면 내 HTML에 더 많은 PHP를 작성해야하므로 내 출력 페이지가 다른 PHP 스크립트처럼 보이게 만드는 것입니다. 예를 들어

:

<span> His likes are:<br> <?php foreach($user->likes as $like){ if($like != foo){echo $like . '<br>' }} ?> 

그냥 나에게 깨끗하지 않는 것,하지만 난 클래스의 방법으로 출력을 작성하는 경우, 내 스타일 컨트롤의 일부를 멀리 데려 갈거야. 내가 여기서 찾고있는 균형이 있는지 궁금 하네. 또는 HTML에 표시 할 문자열 배열을 처리하는 표준 방법이있는 경우 나는 이것이 의미가 있고 바보 같은 질문이 아니길 바란다. HTML을 다시 작성하는 것에 너무 흥분하며, 어쨌든 코드에서 PHP 풋 프린트를 최소화하는 것이 큰 보너스입니다.

감사합니다.

답변

3

디자인에서 코드를 분리하는 좋은 방법은 Model-View-Controller (MVC) 디자인 패턴입니다.
구체적으로, 귀하의 경우 모델 분리 (데이터 처리) 및보기 (디스플레이)를 찾고 있습니다.

PHP에 이미 많은 구현이 있습니다.

CodeIgniter
Kohona
Symfony
Zend

(그리고, 당신이 템플릿 언어 파서 같은 템플릿 언어를 사용하여 반대하지 않은 경우, 나는보고 제안 할 수 있습니다 : 보는 가치가있는 것을 몇 가지가 있습니다 Tiny But Strong)

+1

CodeIgniter 등을 공유해 주셔서 감사합니다. 조금만 배우면 속도가 빨라질 수 있습니다 ... 나는 질문조차하지 않았습니다! –

0

당신은 항상 더 쉬운 HTML의 PHP 구문을 사용할 수 있습니다

<?php foreach($user->likes as $like) : 
    if($like != foo): 
?> 
    <?=$like?><br> 

<?php 
    endif; 
endforeach; ?> 
+0

'태그는'short_open_tag' 지침을 필요로'그건 켜져있다. – Svish

0

Jascha, 나는 당신이 중반 HTML을 쓸 수 있도록 php에서 원하는 모든 것을 작성하기위한 메소드로 페이지 클래스를 만들려고한다.

/* at the top of the file somewhere... */ 
$page = new PageWriter(); 
.... 
<!-- in the html body --> 
<p><?php $page->print_users_likes($user); ?></p> 

물론 이러한 메소드를 기존 클래스에 추가하거나 include 또는 require에서 일반적인 메소드로 사용할 수 있습니다.

이 순수 화장품 인 일을하는 이유 - 당신이 당신의 HTML 페이지에서 볼 수있는이 방법은 무엇이보다는 벌어지고있는 몇 가지에 대한-루프 등 알고리즘 내가 보는 게 좋을 것

가 포함 PHP에서 함수가 필요합니다. PHP에서 특정 페이지가 아닌 특정 비트를 제거하기 위해이 함수를 사용합니다.

+0

나는이 아이디어를 아주 좋아한다. 아홉. –

+0

probs 없음 - 나는 주석/주석 처리되지 않은, 읽을 수없는 what-did-I-do-yesterday 코드에 대한 필요성을 줄이기 때문에 항상 코드 자체를 문서화하려고합니다 ... –

0

output buffering을 사용할 수도 있습니다. 템플릿을 클래스에로드하고 컴파일 된 HTML 코드를 반환 할 수 있습니다.

0

PHP 용으로 Smarty Templating Engine을 적극 권장합니다. 프리젠 테이션 (HTML)을 논리와 분리 할 수 ​​있습니다. (PHP) 캐싱과 같은 기능이 내장되어있어 PHP와 HTML을 혼합하는 과정을 단순화합니다.

stable 릴리스에서는 (v2) 이미 다소 객체 지향적입니다. (PHP5 + 호환)

0

PHP의 성격을 감안할 때, 나는 Smarty 과용과 같은 템플릿 시스템을 발견했습니다. 확실히 PHP와 html 코드를 끊임없이 교환하는 것은 지저분하고 읽기가 어렵습니다. 그러나

$all_likes=implode('<br />',$user_likes); 
print "<span> His likes are:<br /> $all_likes</span>"; 

당신이 (다국어 웹 사이트 등)을 다른 문자열로 여러 대체 처리의 시나리오를 고려하는 경우 다음 더 나은 솔루션을 수 있습니다 :

한 가지 해결책은 문자열 내에서 변수를 보간하는 것입니다 사용 [S]의 printf :

$template="<span> %s likes these:<br />$s</span>"; 
... 
printf($template, getUserNameByIndex($index), implode('<br />',$user_likes)); 

: 당신이 유전자를 원하는 경우

(BTW이 중 어느 것도 특별히 OO와 아무 정말 없음) 당신이 좋아하는 뭔가를 할 수 이러한 템플릿에 값의 인해 임의 설정 포맷을 다루는 RIC 방법 :

print render("<span>$s likes %s</span>",array($username, $user_likes)); 

function render() 
{ 
    $args=func_get_args(); 
    foreach ($args as $key=>$val) { 
     if ($key && is_array($val)) { 
     $args[$key]=flatten($val); 
     } 
    } 
    return call_user_func_array('sprintf',$args); 
} 

function flatten($inp) 
{ 
    // there's probably a smarter way of doing this with 
    // the array fns 
    $out=''; 
    $join=''; 
    foreach ($inp as $val) { 
     $out.=$join; 
     if (is_array($val)) { 
     $out.=flatten($val); 
     } else { 
     $out.=$val; 
     } 
     $join="<br />\n"; 
    } 
    return $out; 
} 

HTH

C를