文档章节

PHP(六)函数

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

当程序代码多了以后,用函数来组织这些程序。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配置php.ini的六点技巧分享

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

墨梅
2014/02/28
0
0
PHP:6种GET和POST请求发送方法

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

snowing1990
2016/04/15
27
0
php开源框架--templi

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

李lili
2013/08/26
723
1
thinkphp5 整合geetest极验滑动验证码

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

我心中有猛狗
2017/11/07
0
0
PHP高级编程中关于PHP函数的介绍

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

PXZ6603
2016/08/19
0
0
PHP高级编程中关于PHP函数的介绍

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

PXZ6603
06/26
0
0
PHP视频教程搜集整理分享【www.eaglephp.com】

1、PHP视频教程 (第一讲) PHP环境搭配和代码调试 2、PHP视频教程 (第二讲) PHP的数据类型 源码调试 3、PHP视频教程 (第三讲) 常用PHP运算类型介绍与应用 4、PHP视频教程 (第四讲) PHP条件语句...

maoxiaojian
2013/02/28
447
5
mysql数据库基本命令

一、创建数据库: create database databasename; 切入数据库: use databasename php中创建数据库的两种方法: (mysqlcreatedb(),mysqlquery()) $conn = mysqlconnect(“localhost”,”use...

技术小甜
2017/11/21
0
0
PHP代码优化24条真经

PHP代码优化24条真经 PHP点点通2016-09-2636 阅读 PHP echo比print快。 使用echo的多重参数代替字符串连接。 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用forea...

PHP点点通
2016/09/26
0
0
在PHP语言中使用JSON

目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。 我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应...

阮一峰
2011/01/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring配置xml启动报错 Connot find 'beans'

1.我们先看一下spring的原始配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSc......

江湖鱼大虾
7分钟前
0
0
与女儿谈商业模式 (4):戴尔的成功秘诀

分类:与女儿谈商业模式 | 标签: 戴尔 经济学 陈志武 2007-05-15 10:26阅读(7434)评论(36)   2007年5月《创富志》与“女儿谈商业模式”专栏 (之四)   戴尔的成功秘诀   陈志武   ...

祖冲之
16分钟前
0
0
www.w3.org被qiang导致logback报错:Connect reset

web项目部署到tomcat后,web项目中的logback不能运行,报错信息如下: Reported exception: ch.qos.logback.core.joran.spi.JoranException: I/O error occurred while parsing xml file......

浮躁的码农
30分钟前
0
0
JDeveloper中文乱码解决

全局设置字体; 全局设置环境编码; 项目设置编译器环境编码。

wffger
58分钟前
2
0
MySQL主从介绍 , 准备工作,配置主,配置从, 测试主从同步

MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的 MySQL主从是基于binlog的,主上须开启bin...

TaoXu
今天
2
0
线性代数学习总结

亭子happy
今天
1
0
Java8:Lambda表达式增强版Comparator和排序

1、概述 在这篇教程里,我们将要去了解下即将到来的JDK 8(译注,现在JDK 8已经发布了)中的Lambda表达式——特别是怎样使用它来编写Comparator和对集合(Collection)进行排序。 这篇文章是...

孟飞阳
今天
0
0
从架构到组件,深挖istio如何连接、管理和保护微服务2.0?

近几年我一直从事于微服务系统的设计以及实现方面的工作,属于微服务架构一线实践者。之前做过一些单体系统的微服务改造,在微服务拆分、治理等方面都有一定的经验。 本人比较特殊一点的经历...

xiaomin0322
今天
1
0
基于vue的h5文件切片上传(获取文件md5,实现秒传、进度条实现)

template <button @click="file"></button><label ref="upload" style="position: relative;"> <input type="file" @change="selectFile" style="position: abs......

hkaikai
今天
2
0
Spring Boot 2.0 项目实现自同步AD域账号

在通过Spring Boot的自动化装配功能及JDK自带的LDAP模块,可通过如下几个简单步骤实现业务系统自动同步AD域账号功能。 1. Java自带ldap搜索域账号信息核心代码: try { LdapContext ctx...

B超
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部