目录
一、基本概念
二、基本语法
三、函数命名规范
四、形参和实参
五、形参默认值
六、实参引用传递
七、函数返回值(return)
八、作用域
1.全局变量" >1.全局变量
3. 超全局变量" >3. 超全局变量
(1)内部调用外部" >(1)内部调用外部
(2)外部调用内部" >(2)外部调用内部
4.静态变量" >4.静态变量
九、可变函数
十、匿名函数
十一、闭包函数
十二、伪类型
十三、常用系统函数
(一)关于输出的函数" >(一)关于输出的函数
(二)关于时间的函数" >(二)关于时间的函数
(三)关于数学的函数 " >(三)关于数学的函数
(四)关于自定义函数的函数" >(四)关于自定义函数的函数
首页 后端开发 php教程 PHP函数及作用域知识详解

PHP函数及作用域知识详解

May 25, 2022 pm 01:38 PM
php

本篇文章给大家带来了关于PHP的相关知识,其中主要介绍了关于函数以及作用域的相关问题,包括了函数命名规范、函数返回值、可变函数、匿名函数等等内容,下面一起来看一下,希望对大家有帮助。

PHP函数及作用域知识详解

推荐学习:《PHP视频教程

一、基本概念

        函数:function,是一种语法结构,将实现某一个功能的代码块(多行代码)封装到一个结构中,从而实现代码的重复利用(复用)。


二、基本语法

        函数有几个对应的关键点:function关键字、函数名、参数(形参和实参)、函数体和返回值。

基本语法如下:

Function 函数名([参数]){

         //函数体,基本上所有的代码都可以实现,定义变量、定义常量、使用流程控制(分支、循环)、可以调用函数。
         //返回值:return 结果;
}
登录后复制

定义函数的目的:是为了实现代码的重复利用,一个功能一个函数(简单明了)。

        函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段。函数的调用特点:只要系统在内存中能够找到对应的函数,就可以执行(函数的调用可以在函数定义之前)

函数执行的内存分析:

  • 读取代码进入到代码段(编译:将代码变成字节码存储到内存)
  •  根据代码逐行执行——编译和执行是分开的(先编译后执行)

三、函数命名规范

        命名规范:由字母、数字和下划线组成,但是不能以数字开头。函数作为一种常用的结构,一般遵循以下规则:函数通常名字代表着函数的功能,而有些功能会比较复杂,可能一个单词不足以表达,需要多个组合。

  1. 驼峰法:除了左边第一个单词外,后面所有的单词首字母都大写:showParentInfo()
  2. 划线法:单词之间通过下划线连接,单词都是小写:show_parent_info()

四、形参和实参

形参:形式参数,不具有实际意义的参数,是在函数定义时使用的参数。

实参:实际参数,具有实际意义的参数,是在函数调用时使用的参数。

两者关系:形参是实参的载体:实参在调用时通常是需要传入到函数内部参与计算(运算),那么需要在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以实参的形式传递给形参:给形参赋值,从而使得函数内部可以用到外部数据。

<h3>函数参数形参和实参</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	//定义函数
	function jia($a,$b){  //形参可以有多个,逗号,隔开
		echo $a + $b;//函数体使用形参运算
	};
	$num = 10;//定义实参
	jia($num,2);//传入实参,实参可以是变量、常量、运算结果等
?>
登录后复制

  • 在PHP中允许实参多余形参(个数):函数内部不用而已
  • 在PHP中理论上形参个数没有限制(实际开发不会太多)
  • 实参不能少于形参个数。


五、形参默认值

        默认值:default value,指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值:如果实际调用传入的参数(实参)没有提供,那么形参就会使用定义时的值来进入函数内部参与运算。通常默认值是用在一些,一定会有某个数据参与,但是可能通常是某个我们知道的值。

<h3>形参默认值</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	$a = 10;//定义实参
	//定义函数
	function jia($a = 6,$b = 4){  //此时$a是实参,编译不执行,属于jia函数内部,跟外面的$a=10不冲突。
		echo $a + $b;//10 + 4 = 14
	};
	jia($a);//调用$a,有传参就是10,$b是4,所以值就是14
	echo "<hr/>";
	echo $a;//10
