Стиль логического кодирования PHP - PullRequest
2 голосов
/ 18 мая 2009

Мне нужно изменить некоторые части большого PHP-приложения. Разные части были написаны, конечно, разными людьми (в основном, стажерами). Посмотрев код, я обнаружил, что другие разработчики использовали 2 стиля кодирования:

  • Стиль PHP - это клей для Интернета, в котором сочетаются html и php, напр .::1004*

[надрез]

<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>

[snip] или

<td <? if((isset($_GET['t1']))&&($_GET['t2']!='ALL')) { ?>bgcolor="#0099FF"<? } ?>></td>
<td <? if((isset($_GET['t3']))&&($_GET['t4']!='ALL')) { ?>bgcolor="#0099FF"<? } ?>></td>
<td <? if((isset($_GET['t5']))&&($_GET['t6']!='ALL')) { ?>bgcolor="#0099FF"<? } ?>></td>

[отрывок] или даже

<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;

Теперь я не совсем уверен, что это более процедурный способ делать вещи, но, по крайней мере, он отличается от предыдущего. Как вы думаете, какой из них обычно лучше?

Лично мне не нравится стиль «клей Интернета».

Ответы [ 7 ]

5 голосов
/ 18 мая 2009

Я бы отбросил и то и другое и зашифровал бы PHP от любого конкретного HTML уровня представления. В противном случае все становится очень неприятным, очень быстро для чего-то большего, чем «Hello World»:)

Вы стреляете себе в ногу, если хотите изменить код позже. Я попытался бы убить эту проблему, портируя на правильную презентацию CMS / Abstract.

Ни один из них не выглядит хорошо. Я не хотел бы поддерживать код в любом стиле. сэкономьте время, потратив время сейчас правильно его очистив.

Даже такая базовая вещь, как перемещение HTML-кода во внешне загруженные строки формата и запуск их через sprintf () или аналогичный, может быть лучше, чем текущая ситуация. И вы говорите, что у вас есть смесь этих стилей кодирования!?!

удачи вам, сэр!

Оба стиля должны быть отнесены к могиле динамичных интернет-болей. Взгляните на некоторые проекты PHP с открытым исходным кодом, чтобы увидеть хороший, поддерживаемый стиль кодирования в действии. Такие вещи, как http://sourceforge.net/projects/wikipedia MediaWiki демонстрирует хорошее сочетание HTML-In-Source и разделения (хотя это не идеально ИМХО)

3 голосов
/ 18 мая 2009

Есть третий вариант: шаблоны. Шаблоны более читабельны, чем клей или случайный выброс ascii vomit. Я просто использую строки 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);
2 голосов
/ 18 мая 2009

Я склоняюсь к чему-то посередине. Если я вызываю пятнадцать различных функций для генерации выбора <option>, почему бы просто не иметь одну функцию, которая делает все и создает полную разметку?

Примерно так (полностью выдуманный пример):

<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>";
}
0 голосов
/ 18 мая 2009

Без обид, но оба стиля относятся к концу 90-х.

Вы должны серьезно подумать о рефакторинге системы и использовать шаблонизатор, чтобы разделить хотя бы PHP и HTML-код. Еще лучше, если вы можете разделить «бизнес-логику» и «логику отображения».

0 голосов
/ 18 мая 2009

Оба ужасны (на мой взгляд, это реальная слабость PHP), но, по крайней мере, первое выглядит читабельно.
Проблемы в конечном итоге возникнут после того, как будут добавлены условия (запрос POST? Данные действительны?), И это неизбежно приведет к ужасному второму типу кодирования. Попробуйте разделить представление и логику: str_replacing намного лучше, чем построение строки, объединяя один миллиард маленьких кусочков.

0 голосов
/ 18 мая 2009

Я думаю, что HTML и PHP должны быть максимально разделены. Это делает весь код легче для чтения и создает четкую структуру. Для меня это означает, что PHP не должен выводить HTML, так как вы можете использовать HTML для выполнения этой части ...

Так что я бы также предпочел последний пример, но с одним отличием: я думаю, что использование стиля скобок, смешанного с HTML, затрудняет чтение кода. Стиль if...endif - лучшая альтернатива, я думаю. Также печать HTML с PHP кажется нелогичной.

Я бы сделал это так:

 <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 голосов
/ 18 мая 2009

Я лично работаю над CMS с последней версией, и мне очень тяжело ее читать.

Во-вторых, код модели / контроллера в представлении - отличное итальянское блюдо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...