2009-05-18 3 views
2

큰 PHP 애플리케이션의 일부분을 수정해야합니다. 물론 다른 부분 (주로 인턴)이 작성한 부분입니다.PHP 논리 코딩 스타일

  • 는 스타일, HTML과 PHP를 혼합 'PHP는 인터넷의 접착제입니다':
예 : 코드를 통해보고 후, 나는 다른 개발자에 의해 사용되는 코딩의 2 개 스타일이 사실을 발견했습니다

[가위질]

<tr class="ds_subsubhead_2"> 
<td colspan="21" align="left">&nbsp;A&nbsp;<select name="nb_linge" onChange="MM_jumpMenu('parent',this,0)" style="vertical-align:middle">  <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','9999') ?>" <? if($messagesParPage == '9999') { ?>selected="selected"<? } ?>>Tous</option> 
    <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','25') ?>" <? if($messagesParPage =='25') { ?>selected="selected"<? } ?>>25</option> 
    <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','50') ?>" <? if($messagesParPage =='50') { ?>selected="selected"<? } ?>>50</option> 
    <option value="<?=get('index.php',$orgurl,'nb_ligne=','22','23','75') ?>" <? if($messagesParPage =='75') { ?>selected="selected"<? } ?>>75</option> 

[중략] 또는

[중략] 또는

<script type="text/javascript" src="<?=$_SESSION["path"]?>lib/js/ajax.js"></script> 

[싹둑]

  • ... 그리고 더 많은 절차 적 방법, 예 :

[중략]

 $output .= '<td valign="top"><form name="form5" method="GET" action=""><select name="m" onchange="this.form.submit()">'; 
    if (empty($_GET['p'])) $output .= '<option value=" ">All</option>'; 
    else $output .= '<option value='.$_GET['m'].'>'.$_GET['m'].'</option>'; 
    $query = "SELECT DISTINCT maoie FROM ".$BD."site"; 
    $res = mysql_query($query); 
    while ($row = mysql_fetch_assoc($res)) { 
     if(!empty($row['maoie'])) $output .= '<option value="'.$row['maoie'].'">'.$row['maoie'].'</option>'; 
    } 
    $output .= '</select></form></td>'; 
    $output .= add_more_stuff(); 
    echo $output; 

이제는 이것이 확실하지 않습니다. a 더 많은 것 절차적인 방법, 그러나 적어도 이전과 다르다. 어느 쪽이 입니까?이 더 좋을까요?

저는 개인적으로 '인터넷 스타일의 접착제'를 좋아하지 않습니다.

+8

거룩한 스파게티 배트맨! –

답변

3

세 번째 옵션이 있습니다. 템플릿이 있습니다. 템플릿은 아교 구토의 아교 또는 무작위 방출보다 읽기 쉽습니다. 나는 HEREDOCd 문자열과 str_replace를 사용하는 경향이있다. 따라서

$template = <<<TEMPLATE 
<html> 
<head> 
<title>{TITLE}</title> 
</head> 
<body> 
<div id='nav'>{NAV}</div> 
<div id='content'>{CONTENT}</div> 
</body> 
TEMPLATE; 

$data = array (
"{TITLE}" => "Page title example", 
"{NAV}" => buildNav(), 
"{CONTENT}" => buildContent()); 

str_replace(array_keys($data),array_values($data), $template); 
0

저는 개인적으로 후자의 버전이있는 CMS에서 작업하며, 매우 어려운 시간을 읽었습니다.

두 번째로보기의 모델/컨트롤러 코드는 훌륭한 이탈리아 요리입니다.

5

필자는 PHP를 프리젠 테이션 계층의 특정 HTML에서 제외하고 코딩합니다. 그렇지 않으면 일은 'Hello World'보다 더 큰 것 때문에 매우 불쾌 해집니다.

코드를 나중에 수정하려면 자신을 발로 쏘아 올리고 있어야합니다. 내가 시도하고 올바른 CMS/추상 프레 젠 테이션에 이식 하여이 문제를 죽일 것입니다.

어느 쪽이든 좋아 보이지 않습니다. 어느 쪽의 스타일에서도 코드를 유지하고 싶지는 않습니다. 나중에 시간을 절약하십시오. 제대로 청소하십시오.

HTML을 외부에서로드 된 형식 문자열로 옮기고 sprintf() 또는 유사 항목을 통해 실행하는 것조차 기본 사항은 현재 상황보다 낫습니다. 그리고 여러분은 이러한 코딩 스타일을 혼합했다고 말합니다!

행운을 빕니다!

두 스타일 모두 역동적 인 인터넷 성장 통의 무덤으로 강등되어야합니다. 오픈 소스 PHP 프로젝트를 들여다 보며, 유지 보수가 잘되는 코딩 스타일을 실제로 볼 수 있습니다.http://sourceforge.net/projects/wikipedia MediaWiki는 HTML-In-Source와 분리의 좋은 조합을 보여줍니다 (완벽한 IMHO는 아니지만).