?>
登录后复制

        注意:默认值的定义是放在最右边的(多个),不能左边形参有默认值,但是右边没有函数外部定义的变量名字与函数定义的形参名字冲突(同名)是没有任何关联关系的;如果多个函数使用同样的形参名字也不冲突。


六、实参引用传递

        实参在调用时会将值赋值给形参,那么实际上使用的方式就是一种简单的值传递:将实参(如果是变量或者常量或者其他表达式)的结果(值)取出来赋值给形参:形参与外部实际传入的参数本身没有任何关联关系:只是结果一样。有的时候,希望在函数内部拿到的外部数据,能够在函数内部改变,那么就需要明确告知函数(定义时),函数才会在调用的时候去主动获取外部数据的内存地址。以上这种定义形式参数的方式叫作引用传值。

基本定义语法:

Function 函数名(形参1,&形参2){

         //函数体

}

<h3>引用传递</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function xiao($x,&$y){ //定义函数xiao()
		$x = $x * $x;
		$y = $y * $y; //修改两个形参的值
		echo $x;echo "<hr>";echo $y,"<hr>";
	};
	$x = 4;$y = 2;//定义变量
	xiao($x,$y);
	echo $x,"<hr>",$y,"<hr>";
?>
登录后复制

 思考:两者对比,为什么第二个y变成了4?

参考:php——三篇夯实根基第一篇_xiaochuhe.的博客-CSDN博客里面的变量引用赋值。

注意:引用传值注意事项:在传入实参的时候,必须传入变量!!!


七、函数返回值(return)

        返回值:return,指的是将函数实现的结果,通过return关键字,返回给函数外部(函数调用处):在PHP中所有的函数都有返回值。(如果没有明确return使用,那么系统默认返回NULL。

<h3>函数返回值</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function chuhe(){//定义函数
		echo __FUNCTION__;echo &#39;<hr/>';//输出当前函数的名称
		echo __FILE__;echo '<hr/>';//输出当前文件名的绝对路径
	};
	//chuhe();echo '<hr>';
	var_dump(chuhe());
登录后复制

 返回值作用:将计算结果返回给调用处,并且函数的返回值可以是任意数据类型

<h3>函数返回值——Retrun</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function jia($x,$y){
		return $x + $y;//return直接结束jia函数
		echo $x; //注意,此时echo函数不执行
	};
	$num =jia(4,5);//9
	echo $num;
登录后复制

  • return在函数内部存在的价值:返回当前函数的结果(当前函数运行结束)
  • return还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当前文件的位置。(通常在系统配置文件中使用较多),在文件中也代表中终止文件后面的代码:return之后的内容不会执行。

八、作用域

作用域:变量(常量)能够被访问的区域

  • 变量可以在普通代码中定义
  • 变量也可以在函数内部定义

作用域分类:

  1. 全局变量
  2. 局部变量
  3. 超全局变量

1.全局变量

全局变量:就是用户普通定义的变量(函数外部定义)

所属全局空间:在PHP中只允许在全局空间使用:理论上函数内部不可方法

脚本周期:直到脚本运行结束(最后一行代码执行完)

<h3>全局变量</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	$global = "这是全局变量!"; //定义变量
	function chuhe(){ 
		$inner = __FILE__;//局部变量
		echo $global; //肯定是报错的,函数内部肯定是访问不了全局变量滴
	};
	chuhe();//调用函数
登录后复制

2.局部变量

局部变量:就是在函数内部定义的变量

所属当前函数空间:在PHP中只允许在当前函数自己内部使用

函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行)

<h3>局部变量</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	$global = "这是全局变量!"; //定义变量
	function chuhe(){ 
		$inner = __FILE__;//局部变量
		//echo $global; //肯定是报错的,函数内部肯定是访问不了全局变量滴
	};
	chuhe();//调用函数
	echo $inner;//访问局部变量,也是报错的
登录后复制

3. 超全局变量

超全局变量:系统定义的变量(预定义变量:$_SERVER、$_POST等)

