第五章 代码重用与函数编写
1.require()和include()函数
- 二者几乎是相同的,唯一区别在于函数失败后,require()函数会给出一个致命的错误;而include()只是给出一个警告。
- 通常来说,PHP语句放在HTML文件中时,它们是不会被处理的。
- 但是如果通过require()和include()来载入html文件时,文件内的任何PHP命令就都会被处理了。
- require_once()和include_once()函数:这两个函数是require()和include()函数的变体,是确保一个包含的文件只能被引入一次,使用这两个函数可以防止错误的引入同样的函数库两次。
- require()和 inlude()函数运行速度更快。
- 举例:可以将一个网页的首页简单分为头部,内容和底部来看,并分别编写它们的代码。
-
header.php代码如下
<html> <head> <title>磕基的公募基金课程</title> <style type="text/css"> h1 { color: rgb(153,0,0); font-size: 24pt; text-align: center; } .menu { color: rgb(153,0,0); font-size: 16pt; text-align: center; font-weight: bold; } td {background: #363636;} p { color: black; font-size: 12pt; text-align: justify; } p.foot{ color: white; font-size: 9pt; text-align: center; font-weight: bold; } a:link,a:visited,a:active {color:white;} </style> </head> <body> <!--页面头部--> <table width="100%" cellpadding="12" cellspacing="0" border="0"> <tr bgcolor="black"> <td align="left">![](../images/logo.PNG)</td> <td> <h1>磕基</h1> </td> <td align="right">![](../images/logo.PNG)</td> </tr> </table> <!--菜单--> <table width="100%" bgcolor="white" cellpadding="4" cellspacing="4"> <tr> <td width="25%"> ![](../images/logo.PNG) <span class="menu">主页</span> </td> <td width="25%"> ![](../images/logo.PNG) <span class="menu">课程</span> </td> <td width="25%"> ![](../images/logo.PNG) <span class="menu">在行</span> </td> <td width="25%"> ![](../images/logo.PNG) <span class="menu">公众号</span> </td> </tr> </table>
-
home.php主页内容部分代码如下
<?php require_once('header.php'); ?> <!--网页内容--> <p>欢迎来到磕基的页面,你可以画一些时间来了解我们</p> <p>我们提供最专业的公募基金理财课程</p> <?php require_once('footer.php'); ?>
-
footer.php网页底部代码如下
<!--页面底部--> <table width="100%" bgcolor="black" cellpadding="12" border="0"> <tr> <td> <p class="foot">© 北京二叁叁文化传播有限责任公司</p> <p class="foot">点击查看<a href="../feedback.html">更多内容</a></p> </td> </tr> </table>
-
最终效果如图
-
2.函数
- 调用未定义的函数
- 如果调用的函数出错,PHP会报出一个错误信息。
-
遇到该类信息,对几个事情进行检查。
- 函数名称的拼写是否正确;
- 该函数是否存在于所用的PHP版本中;
- 所调用的函数是PHP扩展的一部分,而该部分并没有被载入。
- 如果调用的函数出错,PHP会报出一个错误信息。
- 函数名称是不区分大小写的;因此,命名函数的规则就是都用小写字母。
- 变量名是区分大小写的,而函数名则不区分。
- 函数的命名
- 函数命名的限制
- 函数名称不能和已有的函数重名;
- 函数名称只能包含字母(a-zA-Z)、数字(0-9)和下划线(_);
- 函数名称不能以数字开始
- PHP不允许函数重载,所以用户自定义函数不能与PHP内置的函数或已定义的函数重名。
- 函数命名的限制
- 使用参数
- 参数允许将数据传给函数的。
- 参数分为形参和实参
- 所谓形参,全称为“形式参数”,其不是实际存在变量,所以也有的叫做虚拟参数;它主要是在定义函数名和函数体时所用到的参数,目的是用来接收调用该函数时传入的参数。
- 而实参的全称顾名思义,则是“实际参数”,其是在调用传递函数的参数;这个参数可以是变量、常量、表达式或函数等,但要注意的是无论何种类型,都必须有确定的值。
- 以下面代码为例:
echo "<table border="1">";
reset($data);
$value=current($data);
while($value){
echo"<tr><td>".$value."</td></tr>\n";
$value=next($data);
}
echo "</table>";
}
$myArray=array('Line one','Line two','Line three.');
create_table($myArray);- 这里面create_table(\$data)中的\$data就是形参,因为其并不是实际存在的变量。 - 而最下面的create_table(\$myArray)中的\$myArray则是实参,因为$myArray包含的是一个数组,其具有实际值array('Line one','Line two','Line three.')。
- 传参的时候如果有可选值,则不用全部给出,参数将会根据所给出的参数个数从左到右顺序进行赋值。
- 不能漏掉一个可选参数而直接给参数列表中的最后一个参数赋值。
3.作用域
- PHP作用域规则:
- 函数作用域:在函数内部声明的变量作用域是从声明它们的那条语句开始到函数末尾,其变量被称为局部变量;
- 全局作用域:在函数外部声明的变量作用域是从声明它们的那条语句开始直到文件末尾,其变量被称为全局变量;
- 某些特殊的超级全局变量在函数内部和外部都是可见的。(如:$GLOBALS、$_SERVER、$_REQUEST等)
- 使用require()和include()并不影响作用域。
- 这两个语句如果用于函数内部,则适用函数作用域;
- 如果用于函数外部,则适用全局作用域。
- 关键字“global”可以用来手动制定一个在函数中定义或使用的变量具有全局作用域;
- 删除某个变量可以使用unset($variable_name),该函数可以手动删除某个变量,删除之后,该变量就不在参数所指定的作用域中了。
- 函数作用域和全局作用域的区别以如下代码为例:
$i="lyangye";
function fn(){
echo '函数内部未声明全局变量的$i='.@$i."<br/>";
global $i;
echo '函数内部声明了全局变量的$i='.$i."<br/>";
$var="content";
echo '函数内部的局部变量$var='.$var."<br/>";
}
fn();
echo '函数外部的$i='.$i."<br />";
-- 如果想要从函数外部引入全局变量,需要使用global命令来声明其后的变量是全局变量;否则的话PHP函数会认为该变量是个新的局部变量。
- 函数的作用域不同于变量的作用域
4.值传递与引用传递
- 通常情况下,函数获取参数的方式是值传递。当传递一个参数的时候,所创建的新的变量($var_副本)可以看做是原变量($var)的副本(复制品);对于该复制品,可以对其进行任意的修改,而能够函数外部的变量值不改变。
- 而当需要函数外的原变量($var)也跟着函数内的副本变量($var_副本)一起改变时,就需要是用引用传递;意思就是当修改了函数内的副本变量时($var_副本),函数外的原变量($var)也会跟着一起变化
- 可以通过在函数定义的参数名前加一个地址符(&)来制定参数的引用传递。
- 以下面代码为例:
-
值传递:
//值传递 function maoPiao($value,$amount=1){ $value=$value+$amount; } $value=10; maoPiao($value); echo $value;
引用传递
//引用传递 function maoPiao(&$value,$amount=1){ $value=$value+$amount; } $value=10; maoPiao($value); echo $value;
-
- 所以引用传递可以用来做变量的增量运算。
//引用传递 function maoPiao(&$value,$amount=1){ $value=$value+$amount; } $value=10; echo '调用maoPiao函数之前的$value='.$value."<br />"; maoPiao($value); echo '调用maoPiao函数之后的$value='.$value."<br/>";
5.return关键字
-
return的作用是终止函数的执行,在其下面的所有函数内代码都将被忽略。
- 以下面代码为例:
function testReturn(){ echo "这个内容将会被打印"; return; echo "这个内容不会被打印"; } testReturn();
-
return的正确用法:
- 满足特定条件之后终止函数。
function larger($x,$y){ if((!isset($x))||(!isset($y))){ echo "输入的内容不符合规范,请重新输入"; return; } if($x>=$y){ echo $x."<br />"; }else { echo $y."<br />"; } } larger(2);
- ![缺少一个参数输入的显示效果](http://upload-images.jianshu.io/upload_images/4167376-e2a5d7015827f953.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) - ``` function larger($x,$y){ if((!isset($x))||(!isset($y))){ echo "输入的内容不符合规范,请重新输入"; return; } if($x>=$y){ echo $x."<br />"; }else { echo $y."<br />"; } } larger(2,10); ``` - ![正确传入两个参数的显示效果](http://upload-images.jianshu.io/upload_images/4167376-252b102a21c5b593.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
-
返回函数值
return也可以用来将函数的结果的值进行返回,便于其他代码的调用。
-
用return返回值的话,上述代码可以修改为:
``` function larger($x,$y){ if((!isset($x))||(!isset($y))){ return flase; } if($x>=$y){ return $x; }else { return $y; } } $a=5; $b=10; echo larger($a,$b); ```
- 递归函数
- 所谓递归函数就是函数调用其自身;
- 很多情况下,递归可以用来取代循环;
- 递归函数比循环慢而且要占用更多内存,所以尽可能少用递归;
- 这是因为递归在每次调用函数的时候都会在内存中生成一段该函数的新副本,相应的也将产生多次函数调用的开销。
if(strlen($str)>0){
reverseR(substr($str,1));
}
echo substr($str,0,1)."
";
return;
}
reverseR('Hello');
```
6.名称空间
- 名称空间是一个抽象的容器,其可以包含用户所定义的函数,常量以及类。
- 优点:
- 一个名称空间中的所有函数、类和常量都将自动冠以名称空间前缀;
- 非全路径的类、函数和常量名称将在运行时解析,在查看全局空间之前,将首先查看名称空间。