+0

ofc 그 모든 것을 청소하는 것은 절대적인 고통이 될 것이며, 나이를 먹을 것입니다! 때로는 다음 재건 때까지 가지고있는 것과 함께 사는 것이 더 낫습니다. – sanbikinoraion

+1

어쨌든 처음부터 재구성하는 것이 더 좋을 수도 있습니다. 문제는 적절한 문서가 없다는 것을 코드의 상태에서 추정합니다! 따라서 재건축은 원래 코드를 살펴 보는 것을 수반 할 수 있습니다.이 코드는 누구에게나 두통과 두뇌를 일으킬 수 있습니다. –

+0

내 생각에 정확히 모든 것을 수정할 수는 없지만 기존 모듈에 새로운 기능을 추가해야합니다. – kal3v

2

나는 중간에 뭔가가있는 경향이있다. select <option>을 생성하기 위해 15 개의 다른 함수를 호출하는 경우, 모든 기능을 수행하고 완전한 마크 업을 생성하는 함수를 가지고 있지 않은 이유는 무엇입니까? (완전 예를 만든)이 같은

뭔가 :

<select> 
<?php 
    foreach (database_query() as $row) 
     echo gen_select($row) 
?> 
</select> 

다른 곳

function gen_select($row) { 
    // do something horrifically complicated with the data (creating some variables to make the output easier to follow 

    return "<option class=\"$class\">$text</option>"; 
} 
-1

내가 HTML을 생각하고 PHP는 최대한 구분해야합니다. 전체 코드를 읽기 쉽도록 만들고 명확한 구조를 만듭니다. 그것은 PHP가 HTML을 출력해서는 안되기 때문에 HTML을 사용하여 그 부분을 처리 할 수 ​​있다는 것을 의미합니다 ...

그래서 마지막 예제를 선호하지만 한 가지 차이점이 있습니다. HTML로 변환하면 코드를 읽는 것이 매우 어렵습니다. if...endif 스타일이 더 좋은 대안이라고 생각합니다. 또한 PHP로 HTML을 인쇄하는 것은 비논리적 인 것처럼 보입니다.

<td valign="top"><form name="form5" method="GET" action=""><select name="m" onchange="this.form.submit()">; 
<? if (empty($_GET['p'])): ?> 
    <option value=" ">All</option> 
<? else: ?> 
    <option value="<?=$_GET['m']?>"><?=$_GET['m']?</option> 
<? endif; ?> 
<? 
$query = "SELECT DISTINCT maoie FROM ".$BD."site"; 
$res = mysql_query($query); 
while ($row = mysql_fetch_assoc($res)): 
?> 
    <? if(!empty($row['maoie'])): ?> 
     <option value="<?=$row['maoie']?>"><?=$row['maoie']?></option> 
    <? endif; ?> 
<? endwhile; ?> 
</select></form></td> 
<? echo add_more_stuff(); ?> 

은 적어도이 좀 더 논리입니다 :

나는 이런 식으로 할 것. 그럼에도 불구하고 데이터베이스 상호 작용과 같은 사항은 웹 응용 프로그램의 다른 곳으로 제외되어야합니다. 데이터와 페이지 디자인을 분리하면 훨씬 더 명확 해집니다.

그럼에도 불구하고 템플릿 언어로 PHP를 사용하는 것은 대체 변수 및 간단한 if 문만 사용하는 한 완전히 입니다.

0

두 가지 모두 끔찍한데 (내 견해로는 PHP의 약점이지만) 적어도 처음에는 읽을 수 있습니다.
문제는 결국 한 번 발생합니다 (요청 POST는? 유효한 데이터입니까?)가 추가되며, 두 번째 종류의 코딩이 계속됩니다. 뷰와 로직의 분리를 시도하십시오. str_replacing은 gazillion 작은 조각을 연결하여 문자열을 만드는 것보다 낫습니다.

+1

첫 번째 문장 다음에 나는 '파이썬에서 다시 쓰기'게시물을 기대했다. :) –

+0

그건 상당히 trollish 일 텐데, 나는 그것을 말하기를 유혹했다는 것을 인정한다;) – Agos

+0

나는 방금 PHP에서 파이썬으로 나의 애플 리케이션을 무분별하게 포팅했다. 나는 파이썬 구문을 많이 좋아하지 않지만 일관성없는 라이브러리 함수와 '/'네임 스페이스보다 나은 점이있다 : S –

0

위법은 아니지만 두 스타일 모두 90 년대 후반의 것입니다.

리팩토링 시스템을 심각하게 고려해야하며 템플릿 엔진을 사용하여 적어도 PHP와 HTML 코드를 구분해야합니다. "비즈니스 로직"과 "디스플레이 로직"부분을 분리 할 수 ​​있다면 더욱 좋습니다.