所属超全局空间:没有访问限制(函数内外都可以访问)

        超全局变量会将全局变量自动纳入到$GLOBALS里面,而$GLOBALS没有作用域限制,所以能够帮助局部去访问全局变量:但是必须使用数组方式。

(1)内部调用外部

<h3>超全局变量</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	$global = "这是全局变量!"; //定义变量
	function chuhe(){ 
		$inner = __FILE__;//局部变量
		echo $GLOBALS['global'];//讲全局变量纳入$GLOBALS里面
	};
	chuhe();//调用函数
登录后复制

(2)外部调用内部

<h3>超全局变量</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	$global = "这是全局变量!"; //定义变量
	function chuhe(){
		global $inner; //定义变量,使用全局变量。
		$inner = __FILE__;//局部变量
					
	};
	chuhe();echo $inner;//调用函数,并访问局部变量
登录后复制

4.静态变量

        静态变量:static,是在函数内部定义的变量,使用static关键字修饰,用来实现跨函数共享数据的变量:函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量又会重新初始化。

基本语法:

Function 函数名(){

         //定义变量

         Static $变量名 = 值;               //通常会在定义的时候就直接赋值

}

<h3>静态变量</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function xiao(){
		$a = 2;//定义变量
		static $b = 3;//定义静态变量
		echo $a++;echo "<hr>";
		echo $b++;echo "<hr>";
	};
	xiao();//调用函数
	xiao();//再调一次
	xiao();//再调一次
登录后复制

         静态变量的作用是为了跨函数共享数据(同一个函数被多次调用) 。


九、可变函数

        当前有一个变量所保存到值,刚好是一个函数的名字,那么就可以使用变量+()来充当函数名使用

<h3>可变函数</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function chu(){
		echo __FILE__;echo __FUNCTION__;echo __LINE__;
	}
	$xiao = "chu";//定义变量
	$xiao();//调用可用函数
登录后复制

附加思考:

<h3>可变函数</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function xiao($a,$b){ //假设定义系统函数
		$b = $b + 6;
		return $a($b);//chuhe(16)
	}
	function chuhe($c){
		return $c * $c * $c;  //定义一个用户函数,求该函数的3次方
	}
	echo xiao(&#39;chuhe&#39;,10);//16*16*16
	echo "<br>","懵了吧,多想想就懂了!";
	//懵了吧,多想想就懂了!!
登录后复制


十、匿名函数

        没有名字的函数,变量保存匿名函数,本质得到的是一个对象(Closure)。

<h3>函数</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	$xiaofeng = function(){ //定义匿名函数
		echo "我是萧风!";
	};
	$xiaofeng();echo "<hr>";//调用匿名函数
	var_dump($xiaofeng);//查案变量类型及内容
登录后复制


十一、闭包函数

        闭包:closure, 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)简单理解:函数内部有一些局部变量(要执行的代码块)在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)

<h3>闭包函数</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function xiaofeng(){
		$inner = __FILE__;//定义局部变量
		#定义匿名函数
		$chuhe = function() use($inner){//用use讲局部变量保留给内部使用闭包
			echo $inner;
		};
		$chuhe();//调用函数
	}
	xiaofeng();
登录后复制

思考:函数使用完后局部变量有没有被释放?

<h3>闭包函数</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	function xiaofeng(){
		$inner = __FILE__;//定义局部变量
		#定义匿名函数
		$chuhe = function() use($inner){//用use讲局部变量保留给内部使用闭包
			echo $inner;
		};
		return $chuhe();//返回内部匿名函数
	}
	$closure = xiaofeng();//理论上局部变量inner已经释放了
	$closure();
登录后复制


十二、伪类型

        伪类型:假类型,实际上在PHP中不存在的类型。但是通过伪类型可以帮助程序员去更好的查看操作手册从而更方便学习。

伪类型主要有两种:在三大类八小类之外

  • Mixed:混合的,可以是多种PHP中的数据类型
  • Number:数值的,可以是任意数值类型(整形和浮点型)

十三、常用系统函数

