PHP编程:用PHP5停止三层开辟
我的这套线路可能跟许多学习PHP的爱好者不谋而合,这也算是一个循序渐进的学习过程,不过新手不要看到上面的概括就以为学习蛮简单的,默默在此不得不对您稍微泼一下冷水,任何东西其实都不简单。php5 原文:http://www.onlamp.com/pub/a/php/2004/12/09/three_tier.htmlThree-Tier Development with PHP 5
by Luis Yordano Cruz
12/09/2004
此文演示了PHP三层开辟的壮大功效,PEAR::DB_DataObject用于营业逻辑,Smarty用于显示逻辑,这里假定你熟
悉了HTML,Smarty,PEAR::DB_DataObject,Mysql和PHP5.假如你需求增补常识,上面的文章注释了一些道理:
用PHP DataObject简化营业逻辑
Smarty简介:一个PHP模板引擎
PHP可伸缩性:Myth
你应当已装置和设置装备摆设好了Apache,MySQL,和PHP5(或IIS,MySQL5和PHP)
PEAR::DB_DataObject
PEAR::DB_DataObject 是一个用户数据库会见的笼统API.它是一个基于PEAR::DB的SQL构建器和数据建模层.它
把数据库表映照到PHP类而且供应像SELECT,INSERT,UPDATE,和DELETE如许的公共SQL函数.这使即便不了
解SQL的开辟者也能够写出好的数据库会见代码,而且勉励演示逻辑和营业逻辑有一个明晰的分别.
(DB_OO已挪动到的PEAR,如今是DB_DataObject,假如你有老的代码要更新,检查关于从老的db_oo代码更新到
DB_DataObjects的正文).
相干浏览
Upgrading to PHP 5
By Adam Trachtenberg
Table of Contents
Index
Sample Chapter
Read Online--Safari Search this book on Safari:
Only This Book All of Safari
Code Fragments only
DataObject performs two tasks. First, it builds SQL statements based on the object's variables and the builder
methods. Second, it acts as a datastore for a table row. There's a core class, which you extend for each of
your tables so that you put the data logic inside the data classes. There's also an included Generator to make
your configuration files and your base classes.
DataObject 履行两个义务.第一,它构建基于对象变量的SQL语句和构建器办法.第二,它作为数据库表的数据存
储.这里有个中心类,关于每一个表承继它,以使你把数据逻辑放入数据类中.这里还包含一个生成器,
DataObject 极大的简化了数据库会见代码,它使开辟大型的,数据驱动的站点加倍轻易.
At present, Alan Knowles, the lead developer of PEAR::DB_DataObject, is working on a new project called DBDO,
a C implementation of the PEAR package DB_DataObjects, based on libgda. His goal is to create the next
generation of PEAR::DB_DataObjects.
SMARTY
Smarty是一个从web页演示平分离内容的PHP模板引擎.它利用GPL允许.
Large projects commonly separate the role of the graphic designer from that of the programmer. However,
programming in PHP has the tendency to combine those two roles in a person and inside the code. This can bring
difficulties when it comes time to change some part of the page's design. If the page mixes content and
presentation, the developer has to crawl through the program to find the presentation. Smarty helps to solve
this problem.
Combining the Two
The first thing to do when starting this project is to create a workspace in which to store the project's code.
Then it's time to configure PEAR::DB_DataObject to connect to the MySQL database MySQL (name: example),
map the database tables to PHP classes, and then configure Smarty for the presentation tier for the user. Here
are those steps in more detail:
创立任务情况
创立一个叫做dataobjects的目次.
从号令行装置PEAR::DB_DataObject,键入:
>pear install Date
>pear install DB_DataObject
>pear list
INSTALLED PACKAGES:
===================
PACKAGE VERSION STATE
Archive_Tar 1.2 stable
Console_Getopt 1.2 stable
DB 1.6.5 stable
DB_DataObject 1.7.1 stable*(Goal)
Date 1.4.3 stable
Mail 1.1.3 stable
Net_SMTP 1.2.6 stable
Net_Socket 1.0.2 stable
PEAR 1.3.1 stable
PHPUnit 1.0.1 stable
XML_Parser 1.2.0 stable
XML_RPC 1.1.0 stable
装置和设置装备摆设Smarty
从下载入手下手,(我利用2.6.5版的Smarty)解压到你本人的目次.从它的libs目次中把Smarty.class.php,
Smarty_Compiler.class.php, Config_File.class.php, and debug.tpl文件复制到dataobjects目次中.
还要复制core和plugins目次和个中一切的内容.创立几个新的目次,定名为templates, templates_c, configs,
和cache.
最初dataobjects目次包括:
|---- cache
|---- configs
|---- core
|---- plugins
|---- templates
|---- templates_c
11/10/200411:17 a.m. <DIR> .
11/10/200411:17 a.m. <DIR> ..
11/10/200411:17 a.m. <DIR> cache
11/10/200411:17 a.m. <DIR> configs
11/10/200411:17 a.m. <DIR> core
11/10/200411:17 a.m. <DIR> plugins
11/10/200411:17 a.m. <DIR> templates
11/10/200411:17 a.m. <DIR> templates_c
07/09/200409:48 a.m.13,105 Config_File.class.php
16/04/200403:03 a.m.5,117 debug.tpl
10/09/200402:15 p.m.65,350 Smarty.class.php
10/09/200407:14 p.m.90,924 Smarty_Compiler.class.php
4 archivos 174,496 bytes
8 dirs 6,699,454,464 bytes libres
创立数据库
创立一个名为example的数据库,它包括一个名为User的表,不用忧虑形式,稍后咱们会创立.
设置装备摆设PEAR::DB_DataObject
要构建数据对象,创立上面的文件
configDB.php
<?php
require_once 'DB/DataObject.php';
$config = parse_ini_file('example.ini',TRUE);
foreach($config as $class=>$values) {
$options = &PEAR::getStaticProperty($class,'options');
$options = $values;
}
?>
此剧本基于example设置装备摆设文件中的值创立一个到数据库的毗连,显示以下.
example.ini
database = mysql://root:@localhost/example
schema_location= /dataobjects/schema/
class_location = /dataobjects/
require_prefix = /dataobjects/
class_prefix = DataObjects_
extends_location = DB/DataObject.php
extends = DB_DataObject
主动构建数据库形式
包括两个进程,构建数据库的对象-关系映照,和从example数据库user表中主动创立一个类.在表中的一切字段
名将成为类成员变量.
创立恰当的形式:
C:\PHP\PEAR\DB\DataObject>C:\PHP\php.exe createTables.php \
C:\dataobjects\example.ini
这将生成User.php文件:
<?php
/**
* Table Definition for user
* www.knowsky.com
*/
require_once 'DB/DataObject.php';
class DataObjects_User extends DB_DataObject
{
###START_AUTOCODE
/* the code below is auto generated do not remove the above tag */
var $__table = 'user'; // table name
var $user_Id; // int(11)not_null primary_key auto_increment
var $first_Name; // string(30)not_null
var $last_Name; // string(40)not_null
var $email; // string(100)not_null
/* Static get */
function staticGet($k,$v=NULL) {
return DB_DataObject::staticGet('DataObjects_User',$k,$v);
}
/* the code above is auto generated do not remove the tag below */
###END_AUTOCODE
}
?>
它还会为user表形式生成example.ini设置装备摆设文件:
user_Id = 129
first_Name = 130
last_Name= 130
email = 130
user_Id = N
Smarty files
It's time to create several files for Smarty:
Smarty文件
如今是创立几个Smarty文件的时分了:
include.php
1 <?
2 require('Smarty.class.php');
3 $smarty = new Smarty;
4 $smarty->template_dir = 'templates/';
5 $smarty->compile_dir= 'templates_c/';
6 $smarty->config_dir = 'configs/';
7 $smarty->cache_dir ='cache/';
?>
此剧本实例化了一个新Smarty对象.设置Smarty属性.
index.php
1 <?
2require("include.php");
3$smarty->assign('TITLE','ACCESS MySQL DATABASE IN THREE TIERS WITH PHP');
4$smarty->assign('HEADER','WHAT WISH DO ?');
5$smarty->display('index.tpl');
?>
给Smarty模板分派变量.
insert.php
1<?
2require("include.php");
3$smarty->assign('TITLE','INSERT DATA');
4$smarty->assign('HEADER','Insert Data');
5$smarty->assign('data1','First Name');
6$smarty->assign('data2','Last Name');
7$smarty->assign('data3','email');
8$smarty->display('insert.tpl');
?>
添加将在insert.tpl 利用的变量.挪用模板insert.tpl .
save.php
1 <?
2 require_once('DB/DataObject.php');
3 require('configDB.php');
4 $user = DB_DataObject::factory('user');
5 $user->first_Name = $x;
6 $user->last_Name= $y;
7 $user->email = $z;
8 $user_Id = $user->insert();
9 $user->update();
10echo "<script>location.href='index.php'</script>";
11 ?>
This script saves data by using a PEAR::DataObject for the user table. Line 2 loads the class DataObject, and
line 3 calls configdb.php to connect to the database. Line 4 creates an instance of a user object (see User.php).
Lines 5 through 7 pass the variables collected from the form in insert.tpl ($x, $y, and $z) in order to save the
data in the database. The primary key of the table is an autoincrement column, so it doesn't need a value there.
Line 8 inserts the object, and line 9 carries out an update.
view.php
1<?
2 require_once('DB/DataObject.php');
3 require('configDB.php');
4 require("include.php");
5 $user = DB_DataObject::factory('user');
6 $user->find();
7 while ($user->fetch()) {
8 $smarty->append('users', array(
'ID' => $user->user_Id,
'FIRSTNAME' => $user->first_Name,
'LASTNAME'=> $user->last_Name,
'EMAIL' => $user->email,
));
}
9 $smarty->assign('TITLE','List Users');
10$smarty->assign('HEADER','List User');
11$smarty->assign('data0','User_Id');
12$smarty->assign('data1','First Name');
13$smarty->assign('data2','Last Name');
14$smarty->assign('data3','email');
15$smarty->display('view.tpl');
16?>
此剧本显示一切存储在user表中的数据.它加载PEAR::DataObject 和include.php文件(给smarty模板分派变量).
第5行创立一个user对象的工场.第6行履行find()办法.SELECT * FROM user从数据库中检索出了数据,通
过fetch()办法为模板保留数据,一次前往一笔记录.
9 到14行是分派其他的变量给Smarty.
这些文件都应该放在dataobjects目次中.
关于模板,这里有index.tpl,list.tpl,和save.tpl.这里是他们的代码:
index.tpl
1<html>
2 <head>
3 <title>{$TITLE}</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5 </head>
6 <table align="center">
7 <tr>
8 <td>
9 <b>{$HEADER}</b>
10 </td>
11 </tr>
12</table>
13<table width="250" border="1" align="center" >
14 <tr>
16 <td align="center">
17 <input type="button" name="insert" value="Insert"
>
18 </td>
19 </tr>
20 <tr>
21 <td align="center">
22 <input type="button" name="view" value="View"
>
23 </td>
24 </tr>
25</table>
26</body>
27 </html>
站点主页,它在的3行和第9行分离显示$TITLE 和$HEADER,这些变量值是从index.php传递过去的.
这个剧本在web阅读器上生成两个按钮,Insert和View,他们有响应的行动.假如用户点击Insert,体系将调
用Insert.php.假如用户点击View,那末view.php将被挪用
insert.tpl
1 <html>
2<head>
3 <title>{$TITLE}</title>
4 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5</head>
6<body>
7 <form name="form1" action="save.php" method="post">
8 <table width="300" border="1" align="center" >
9 <tr>
10 <td align="center">
11 <b>{$HEADER}</b>
12 </td>
13 </tr>
14 <tr>
15 <td>
16 {$data1}
17 <input type="text" name="x">
18 </td>
19 </tr>
20 <tr>
21 <td>
22 {$data2}
23 <input type="text" name="y">
24 </td>
25 </tr>
26 <tr>
27 <td>
28 {$data3}
29 <input type="text" name="z">
30 </td>
31 </tr>
32 <tr>
33 <td align="center">
34 <input type="submit" name="Submit" value="Add">
35 <input type="button" name="Reset" value="Return/Cancel"
>
36 </td>
37 </tr>
38 </table>
39 </form>
40</body>
41 </html>
这个模板有一个表单和两个按钮,Add 和Return/Cancel.
用户输出数据,first name,last name 和电子邮件字段.insert.php希冀在名为x,y,z的变量中吸收这些信息,用户点
击Add按钮将运转save.php.假如用户点击Return/Cancel,将会履行index.php.
view.tpl
1 <html>
2<head>
3 <title>{$TITLE}</title>
4</head>
5<body>
6 <table align="center">
7 <tr>
8 <td align="center">
9 <b>{$HEADER}</b>
10 </td>
11 </tr>
12 </table>
13 <table width="500" border="1" align="center">
14 <tr>
16 <td align="center">
17 <b>{$data0}</b>
18 </td>
19 <td align="center">
20 <b>{$data1}</b>
21 </td>
22 <td align="center">
23 <b>{$data2}</b>
24 </td>
25 <td align="center">
26 <b>{$data3}</b>
27 </td>
28 </tr>
29{section name=display loop=$users}
30 <tr>
31 <td>
32 {$users.ID}
33 </td>
34 <td>
35 {$users.FIRSTNAME}
36 </td>
37 <td>
38 {$users.LASTNAME}
39 </td>
40 <td>
41 {$users.EMAIL}
42 </td>
43 </tr>
44 {/section}
45 <br>
46 </table>
47 <br>
48 <table align="center">
49 <tr>
50 <td align="center">
51 <input name="vol" type="button" value="Return"
>
52 </td>
53 </tr>
54 </table>
55</body>
56 </html>
这个模板显示一切存储在example数据库中的一切数据.
最初,Return按钮把用户带回到主页.
一切的这些(*.tpl)文件必需放在templates目次下.
不懂的问题有很多高手帮你解决。但不要认为你是新手,就不能帮助别人,比如今天你学会了怎样安装PHP,明天还可能有朋友会问这个问题,你就可以给他解答,不要认为这是浪费时间,忙别人其实就是帮助自己。 没接触过框架的人,也不用害怕,其实框架就是一种命名规范及插件,学会一个框架其余的框架都很好上手的。 真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎, 我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能: 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。 基础有没有对学习php没有太大区别,关键是兴趣。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。 刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。 如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了, 遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。 爱上php,他也会爱上你。 本人接触php时间不长,算是phper中的小菜鸟一只吧。由于刚开始学的时候没有名师指,碰过不少疙瘩,呗很多小问题卡过很久,白白浪费不少宝贵的时间,在次分享一些子的学习的心得。 说php的话,首先得提一下数组,开始的时候我是最烦数组的,总是被弄的晕头转向,不过后来呢,我觉得数组里php里最强大的存储方法,所以建议新手们要学好数组。 真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎, 至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。 Ps:以上纯属原创,如有雷同,纯属巧合 开发工具也会慢慢的更专业,每个公司的可能不一样,但是zend studio是个大伙都会用的。 我还是推荐用firefox ,配上firebug 插件调试js能省下不受时间。谷歌的浏览器最好也不少用,因为谷歌的大侠们实在是太天才啦,把一些原来的js代码加了一些特效。
页:
[1]