PHP学习(6)——代码重用与函数编写的一些注意事项
一个新的项目是这样创建的:它将已有的可重新利用的组件进行组合,并将新的开发难度降低到最小。
代码重用的好处:降低成本、提升可靠性和一致性。
1.使用require()和include()函数
使用一条require()或include()语句,可以将一个文件载入到PHP脚本中。
require()和include()几乎相同。区别是函数失败后,require()函数将给出一个报错。Include()给的则是警告。
变体函数分别是require_once()和include_once()。作用是确保一个包含(inlcuded)的文件只能被引入一次。当使用require()和include()来引入函数库时,使用这两个函数可以防止错误的引入同样的函数库两次。
1.1 文件扩展名和require()函数
当使用require()语句时,必须注意处理文件扩展名和PHP标记的不同方式。将被包含文件保存在文档树之外,或使用标准的文件扩展名是非常重要的。
将文件中的PHP代码放到PHP标记之间,能够被当成PHP代码进行处理。如果不使用PHP标记,将会被视为文本或者HTML脚本,因此也就不会被执行。
1.2 使用require()制作Web站点的模板
一个虚构的TLA咨询公司:
原脚本home.html:
<html>
<head>
<title>TLA Consulting Pty Ltd</title>
<style type="text/css">
h1 {color:white; font-size:24pt; text-align:center;
font-family:arial,sans-serif}
.menu {color:white; font-size:12pt; text-align:center;
font-family:arial,sans-serif; font-weight:bold}
td {background:black}
p {color:black; font-size:12pt; text-align:justify;
font-family:arial,sans-serif}
p.foot {color:white; font-size:9pt; text-align:center;
font-family:arial,sans-serif; font-weight:bold}
a:link,a:visited,a:active {color:white}
</style>
</head>
<body> <!-- page header -->
<table width="100%" cellpadding="12" cellspacing="0" border="0">
<tr bgcolor="black">
<td align="left"><img src="logo.gif" alt="TLA logo" height="70" width="70" /></td>
<td>
<h1>TLA Consulting</h1>
</td>
<td align="right"><img src="logo.gif" alt="TLA logo" height="70" width="70" /></td>
</tr>
</table> <!-- menu -->
<table width="100%" bgcolor="white" cellpadding="4" cellspacing="4">
<tr >
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Home</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Contact</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Services</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Site Map</span></td>
</tr>
</table> <!-- page content -->
<p>Welcome to the home of TLA Consulting.
Please take some time to get to know us.</p>
<p>We specialize in serving your business needs
and hope to hear from you soon.</p> <!-- page footer -->
<table width="100%" bgcolor="black" cellpadding="12" border="0">
<tr>
<td>
<p class="foot">© TLA Consulting Pty Ltd.</p>
<p class="foot">Please see our
<a href="legal.php">legal information page</a></p>
</td>
</tr>
</table>
</body>
</html>
可以将这个文件分割,然后给这些部分分别命名为header.php、home.php和footer.php。文件header.php和footer.php都包含有在其他页面中可以重用的代码。
文件home.php代替home.html,它包含页面内容和两个require()语句:
<?php
require('header.php');
?>
<!-- page content -->
<p>Welcome to the home of TLA Consulting.
Please take some time to get to know us.</p>
<p>We specialize in serving your business needs
and hope to hear from you soon.</p>
<?php
require('footer.php');
?>
可以将.inc(此处inc代表include)文件保存在一个目录中,而这个目录可以被脚本访问,但是被引入的文件不会被Web服务器载入。这种设置可以防止下面两种情况发生:a)如果文件扩展名是.php,但只包含部分页面或脚本,此时可能会引起错误。b)如果已经使用了其他扩展名,别人就可以读取源码。
所有TLA网站页面可重复使用的页眉header.php:
<html>
<head>
<title>TLA Consulting Pty Ltd</title>
<style type="text/css">
h1 {color:white; font-size:24pt; text-align:center;
font-family:arial,sans-serif}
.menu {color:white; font-size:12pt; text-align:center;
font-family:arial,sans-serif; font-weight:bold}
td {background:black}
p {color:black; font-size:12pt; text-align:justify;
font-family:arial,sans-serif}
p.foot {color:white; font-size:9pt; text-align:center;
font-family:arial,sans-serif; font-weight:bold}
a:link,a:visited,a:active {color:white}
</style>
</head>
<body> <!-- page header -->
<table width="100%" cellpadding="12" cellspacing="0" border="0">
<tr bgcolor="black">
<td align="left"><img src="logo.gif" alt="TLA logo" height="70" width="70"></td>
<td>
<h1>TLA Consulting</h1>
</td>
<td align="right"><img src="logo.gif" alt="TLA logo" height="70" width="70" /></td>
</tr>
</table> <!-- menu -->
<table width="100%" bgcolor="white" cellpadding="4" cellspacing="4">
<tr >
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Home</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Contact</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Services</span></td>
<td width="25%">
<img src="s-logo.gif" alt="" height="20" width="20" />
<span class="menu">Site Map</span></td>
</tr>
</table>
文件footer.inc包含了在每个页面底部脚注处显示的表格:
<!-- page footer -->
<table width="100%" bgcolor="black" cellpadding="12" border="0">
<tr>
<td>
<p class="foot">© TLA Consulting Pty Ltd.</p>
<p class="foot">Please see our <a href="legal.php">
legal information page</a></p>
</td>
</tr>
</table>
</body>
</html>
如果希望保证一个文件将被当作纯文本或HTML,并且不会执行任何PHP,可以使用readfile()作为替代方法。这个函数将回显文件内容,不会对其进行解析。如果使用的是用户提供的文本,这可能就是一个重要的安全问题。
1.3 使用auto_prepend_file和auto_append_file
如果希望使用require()将页眉和脚注加入到每个页面中,还可以设置php.ini中的auto_prepend_file和auto_append_file。使用这些指令包含的文件可以像使用include()语句包含的文件一样;如果文件不存在,将产生一个警告。
Windows的设置如下:
auto_prepend_file = “c:/Program Files/Apache Software/Froundation/Apache2.2//include/header.php” auto_append_file = “c:/Program Files/Apache Group/Apache2/Include/footer.php”
使用了这些指令,就不需要再输入include()语句,但页眉和脚注在页面中不再是页面的可选内容。
如果使用的是Apache Web服务器,可以对单个目录进行不同配置选项的修改。这样做的前提是服务器允许重设其主配置文件。要给目录设定自动前加入和自动追加,需要在该目录中创建一个名为.htaccess的文件。这个文件需要包含如下代码:
php_value auto_prepend_file “/home/username/include/header.php” php_value auto_append_file “/home/username/include/footer.php”
注意,其语法与配置文件php.ini中的相应选项有所不同,和行开始处的php_value一样:没有等号。许多php.ini中的配置设定也可以按这种方法进行修改。
在.htaccess中设置选项,而不是php.ini中或是在Web服务器的配置文件中进行配置,将带来极大的灵活性。可以在一台只影响你的目录的共享机器上进行。不需要重新启动服务器而且不需要管理员权限。使用.htaccess方法的一个缺点就是目录中每个被读取和被解析的文件每次都要进行处理,而不是只在启动时处理一次,所以性能会有所降低。
2.函数编写的一些注意事项
· 函数调用将不区分大小写,变量名是区分大小写的,所以$Name和$name是两个不同的变量,但Name()和name()则是同一个函数。
· 如果希望在一个函数中退出PHP并输入HTML脚本,可以像在脚本其他地方做的那样——使用一个封闭的PHP标记,然后再编写HTML。
· 许多语言允许重复使用函数名称。这个特性叫做函数的重载。但是PHP不支持函数重载,所以自定义函数不能和内置函数或是用户已定义的函数重名。请注意,虽然每个PHP脚本知道所有内置函数,但对于用户定义的函数,PHP只能识别哪些存在于脚本之中的。这就意味着,虽然可以在不同的文件中重复使用一个函数名,但这会引起混乱,所以应该避免。
· 通过3个帮助器函数:func_num_args()、func_get_arg()和func_get_args(),可以确定已经传递了多少个参数以及这些参数的值:
function var_args(){ echo "Number of parameters:"; echo func_num_args(); echo "<br />"; $args = func_get_args(); foreach($args as $arg){ echo $arg."<br />"; } } var_args(2,123,234,122,7);
其中func_num_args()函数将返回传入的参数个数。而func_get_args()函数将返回参数的数组。或者可以使用func_get_arg()函数一次获得一个参数,该函数需要以希望访问的参数个数作为参数(参数从0开始)。
3.关于作用域
PHP变量的作用域具有相当简单的规则:
· 在函数内部生命的变量作用域是从声明它们的那条语句开始到函数末尾。这些变量称为局部变量。
· 在函数外部声明的变量作用域是从声明它们的那条语句开始到文件末尾。这叫做全局作用域。这些变量称为全局变量。
· 特殊的超级全局变量在函数内部和外部都是可见的。
· 使用require()和include()并不影响作用域。如果这两个语句用于函数内部,函数作用域适用。如果它不在函数内部,全局作用域适用。
· 关键字“global”可以用来手动指定一个在函数中定义或使用的变量具有全局作用域。
· 通过调用unset($variable_name)可以手动删除变量。如果变量被删除,它就不在参数所指定的作用域中了。
4.参数的引用传递和值传递
通常,函数获取参数的方式是值传递。更好的办法是使用引用传递。这里,在参数被传递给函数的时候,函数不会再创建一个新的变量,而是函数获得一个原来变量的引用。这个引用有一个变量名称,它以美元符号开始,可以像另一个变量那样使用它。其区别在于它不是获得变量本身的值,而是指向原来的值。任何对该引用的修改都会影响到原始变量值。
可以通过在函数定义的参数名前加一个地址符(&)来指定参数的引用传递。在函数调用处不用修改。
function increment(&$value, $amount = 1){ $value = $value + $amount; } $a = 10; echo $a.'<br />'; increment ($a); echo $a.'<br />';
5.使用Return关键字
关键字“return”将终止函数的执行。
一个错误条件是在程序执行到函数末尾之前使用“return”语句中断函数执行的最常见原因。
另一个重要作用是从函数返回一个值。
如果不符合判断条件,可以返回“false”。(使用这种方法唯一需要注意的是编程人员调用这个函数必须使用“===”测试返回类型,确保“false”不会与0混淆。前一篇中有判断代码。)
6.关于递归
PHP支持递归函数。递归函数就是函数调用自己本身。递归函数比循环慢而且要占用更多内存,所以应该尽可能多用些循环。
两种方式颠倒字符串:
<?php function reverse_r($str)
{
if (strlen($str)>0)
reverse_r(substr($str, 1));
echo substr($str, 0, 1);
return;
} function reverse_i($str)
{
for ($i=1; $i<=strlen($str); $i++)
{
echo substr($str, -$i, 1);
}
return;
} reverse_r('Hello');
echo '<br />';
reverse_i('Hello'); ?>
递归的缺陷:
递归函数将在内存中创建几个自身的副本,并且将产生多次函数调用的开销。
当递归方法的代码比循环方法的代码更简短、更美观的时候,我们可能会选择使用递归,但是在应用领域通常不会这样。
另外,虽然递归看上去更美观,但如果忘记给出递归的终止条件,这意味着函数会一直重复下去直到服务器内存耗尽,或者达到了最大调用次数。
7.名称空间
名称空间是一个抽象的容器,它可以包含一组标识符;在PHP中,名称空间可以包含你所定义的函数,常量以及类。优点如下:
· 一个名称空间中的所有函数、类和常量都将自动冠以名称空间前缀。
· 非全路径的类、函数和常量名称将在运行时解析,在查看全局空间之前,将首先查看名称空间。
整理自《PHP和MySQL Web开发》
PHP学习(6)——代码重用与函数编写的一些注意事项的更多相关文章
- 从零开始攻略PHP(6)——代码重用与函数编写的一些注意事项
一个新的项目是这样创建的:它将已有的可重新利用的组件进行组合,并将新的开发难度降低到最小. 代码重用的好处:降低成本.提升可靠性和一致性. 1.使用require()和include()函数 使用一条 ...
- PHP代码重用与函数编写
代码重用与函数编写 1.使用require()和include()函数 这两个函数的作用是将一个文件爱你载入到PHP脚本中,这样就可以直接调用这个文件中的方法.require()和include()几 ...
- Day4_代码重用与函数
知识点速记: 重用代码的方法:脚本包含require().include(); 全局配置文件php.ini(auto_prepend_file/auto_append_file); 目录配置文件.ht ...
- php学习----错误处理和代码重用
php错误处理 一.错误分类:1.语法错误 2.运行时错误 3.逻辑错误 错误代号(部分): 所有看到的错误代码在php中都被定义为系统常量(可以直接使用) 1)系统错误 E_PARSE:编译错误,代 ...
- Java学习---Java代码编写规范
编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规 ...
- Python学习【第九篇】函数
函数 函数是什么? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上而下实现功能,其往往用一段代码来实现指定功能,开发过 ...
- python学习-day14:集合,函数,格式化
一.集合 定义:由不同元素组成的集合.集合是一组无序排列的可hash值, 可以作为字典的key.元素必须是不可变类型:只能存放数字,字符串,字典 特性:集合的目的是将不同的值放在一起,不同的集合之间可 ...
- 学习 Linux,101: 自定义或编写简单脚本【转】
转自:http://www.ibm.com/developerworks/cn/linux/l-lpic1-105-2/index.html 学习如何使用标准的 shell 语法.循环和控制结构,以及 ...
- 《C++ Primer Plus》读书笔记之十二—C++中的代码重用
第14章 C++中的代码重用 1.C++代码重用方法:公有继承.使用本身是另一个类的对象的类成员(这种方法称为包含.组合或层次化).私有或保护继承.类模板等. 2.模板特性意味着声明对象时,必须指定具 ...
随机推荐
- vscode调整字体大小
在vscode中,通过setting>User>Text Editor>Font可以调整字体大小,但是这里只是调整右侧的代码编辑区域的字体,左侧的侧边栏确无法调整字体大小,找了很久都 ...
- @ComponentScan什么时候可以不加
SpringBoot在没配置@ComponentScan的情况下,默认只扫描和主类处于同包下的Class. 主类Application.java: import org.springframework ...
- springbooot+restful目录规则
dao是访问数据层,dto是数据传出层,po实体类
- Win7下使用Visual Studio为WinXP编译可执行文件
造冰箱的大熊猫@cnblogs 2019/8/5 2019/9/5补充:参见这里 1.问题 开发机是64位Win7,想开发能够运行在WinXP下的C程序,怎么办? 2.解决方法 一个简单粗暴的解决办法 ...
- [Luogu] 魔法树
https://www.luogu.org/problemnew/show/P3833 树链剖分 + 线段树 为啥会RE?? 不解 #include <iostream> #include ...
- 配置魔药(DP)
配置魔药 [问题描述] 在<Harry Potter and the Chamber of Secrets>中,Ron的魔杖因为坐他老爸的Flying Car撞到了打人柳,不幸被打断了,从 ...
- jquery.qrcode.js生成二维码(前端生成二维码)
官网地址:http://jeromeetienne.github.io/jquery-qrcode/ 第一步引入插件: <script type='text/javascript' src='h ...
- sudo 问题:sorry, you must have a tty to run sudo
写定时任务时候遇到 如下问题 To start backup... -- :: sudo: sorry, you must have a tty to run sudo The backup to c ...
- Mybatis源码学习之整体架构(一)
简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...
- Mybatis-Plus BaseMapper自动生成SQL及MapperProxy
目录 Spring+Mybatis + Mybatis-Plus 自定义无XML的sql生成及MapperProxy代理生成 问题产生背景 框架是如何使用 无Xml的SQL是如何生成生成及SQL长成什 ...