(一)关于输出的函数

  • print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号
  • print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)

(二)关于时间的函数

  • date():按照指定格式对对应的时间戳(从1970年格林威治时间开始计算的秒数),如果没有指定特定的时间戳,那么就是默认解释当前时间戳

  • time():获取当前时间对应的时间戳
  • microtime():获取微秒级别的时间
  • Strtotime():按照规定格式的字符串转换成时间戳

<h3>时间函数</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	echo date('Y 年 m 月 d 日 H:i:s',987654321);echo "<hr>";
	echo time();echo "<hr>";
	echo microtime();echo "<hr>";
	echo strtotime(" 10 hours");
登录后复制

(三)关于数学的函数

  • max():指定参数中最大的值
  • min():比较两个数中较小的值
  • rand():得到一个随机数,指定区间的随机整数
  • mt_rand():与rand一样,只是底层结构不一样,效率比rand高(建议使用)
  • round():四舍五入
  • ceil():向上取整
  • floor():向下取整
  • pow():求指定数字的指定指数次结果:pow(2,8) == 2^8 == 256
  • abs():绝对值
  • sqrt():求平方根

(四)关于自定义函数的函数

  • function_exists():判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
  • func_get_arg():在自定义函数中去获取指定数值对应的参数
  • func_get_args():在自定义函数中获取所有的参数(数组)
  • func_num_args():获取当前自定义函数的参数数量
<h3>自定义函数</h3>
<?php
	header("Content-type:text/html;charset=gbk");
	echo "<pre class="brush:php;toolbar:false">";
	function xiao($a,$b){
		print_r(func_get_arg(1));echo "<hr>";//获取指定参数
		print_r(func_get_args());echo "<hr>";//获取所有参数
		print_r(func_num_args());;echo "<hr>";//获取参数数量
		
	}
	xiao(1,2);//调用函数
	echo "<br>";
	function_exists('xiao') && xiao(1,'2');//在调用函数时,判断指定的函数名字是否在内存中存在(帮助用户不去使用一个不存在的函数,让代码安全性更高)
登录后复制

推荐学习:《PHP视频教程

以上是PHP函数及作用域知识详解的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 适用于 Ubuntu 和 Debian 的 PHP 8.4 安装和升级指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 带来了多项新功能、安全性改进和性能改进,同时弃用和删除了大量功能。 本指南介绍了如何在 Ubuntu、Debian 或其衍生版本上安装 PHP 8.4 或升级到 PHP 8.4

如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 如何设置 Visual Studio Code (VS Code) 进行 PHP 开发 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也称为 VS Code,是一个免费的源代码编辑器 - 或集成开发环境 (IDE) - 可用于所有主要操作系统。 VS Code 拥有针对多种编程语言的大量扩展,可以轻松编写

我后悔之前不知道的 7 个 PHP 函数 我后悔之前不知道的 7 个 PHP 函数 Nov 13, 2024 am 09:42 AM

如果您是一位经验丰富的 PHP 开发人员,您可能会感觉您已经在那里并且已经完成了。您已经开发了大量的应用程序,调试了数百万行代码,并调整了一堆脚本来实现操作

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

php程序在字符串中计数元音 php程序在字符串中计数元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符组成的序列,包括字母、数字和符号。本教程将学习如何使用不同的方法在PHP中计算给定字符串中元音的数量。英语中的元音是a、e、i、o、u,它们可以是大写或小写。 什么是元音? 元音是代表特定语音的字母字符。英语中共有五个元音,包括大写和小写: a, e, i, o, u 示例 1 输入:字符串 = "Tutorialspoint" 输出:6 解释 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。总共有 6 个元

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? 什么是PHP魔术方法(__ -construct,__destruct,__call,__get,__ set等)并提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些?PHP的魔法方法包括:1.\_\_construct,用于初始化对象;2.\_\_destruct,用于清理资源;3.\_\_call,处理不存在的方法调用;4.\_\_get,实现动态属性访问;5.\_\_set,实现动态属性设置。这些方法在特定情况下自动调用,提升代码的灵活性和效率。

See all articles