文档章节

PHP(六)函数

ChuckleLiu
 ChuckleLiu
发布于 2015/12/22 20:17
字数 2076
阅读 48
收藏 2

当程序代码多了以后,用函数来组织这些程序。PHP最初的设计原则是用函数来组织程序,以让一段代码形成一个”程序模块“,不管在什么地方使用这些函数时,即可调用函数,省去了重复编写代码的麻烦,也方便了代码的审阅、修改和完善。

如何使用函数

函数类似于一个黑盒。放入需要的东西,返回给你结果。

”函数名()“可以调用函数。

系统(内置)函数

PHP有很多标准的函数,这些函数分为两部分,一部分是核心函数,例如字符串和变量函数,在PHP安装后,默认就有。还有一些函数需要和特定的PHP扩展模块一起安装,否则在使用它们的时候就会得到一个致命的”未定义函数“错误。例如,要使用图像函数imagecreatetruecolor(),需要在安装PHP的时候加上GD(一个图像处理库)的支持。或者,要是用MySQL数据库的连接函数mysql_connect(),就要在安装PHP的时候加上MySQL数据库的支持。要知道当前你是用的PHP有哪些函数,可以调用phpinfo()函数或者get_loaded_extensions()函数得到PHP加载了哪些扩展库。

对于默认就是有效的函数库,PHP手册中的函数参考章节按照不同的扩展库组织了它们的文档。

自定义函数

函数以关键字function开头,然后是空格,紧接着是本函数的函数名称,接着是一对括号,括号里面是函数参数,括号后面是大括号,和其中的内容,叫函数体,即实现函数功能的代码,大括号用来界定函数代码的范围,表明其内的代码属于此函数,最后一句可以有return语句,这表明函数返回结果。

在目前的PHP版本中,函数具有全局属性,也就是说在定义一个函数之后,可以在程序的任何地方使用,定义函数的位置可以在程序的任何地方,甚至可以放在另一个函数的内部。

函数参数

函数的参数是用来和函数沟通的途径,参数以逗号作为分隔符。

调用函数时,需要给参数传值,传值有3种方式:

  • 按值传递

  • 引用传递,把变量的值赋给参数,那个变量的值会随参数的改变而改变,格式是在参数前加一个&

  • 默认值,在定义函数参数的时候就给它设定一个默认值,如果调用函数时没有给参数,那么便会使用它的默认值,如果给了,就会使用给定的参数值。默认值必须是常量表达式,不是变量、类成员,或者函数调用等。在函数参数使用默认值的时候,如果有多个参数,那么需要将有默认值的参数放在任何非参数默认值的右边,不然会报错。

返回值

函数值通过使用可选的返回语句返回。通常使用return语句,任何类型都可以返回,其中包括列表和对象。如果return语句在函数中,那么执行后将会立即停止该函数运行,并将控制权传递回它被调用的行。函数不能返回多个值,但是可以返回一个数组来得到多个值。

同样,函数也可以返回一个调用,这和变量的引用类似,只需要在函数前加一个&,下面举一个例子:

<?php
    function &returnReference(){
         $someReference = "you are hansome";
        return $someReference;
    }
    
    $reference = &returnReference();
    echo $reference;
?>

变量$reference是函数returnReference返回的一个引用。

动态调用函数

栗子:

普通做法:

<?php
//设置字符串转换方式:小写(strtolower),大写(strtoupper)
$functionName = 'strtolower'; 
$string = "ABC";  //设置要处理的字符串

//判断用户设置
if($functionName == 'strtolower'){
   //调用函数处理
   $string = strtolower($string);
}
?>

另一种做法,动态调用函数

<?php
//设置字符串转换方式:小写(strtolower),大写(strtoupper)
$functionName = 'strtolower'; 
$string = "ABC";  //设置要处理的字符串

$functionName($string);
?>

上面的就是PHP中的动态调用函数,注意第六行,变量后面有圆括号,这意味着PHP将寻找与变量$functionName的值同名的函数,并且将尝试执行它,结果为处理$string的函数是strtolower,如果设置为strtoupper,那么处理$string的函数是strtoupper。

动态调用函数不能用于语言结构,例如echo()、print()、unset()、isset()、empty()、include()、require()及类似的语句,除非将这些语言结构重新用自定义函数包装起来,然后使用包装的函数调用。

作用域

下面要说的是变量和函数在文件结构中的作用域以及一些改变其作用域的方法。

局部作用域

局部作用域即只是在某一个区间内有效。

函数内定义的变量无法直接在函数外使用。

函数外定义的变量无法直接在函数内使用。

函数内要使用函数外定义的变量,需在变量前加上关键字global,后面是空格变量,这样函数内姐可以使用函数外的变量了,如果有多个变量的话,就要使用逗号隔开。

还有一种方法是使用超全局变量来访问具有全局作用的变量,但是通常情况下不这样做。(我现在还不懂这个)

全局作用域

在前面提到过,函数具有全局作用域,也就是定义一个函数,那么该函数可以在程序的任何地方使用。在PHP中,虽然直接在文件开头定义的变量是全局变量,但是在函数中却需要加关键字global才可以使用,但如果有必要可以将变量定义在预定义变量中,因为PHP预定义变量是超全局变量,超全局变量在PHP中任何地方都可以使用,这个特性和函数的特性一样。

举一个例子:

<?php
//定义变量$test
$test = 'abcd';

