开发者

Opinion needed from a PHP Technical Architect

开发者 https://www.devze.com 2023-01-26 13:40 出处:网络
Please look at the code below. require_once(\"initvars.inc.php\"); require_once(\"config.inc.php\"); ?>

Please look at the code below.

require_once("initvars.inc.php");
require_once("config.inc.php");

?>
<?php
if($latestads_count)
{
?>


<div class="latestposts">

<div class="head"><?php echo $lang['LATEST_ADS']; ?></div>


<table border="0" cellspacing="0" cellpadding="0"  class="postlisting" width="100%">


<?php
$sql = "SELECT a.*, ct.cityname, UNIX_TIMESTAMP(a.createdon) AS timestamp, feat.adid      AS isfeat,
            COUNT(*) AS piccount, p.picfile AS picfile, scat.subcatname, scat.catid, cat.catname
        FROM $t_ads a
            INNER JOIN $t_cities ct ON a.cityid = ct.cityid
            INNER JOIN $t_subcats scat ON a.subcatid = scat.subcatid
            INNER JOIN $t_cats cat ON scat.catid = cat.catid
            LEFT OUTER JOIN $t_featured feat ON a.adid = feat.adid AND feat.adtype = 'A' AND feat.featuredtill >= NOW()
            LEFT OUTER JOIN $t_adpics p ON a.adid = p.adid AND p.isevent = '0'
        WHERE $visibility_condn
            $loc_condn
        GROUP BY a.adid
        ORDER BY a.createdon DESC
        LIMIT $latestads_count";
$res_latest = mysql_query($sql) or die($sql.mysql_error());

$css_first = "_first";
while($row = mysql_fetch_array($res_latest))
{

    $url = buildURL("showad", array($xcityid, $row['catid'], $row['catname'], 
        $row['subcatid'], $row['subcatname'], $row['adid'], $row['adtitle']));


?>

    <?php 
    if($row['isfeat'])
    {
        //$feat_class = "class=\"featured\"";
        $feat_img = "<img src=\"images/featured.gif\" align=\"absmiddle\">";
    } 
    else 
    { 
        //$feat_class = "";
        $feat_img = "";
    }

    if($row['picfile']) 
    {
        $picfile = $row['picfile'];
        $imgsize = GetThumbnailSize("{$datadir[adpics]}/{$picfile}", $tinythumb_max_width, $tinythumb_max_height);
    }
    else 
   开发者_如何学JAVA {
        $picfile = "";
    }
    ?>

    <tr>
        <td width="15">
        <img src="images/bullet.gif" align="absmiddle">
        </td>

        <td>
        <b><a href="<?php echo $url; ?>" <?php echo $feat_class; ?>><?php echo $row['adtitle']; ?></a></b> 
        <?php if(0&&$row['picfile']) { ?><img src="images/adwithpic.gif" align="absmiddle"><?php } ?>
        <?php echo $feat_img; ?><br>


        <span class="adcat">



        <?php echo "$row[catname] $path_sep $row[subcatname]"; ?>



        <?php 
        $loc = "";
        if($row['area']) $loc = $row['area'];
        if($xcityid < 0) $loc .= ($loc ? ", " : "") . $row['cityname'];
        if($loc) echo "<br>$loc";
        ?>             

        </span>



        </td>

        <td  align="right" width="<?php echo $tinythumb_max_width; ?>">
        <?php if($picfile) { ?>
        <a href="<?php echo $url; ?>"><img src="<?php echo "{$datadir[adpics]}/{$picfile}"; ?>" border="0" width="<?php echo $imgsize[0]; ?>" height="<?php echo $imgsize[1]; ?>" style="border:1px solid black"></a>
        <?php } ?>
        </td>

    </tr>

This is one of the code files from an existing project. As you can see, it has html, sql, php all intermixed together... and obviously difficult to maintain.

There are around 55 files of similar size and type in this application.

I want to refactor this code,and below are my objectives for doing so:

1)Easy to maintain.

2)Be able to extend easily by adding additional features.

3)Be able to reuse this code for different but somewhat similar applications.

I have a number of question based on the above facts:

1) Do you think we can refactor this code into an mvc application?

2)If we can. how much time should it take to refactor the whole project(55 files) say, for an expert programmer?

3)Should i reuse the above code, or should i start from scratch with a existing mvc framework?

4)How much time do we need to complete the whole project, in case we go for an existing mvc framework say symfony, zend etc.?

5)This site as per my knowledge until now would run Mysql only(as the current db is done in mysql). Should we allow for data abstraction/data acces layers in the model(supposing there is something that performs better than Mysql, I'm not sure about this)

7)Can we easily refactor the code to include sub-layers for model(data abstraction/access), view(further templates, view logic etc.), controller etc. in case we want to do that in future or would we need to start from scratch?

8)Is mvc the way to go , or is there a better pattern/way than it(supposing the site is intended for hundred thousands of users)?


  1. Yes.
  2. I would say about an hour per file of that size to make sure everything goes smoothly. So 1-2 weeks of solid work.
  3. If this works well, just re-factor. If you really want something new, grab a framework.
  4. An existing framework will probably take longer to duplicate existing functionality (maybe a month). However, you will have a more stable application in the long run (most likely).
  5. There is nothing wrong with MySQL. Use a data abstraction layer if you feel like you will want to switch in the future for some other reason.
  6. There is no reason why you wouldn't be able to re-factor. I have done this recently and it is not all that difficult.
  7. MVC is pretty much ideal. That said, there are many different ways to do MVC. Some good, some better, some terrible.


I think there is no thing like an "mvc application", but the mvc pattern can certainly be used in this application. You could build some data classes that encapsule the various queries and translate the result to an object or arrays of objects. A controller class can grab those results and process them, then feed the processed data to a specific template. That is an mvc like construct that is quite easy to maintain. I'd build some helper classes as well. You don't want to call mysql_query everywhere, because maybe you'll need to use mysqli next year, or maybe even a completely different database.

So, yes, use the mvc pattern, but not only that. Refactor the entire code. Use ready to use libraries where you can (for instance for database abstraction), and spent a great deal thinking about the right way to go before you start building.

0

精彩评论

暂无评论...
验证码 换一张
取 消