到目前为止,我的所有网站都是用非常线性的代码编写的(感谢QBASIC!),这经常让我对重复,杂乱和不可操作的代码感到悲伤。每个动态页面都有自己独立的.php文件,我从未使用过函数。
我现在正在使用OOP和Smarty作为模板引擎重写整个网站,并且可以真正使用一些指导。
这是我目前的流程:
1)访客点击index.php?/ view / fluffybunny。 index.php只是网站其余部分的处理程序:
// main config holds all database, sphinx and memcached settings
// and also connects to server
require_once '../config/site.cfg.php';
$urlPath = explode('/',$_GET['path']);
$page = new page($tpl,$db);
if (!empty($urlPath[1]))
{
switch ($urlPath[1])
{
case 'view': $page->view($urlPath); break;
case 'browse': $page->browse($urlPath); break;
case 'index': $page->index($urlPath); break;
default: $page->index($urlPath); break;
}
}
else
{
header('HTTP/1.0 404 Not Found'); // then 404 because we dont want seo issues
exit("File not found");
}
2)'new page()'然后触发自动加载器以包含page.class.php:
/* page Class
* Created by James Napier 16/05/2013
* Revision 0.1
*/
class page
{
private $tpl;
private $db;
public function __construct($tpl='',$db='') {
$this->tpl = $tpl;
$this->db = $db;
}
/*
* Displays index page
* Depending on URL it either displays a local index or countrywide index
*/
public function index($urlPath)
{
$locUrl = '';
if (!empty($urlPath[3])) //this is the location part
{
// init location class
$location = new location($this->db);
// check whether location exists
if($location->checkByUrl($urlPath[3]))
{
$locUrl = '/in/'.$urlPath[3]; // if it does add location suffix to urls
}
else
{
// if it doesnt, 404
header('HTTP/1.0 404 Not Found');
exit("File not found");
}
}
// assign location url to template
$this->tpl->assign('locUrl', $locUrl);
// homepage breadcrumbs
$this->tpl->assign('breadCrumbs',array(
array('title'=>'Site '.COUNTRY_CODE1, 'friendlyurl'=>'/'),
array('title'=>'Home', 'friendlyurl'=>'/')));
// Build the template and display it
$this->tpl->display('index.tpl');
}
/*
* Displays individual listing
* Uses the ID from the end of the URL to display the correct item
*/
public function view($urlPath)
{
$id = end($urlPath);
if (!empty($id))
{
// Retrieve the article from the database along with POINT values
$stmt = $this->db->prepare('SELECT *, X(locpoint) as x, Y(locpoint) as y FROM listing WHERE id = :id LIMIT 1');
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
if($listing = $stmt->fetch(PDO::FETCH_ASSOC))
{
// Deal with the article status
if ($listing['status'] == 'deleted')
{
$this->err404();
}
elseif ($listing['status'] == 'disabled')
{
$this->tpl->assign('bannerErr','THIS AD HAS EXPIRED AND IS PENDING DELETION');
}
elseif ($listing['status'] == 'pending')
{
$this->tpl->assign('bannerErr','THIS AD IS NOT YET ACTIVE AND IS BEING REVIEWED BY THE FLOGR TEAM');
}
// Start building the basic page vars from the results
$this->tpl->assign('itemID', $listing['id']);
$this->tpl->assign('itemTitle',$listing['title']);
$this->tpl->assign('itemDescription',$listing['description']);
$this->tpl->assign('itemShortDesc',$listing['shortdesc']);
// price
$this->tpl->assign('itemPrice', number_format($listing['price']));
$this->tpl->assign('itemPriceTag',$listing['pricetag']);
// location details
$this->tpl->assign('itemLatLng', $listing['x'].','.$listing['y']);
$this->tpl->assign('itemLocation', $listing['loctext']);
// contact details
$this->tpl->assign('itemContactName',$listing['name']);
$this->tpl->assign('itemContactNo', $listing['phone']);
$this->tpl->assign('itemContactType', $listing['type']);
// images
$this->tpl->assign('itemImages', json_decode($listing['images'], true));
// Retrieve the category info for breadcrumbs and titles
$getContent = new getContent();
// breadcrumbs
$this->tpl->assign('breadCrumbs',$getContent->breadCrumbs($listing['catid'],'/browse/', $this->db));
// Page and SEO titls
$this->tpl->assign('headTitle',$listing['title'].' located in '.$listing['loctext'].' | site.com');
$this->tpl->assign('headDesc', $listing['shortdesc']);
// Build the template and display it
$this->tpl->display('view_ad.tpl');
// Update hits and set viewed session var
$_SESSION['filter']['viewed'][] = $listing['id'];
$stmt = $this->db->query('UPDATE LOW_PRIORITY listing SET hits = hits+1 WHERE id = '.$listing['id']);
}
else
{
$this->err404();
}
}
else
{
$this->err404();
}
}
/*
* standard 404 error
*/
public function err404()
{
header('HTTP/1.0 404 Not Found');
exit("File not found");
}
}
首先我的问题是,任何人都可以看到我作为OOP的新手犯下的任何明显错误吗?
其次,无论index.php处理程序是否调用$ page-> index(),$ page-&gt,我都需要在每个页面上运行一些大的代码块(用户身份验证..等等)。 ;图()...等。我如何将此代码集成到page.class.php?
答案 0 :(得分:0)
就你的代码而言,你在做OOP时做得很好但是从头开始编程框架你基本上是在重新发明轮子。我强烈建议使用像CakePHP,Zend Framework或Laravel这样的现有框架。在您使用框架一段时间之后,您开始掌握您喜欢的内容以及您不喜欢的内容。那时制作自己的框架是一个很好的练习。但即使在那一点,你应该意识到开源框架已经开发出使用100的,如果不是1000的人/小时,而每个框架可能会有你不喜欢的怪癖,处理那些怪癖是比从头构建框架容易得多。