//定义函数printVar
function printVar(){
   echo '在函数printVar内显示的$GLOBALS[\'test\']:'.$GLOBALS['test'];
   echo "<br>";
}

printVar();
echo '直接显示的$GLOBALS[\'test\']:'.$GLOBALS['test'];
echo "<br>";
echo '直接显示的$test:'.$test;
?>

效果:

在函数printVar内显示的$GLOBALS['test']:abcd
直接显示的$GLOBALS['test']:abcd
直接显示的$test:abcd

再举一个例子:

<?php
//定义变量$test
$test = 'abcd';

//定义函数printVar
function printVar(){
    $wahaha = 'wahaha';
}


echo '直接显示的$GLOBALS[\'test\']:'.$GLOBALS['test'];
echo "<br>";
echo '直接显示的$GLOBALS[\'wahaha\']:'.$GLOBALS['wahaha'];
?>

运行之后会发现提示“Notice:Undefined index:wahaha in ....”,意思是未定义的索引“wahaha”,“$GLOBALS['wahaha']:”后面没有显示结果。

$test变量没有在任何函数内或者foreach等结构内,所以具有全局属性,这些变量都可以用超全局变量$GLOBAL访问,反之,在函数printVar内定义的变量$wahaha则具有局部属性,只是在函数printVar中才有效,所以不能用$GLOBAL访问

生存期

变量和函数放在不同的地方会有不一样的生存期,变量生存期的内容与函数及结构息息相关。

举一个栗子:

<?php
   
   function test(){
       $a = 0;
       echo $a;
       $a++;
   }
   
   test();
   test();
?>

结果是:

00

函数内的$a是一个局部作用域变量,每次调用函数都会将变量$a的值设为0并输出0,将变量自加1的$a++没有作用,因为一旦退出本函数变量$a就不存在了。

那么要将函数内的变量$a保留下来,除了return返回值之外,还可以使用静态变量,在$a前面加上关键字static,之后变量$a的生存期就被改变,不因为调用的结束而结束,当第二次调用该函数时,变量$a的值依旧存在。

函数生存期的例子:不推荐在函数中定义函数,一旦这样的话,上层函数就只能调用一次,因为不能重复定义函数中的那个函数。

© 著作权归作者所有

共有 人打赏支持
ChuckleLiu
粉丝 2
博文 15
码字总数 10402
作品 0
南岸
PHP:6种GET和POST请求发送方法

在i94web博客中,我试过了畅言和多说两种社会化评论框,后来还是抛弃了畅言,不安全。 无论是畅言还是多说,我都需要从远程抓取文章的评论数,然后存入本地数据库。对于多说,请求的格式如下...

snowing1990
2016/04/15
27
0
PHP配置php.ini的六点技巧分享

一、PHP脚本执行时间找到 maxexecutiontime = 30 该选项设定PHP程序的最大执行时间,如果一个PHP脚本被请求,且该PHP脚本在maxexecutiontime时间内没能执行完毕, 则PHP不再继续执行,直接给客户...

墨梅
2014/02/28
0
0
thinkphp5 整合geetest极验滑动验证码

专业的事给专业的做,验证码第三方化还是比较爽的 官网:http://www.geetest.com/ 一:注册获取key 注册->创建应用->获取id和key 二:配置 /conf/config.php(配置文件提出到根目录下conf) ...

我心中有猛狗
2017/11/07
0
0
php开源框架--templi

TEMPLI php 使用手册 一、控制器 controller 控制器的命名 nameController.php 控制器的编写 field()->where()->select(); //载入模型文件 使用模型文件内自定义的 方法add Templi::model(‘...

李lili
2013/08/26
723
1
PHP高级编程中关于PHP函数的介绍

PHP函数 在PHP中,函数是一段PHP代码的集合,通过调用函数就可以执行一些任务或返回一些结果。PHP脚本通常是由主程序和函数构成的,这些函数不仅构成了PHP脚本的主要功能,也实现了程序代码的...

PXZ6603
2016/08/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mysql 数据类型及占用字节数

数字类型 TINYINT                           1 字节 SMALLINT                          2 个字节 MEDIUMINT                         3 个字节...

会游泳的鱼_
今天
3
0
高性能mysql:创建高性能的索引

性能优化简介 MySQL性能定义为完成某件任务所需要的时间量度,换句话说,性能即响应时间,这是一个非常重要的原则。我们通过任务和时间而不是资源来测量性能。数据库服务器的目的是执行SQL语...

背后的辛酸
今天
7
0
HTTP get、post 中请求json与map传参格式

import java.io.IOException;import java.net.URI;import java.net.URISyntaxException;import java.nio.charset.Charset;import java.util.ArrayList;import java.util.List;im......

寒风中的独狼
今天
5
0
IDEA中tomcat启动慢 耗时10分钟

用idea中的tomcat以debug模式启动,会非常的慢,而正常启动没啥问题;原因是debug模式中View Breakpoints断点代码,断点的是jar包,而现在启动由于jar包发生变化,导致启动时一直处于等待中。...

GoodMarver
今天
6
0
Linux学习-10月18(awk)

9.6/9.7 awk 一、awk简介   1. awk是一种编程语言,用于对文本和数据进行处理的   2. 具有强大的文本格式化能力   3. 利用命令awk,可以将一些文本整理成为我们想要的样子   4. 命令awk...

wxy丶
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部