三、文件是我们的朋友 ~QVH<`sn
>R=|Wo`Ri
无论你在开发的网站规模的大小,都应该意识到代码重用的重要性,无论这些代码是HTML、还是PHP代码。例如,你必须至少每年改变一次包含版权信息的页脚,如果你的网站含有1000个页面,每年修改一次也是个很烦人的事儿。 FiU#T.`9'
3gf1ownC
在PHP中,至少有几个函数可以帮助你实现代码重用的目的,所使用的函数取决于你所重用的代码,主要的函数有: | f##5fB
?@8[e9lLD
* include() and include_once() :v 4]D4\o
* require() and require_once() IRbfNq^:
include()函数包含并对给定的文件进行计算,例如: WF"k[2
include('/home/me/myfile'); #LCb
?X;RLpEc|A
在include文件中的任何代码都在include()出现的代码范围内执行,你可以通过联合使用include()和fopen()在自己的服务器上包含静态文件,在另一台服务器上包含目标文件。 [00m/fT6
;wD)hNLAvR
include_once()的功能与include()相同,二者之间的区别在于它会检查一个文件中的代码是否已经包含在现有的脚本中,如果代码已经存在,则不会再次包含它。 %XTI-B/K
2T`!v
require()函数用给定文件的内容取代它本身,这一代替过程发生在PHP引擎编译代码期间,而不是在执行期间进行,它不象include()那样会首先进行计算。require()函数更多地用在静态元素中,而include()更多地用于动态元素中。与include_once()类似的是,require_once()将首先检查是否已经插入给定的代码,如果代码已经存在,就不再插入了。 =R\]=cRbg
rM"l@3hP
为也了解其内容,在版权信息、静态文字和其他不包含变量的元素或者依赖其他正在执行的脚本的元素中我更趋向于使用require函数。例如: c[e}w+uB
1:wQ.T
tnIX:6
D`AsRd
|cY`x(?yP
[a lot of content] H)&R=s
// insert copyright 2"~8Z(0
require('/home/me/mycopyright'); :Qq#Z
?> mA} "a<0
F1hHe<)
A)~6Im
mVmGg,
另一方面,我经常在文件的开始使用include()来控制许多的函数: jFb?b6b
mBC+6(5V
//得到函数库 YbLW/E\T
include('/home/me/myfunctions'); |nF 8gh~}
// do PHP things with my functions ?> L=h'Qgk%
.sA.C]f
<\FH fE
hzC>~Ub5
[a lot of content] r_.S>]
{: W$LWET
Vz[C=_m
-.3w^D"l
下一个问题就该是“include和require文件在哪里?”,对这个问题简单的回答是,“系统中的任意地方。”如果你的代码中包含有带有用户名和口令的数据库连接,你肯定不会将它们都放在文档根目录中向所有的人都开放。 @|)Z"m7
L8n|m!MOD
included或required文件可以在系统上的任何地方,只要PHP运行的系统上的用户可以访问这些文件即可,你可以使这些文件具有任何后缀,或者不使用后缀。 y_9Ds>p!T
6zn5UW#q
使用include()和require()对在网站中的元素进行具体化是一种普遍的现象,并在需要对网站升级时,给你带来很大的方便。 D#z:()VT(
ze;KhUPRm
四、PHP和文件系统的维护 FgI3
l+0P
PHP中有许多与文件系统有关的函数,这些函数不仅可以打开文件,还可以显示目录中的内容、移动文件和其他一些功能,许多人甚至用PHP开发基于互联网的文件资源管理器。 ?hM64jI|
(I}v[W
关于文件路径的解释:在Windows中,可以在路径中使用/和符号,而在其他的操作系统中只能使用/符号。出于一致性的缘故,我们统一使用/符号。 j~QwV='S
Qei"'~1a
下面的脚本样例可以显示一个目录清单,注释已经包含在代码中: \di=
XZwK6F)L
$dir_name = "/home/me/"; c"xK`%e
/* 创建一个句柄,其值是打开一个给定目录的结果*/ \C1nZk?3
$dir = opendir($dir_name); ,=N.FS
/* 建立一个文字块,用以放置列表元素(文件名字)*/ $7uA%|\
$file_list = " HorDNRyu
"; p<;0g9,1
/* 使用一个while语句,读取已经打开的目录中的所有元素,如果文件的名字不是“.”或“..”,则显示列表中的名字*/ ,Lt[\_
while ($file_name = readdir($dir)) { iyog`s c
if (($file_name != ".") && ($file_name != "..")) { Xry47a
)
$file_list .= " -{+}@?
$file_name"; l@:0e]8|o
} wdZ/Xp9]
} #89!'W
$file_list .= " =rK+eG#,
"; >OK^D+v"j
/*关闭打开的目录,结束PHP模块*/ 8.~kK<)!
closedir($dir); E~:x(5'%d
?> jA/w|\d!
D,ln)["xm
C8 \^#5
TOAAQ
6`-jPR
,?XCyHSgWW
[fIg{Q
c0fo7|
3[f):
u3"
Files in: <^uBoKB/f
3D(0=$W
<Ok3FE.K
o8vug$=Z
nNU2([
4H<lm*!^
gzg_>2Sj
dq[xwRU1
好了,我们已经得到了一个目录清单。需要注意的是,要读取一个文件(稍后我们将进行讲解)或目录的内容,PHP运行的系统上的用户必须至少有读取文件的权限。 a@*\o+Su
下面是一个如何拷贝文件的例子: DFTyMB1H
\^%}M!tan
$original = "/home/me/mydatabasedump"; <