当前位置: 首页 > news >正文

【PHP】函数-作用域可变函数匿名函数闭包常用系统函数

文章目录

  • 函数
    • 定义&使用
    • 命名规则
    • 参数种类
    • 默认值
    • 引用传递
    • 函数返回值
    • return关键字
  • 作用域
    • global关键字
    • 静态变量
  • 可变函数
  • 匿名函数
  • 闭包
  • 常用系统函数
    • 输出函数
    • 时间函数
    • 数学函数
    • 与函数相关函数

函数

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

定义&使用

function 函数名(参数){//函数体//返回值:return 结果;
}

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


函数的使用:通过 函数名()的方式进行函数访问

注意:

  • 如果函数在定义的过程中有参数,那么在调用的时候就必须传入对应的参数:函数是一种结构不会自动运行,必须通过调用才会执行
  • 函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段。
  • 函数的调用特点:只要系统在内存中能够找到对应的函数,就可以执行(函数的调用可以在函数定义之前
display(20); //20hello Mangofunction display($val)
{echo $val;echo "hello Mango";
}

命名规则

命名规范:由字母、数字和下划线组成,但是不能以数字开头

函数作为一种常用的结构,一般遵循以下规则:函数通常名字代表着函数的功能,而有些功能会比较复杂,可能一个单词不足以表达,需要多个组合。

1.驼峰法除了左边第一个单词外,后面所有的单词首字母都大写:showParentInfo()

2.下划线法单词之间通过下划线连接,单词都是小写:show_parent_info()

函数名字:在一个脚本周期中,不允许出现同名函数(通常在一个系统开发中都不会使用同名函数)


参数种类

函数的参数分为两种:形参和实参

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

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

例子:

image-20230731171911592

注意:

1.在PHP中允许实参多于形参(个数):函数内部不用而已

2.在PHP中理论上形参个数没有限制(实际开发不会太多)

3.实参不能少于形参个数


默认值

默认值指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值:如果实际调用传入的参数(实参)没有提供,那么形参就会使用定义时的值来进入函数内部参与运算。

通常默认值是用在一些一定会有某个数据参与,但是可能通常是某个我们知道的值。

注意事项:

1.默认值的定义是放在最右边的(多个),不能左边形参有默认值,但是右边没有 (必须从右往左缺省,而且要连续)

2.函数外部定义的变量名字与函数定义的形参名字冲突(同名)是没有任何关联关系的,如果多个函数使用同样的形参名字也不冲突。


引用传递

实参在调用时会将值赋值给形参,那么实际上使用的方式就是一种简单的值传递:将实参(如果是变量或者常量或者其他表达式)的结果(值)取出来赋值给形参:形参与外部实际传入的参数本身没有任何关联关系:只是结果一样。

如果希望在函数内部拿到的外部数据,能够在函数内部改变,那么就需要明确告知函数(定义时),函数才会在调用的时候去主动获取外部数据的内存地址。以上这种定义形式参数的方式叫作引用传值。

function 函数名(形参1,&形参2){ //此时形参1是值传递   形参2是引用传递//函数体
}

在调用的时候,必须给引用传值的参数位置传入实际参数,而且参数本身必须是变量。(变量才有指向的数据的内存地址)

$a = 1;
$b = 1;
function AddMyself($a,&$b)
{$a++;$b++;
}
AddMyself($a,$b);
echo $a,'<br/>',$b; // 1   2

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


函数返回值

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

function display()
{echo "hello world";
}
var_dump(display()); //NULL

函数的返回值可以是任意数据类型


return关键字

  1. return在函数内部存在的价值:返回当前函数的结果(当前函数运行结束,后续return的代码不会执行)
  2. return还可以在文件中直接使用(不在函数里面):代表文件将结果return后面跟的内容,转交给包含当前文件的位置。(通常在系统配置文件中使用较多),在文件中也代表中终止文件后面的代码:return之后的内容不会执行
$res = include_once 'func.hpp'; //假设该文件return 'hello world'
echo $res;//hello world

作用域

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

1.变量可以在普通代码中定义

2.变量也可以在函数内部定义


在PHP中作用域严格来说分为两种:但是PHP内部还定义一些在严格意义之外的一种,所以总共算三种:

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

  • 所属全局空间:在PHP中只允许在全局空间使用:理论上函数内部不可访问
  • 脚本周期:直到脚本运行结束(最后一行代码执行完)
$glo = 'global area'; function func()
{$inner = __FUNCTION__;echo $glo;//err,函数内部不可访问外部全局变量
}

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

  • 所属当前函数空间:在PHP中只允许在当前函数自己内部使用
  • 函数周期:函数执行结束(函数是在栈区中开辟独立内存空间运行)

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

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

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

$glo = 'global area'; function func()
{echo $GLOBALS['glo'];
}func(); //global area
echo '<hr/>';
echo $glo; //global area

如果想函数内部使用外部变量:除了$GLOBALS之外,通过参数传值(如果要统一战线还可以使用引用传值)。

global关键字

在PHP中,其实还有一种方式,能够实现全局访问局部,同时局部也可以访问全局:global关键字

global关键字:是一种在函数里面定义变量的一种方式

1、 如果使用global定义的变量名在外部存在(全局变量),那么系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间(同一个变量);

2、 如果使用global定义的变量名在外部不存在(全局变量),系统会自动在全局空间(外部)定义一个与局部变量同名的全局变量

本质的形式:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有。

语法规则

global 变量名;//不能赋值
$变量名 =;

例子:

$global = 'global area'; 
function func()
{//外部存在同名的global变量//函数内部定义的变量直接指向外部全局变量所指向的内存空间global $global; echo $global;//定义全局不存在变量global $local;$local = 'inner func';
}
func(); //global area
echo '<hr/>';
echo $local;//访问"局部"变量  inner func

以上方式可以实现局部与全局的互访,但是通常不会这么用。一般如果会存在特殊使用,也会使用参数的形式来访问。(还可以使用常量:define定义的常量)

define('PI', 3.14);function func()
{echo PI;
}
func(); //3.14
echo PI;//3.14

静态变量

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

语法

function 函数名(){//定义变量static $变量名 =;		//通常会在定义的时候就直接赋值
}

例子

function func()
{$local = 0;static $count = 0;$count++;$local++;echo $local," ",$count;
}
func(); echo '<hr/>';//1 1
func(); echo '<hr/>';//1 2
func(); echo '<hr/>';//1 3

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

使用

1、 为了统计:当前函数被调用的次数

2、 为了统筹函数多次调用得到的不同结果(递归思想)


可变函数

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

  • 该变量相当于是C语言当中的函数指针

语法

$变量名 = '函数名'
function 函数名(函数参数){//...
}
$变量名(函数参数)

使用例子

$func = 'display';
function display()
{echo "hell I am function display()" ;
}
$func();//hell I am function display()

可变函数在系统使用的过程中还是比较多的,尤其是使用很多系统函数的时候:需要用户在外部定义一个自定义函数,但是是需要传入到系统函数内部使用 (回调函数)

//假设是系统函数 -求第二个参数的4次方
function sys_func($arg1,$arg2)
{return $arg1($arg2);//user_func($agr2)
}
function user_func($num)
{return pow($num,4);
}
echo sys_func('user_func',10);//求10^4  ==> 10000

匿名函数

匿名函数==>没有名字的函数

基本语法

变量名 = function(函数参数){//函数体
}

使用一个变量保存匿名函数,本质该变量是一个对象(Closure)


使用例子

$func = function(){echo "hello world";
};
$func();//hello world
var_dump($func);//object(Closure)#1 (0) { }

闭包

简单来说:函数内部有一些局部变量在函数执行之后没有被释放,是因为在函数内部还有对应的函数在引用(函数的内部函数:匿名函数)

证明:函数内部的局部变量在函数使用完之后没有被释放

1、 使用内部匿名函数;

2、 匿名函数使用外部局部变量:use;

3、 匿名函数被返回给外部使用

function func()
{$name = "HELLO WORLD";//定义匿名函数//use就是将外部局部变量保留给内部使用$innerFunction = function() use($name){echo $name;}; //注意分号!return $innerFunction;//返回内部匿名函数
}
$get = func(); //$get = $innerFunction
$get();//HELLO WORLD

常用系统函数

输出函数

print():类似于echo输出提供的内容,本质是一种结构(不是函数),但是有返回值,始终返回1,可以不需要使用括号

print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)

时间函数

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

time():获取当前时间对应的时间戳

microtime():获取微秒级别的时间

strtotime():按照规定格式的字符串转换成时间戳

echo time(),'<br/>';
echo microtime(),'<br/>';
echo strtotime('tomorrow 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():获取当前自定义函数的参数数量(个数)

function testFunc($a,$b)
{//获取指定参数 --获取第一个参数var_dump(func_get_arg(1));//获取所有参数var_dump(func_get_args());//获取参数数量var_dump(func_num_args());
}
echo '<pre>';
//短路运算,该函数存在才调用
function_exists('testFunc') && testFunc(1,'2',3.14);

输出:

string(1) "2"
array(3) {[0]=>int(1)[1]=>string(1) "2"[2]=>float(3.14)
}
int(3)

注意:参数的标识是从0开始的,func_get_args和func_num_args都是统计的对应实参的数量

相关文章:

【PHP】函数-作用域可变函数匿名函数闭包常用系统函数

文章目录 函数定义&使用命名规则参数种类默认值引用传递函数返回值return关键字 作用域global关键字静态变量 可变函数匿名函数闭包常用系统函数输出函数时间函数数学函数与函数相关函数 函数 函数&#xff1a;function&#xff0c;是一种语法结构&#xff0c;将实现某一个…...

Python使用pymysql和sqlalchemy访问MySQL的区别

Python使用pymysql和sqlalchemy访问MySQL的区别 1. 两个数据库连接工具的对比 pymysql和sqlalchemy是两个Python中经常用于与MySQL数据库交互的库。都可以连接MySQL数据库&#xff0c;但它们有明显的区别。 &#xff08;1&#xff09;特点 pymysql是一个Python模块&#xf…...

ubuntu服务器的mysql,更改root密码,并允许远程连接

我只是一个搬运工 更改密码远程连接...

微信小程序【构建npm】使用记录

:: 问题 使用原生微信小程序开发时&#xff0c;通过官方 typescript 模板构建的小程序无法正确执行 构建npm 成功&#xff0c;从而导致我想通过 npm 安装并使用第三方库出现问题 :: 开发环境&#xff08;可参照&#xff09; 设备&#xff1a;macOS Ventura 13.0 微信开发者工…...

mybatis入门的环境搭建及快速完成CRUD(增删改查)

又是爱代码的一天 一、MyBatis的介绍 ( 1 ) 背景 MyBatis 的背景可以追溯到 2002 年&#xff0c;当时 Clinton Begin 开发了一个名为 iBATIS 的持久化框架。iBATIS 的目标是简化 JDBC 编程&#xff0c;提供一种更直观、易用的方式来处理数据库操作。 在传统的 JDBC 编程中&…...

《HeadFirst设计模式(第二版)》第九章代码——组合模式

上一章链接&#xff1a; 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式_轩下小酌的博客-CSDN博客 前面说到&#xff0c;当一个菜单里面出现了子菜单的时候&#xff0c;前面的迭代器模式得换成组合模式。 组合模式&#xff1a; 允许将对象组合成树形结构来表现部分-整…...

iOS17 widget Content margin

iOS17小组件有4个新的地方可以放置分别是&#xff1a;Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙&#xff0c;确保内容显示完整。这…...

计网第四章(网络层)(一)

前面学习了数据链路层&#xff0c;我们可以实现一个网络的内部通信&#xff0c;可是要把这些网络互连起来形成更大的互连网&#xff0c;就需要用网络层互联设备路由器。而有了路由器的参与&#xff0c;就有不同网络、跨网络的概念诞生。 这时候我想大家也能理解为什么叫网络层…...

【前端】vue3 接入antdv表单校验

1/&#x1f355;背景 1、表单校验是非常常见的需求&#xff0c;能够有效的拦截大部分的错误数据&#xff0c;提升效率。 2、快速的给使用者提示和反馈&#xff0c;用户体验感非常好。 3、成熟的表单校验框架&#xff0c;开发效率高&#xff0c;bug少。 最近使用的是vue3antdv的…...

CY3-COOH在蛋白质定位的特点1251915-29-3星戈瑞

​欢迎来到星戈瑞荧光stargraydye&#xff01;小编带您盘点&#xff1a; CY3-COOH是一种橙红色荧光标记试剂&#xff0c;可以用于蛋白质定位研究。**以下是CY3-COOH在蛋白质定位的特点和应用&#xff1a; 细胞定位&#xff1a;**将CY3-COOH标记到特定蛋白质上&#xff0c;可以…...

数据采集:selenium 获取某网站CDN 商家排名信息

写在前面 工作中遇到&#xff0c;简单整理理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整的&#xff0c;是人的逃避方式&#xff0c;是对大…...

5.从头跑一个pipeline

1.安装torch pip install torchvision torch PyTorch的torchvision.models模块中自带的很多预定义模型。torchvision 是PyTorch的一个官方库&#xff0c;专门用于处理计算机视觉任务。在这个库中&#xff0c;可以找到许多常用的卷积神经网络模型&#xff0c;包括ResNet、VGG、…...

leetcode原题: 堆箱子(动态规划实现)

题目&#xff1a; 给你一堆n个箱子&#xff0c;箱子宽 wi、深 di、高 hi。箱子不能翻转&#xff0c;将箱子堆起来时&#xff0c;下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法&#xff0c;搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。 输入使用数组…...

Java中数组和集合的对比,以及什么情况下使用数组更合适,什么情况下使用集合更合适。集合的基本介绍和集合体系图。

在Java中&#xff0c;数组和集合&#xff08;Java集合框架&#xff09;都用于存储多个元素。它们各自有不同的特点和适用场景。下面我会对数组和集合进行对比&#xff0c;并解释何时使用集合更好&#xff0c;以及何时使用数组更合适。 数组和集合的对比&#xff1a; 数组&…...

STM32之17.PWM脉冲宽度调制

一LED0脉冲宽度调制在TIM14_CHI&#xff0c;先将LED&#xff08;PF9&#xff09;代码配置为AF推挽输出模式&#xff0c;将PF9引脚连接到TIM14&#xff0c; #include <stm32f4xx.h>static GPIO_InitTypeDef GPIO_InitStruct;void Led_init(void) {//打开端口F的硬件时钟&a…...

VS2015打开Qt的pro项目文件 报错

QT报错&#xff1a;Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set 解决方法&#xff1a; 找到本机安装的QT路径&#xff0c;找到“msvc-version.conf”文件&#xff0c;用记事本打开&#xff0c; 在其中添加版本“QMAKE_MSC_VER 1900”保存即可。 …...

骨传导耳机会头疼吗?骨传导耳机会对身体不好吗

一般情况下&#xff0c;骨传导耳机不会引起头疼。由于骨传导耳机的工作原理是通过将声音传导到颞骨和耳部周围的骨骼来传达音频信号&#xff0c;而不是直接进入耳道&#xff0c;因此不会对耳朵造成压力或产生耳疼的感觉。 然而&#xff0c;每个人的感受和体验可能不同&#xff…...

【面试题系列】(一)

Redis有哪些数据结构&#xff1f;其底层是怎么实现的&#xff1f; Redis 系列&#xff08;一&#xff09;&#xff1a;深入了解 Redis 数据类型和底层数据结构 字符串&#xff08;String&#xff09;&#xff1a; 用于存储文本或二进制数据。可以执行字符串的基本操作&#xf…...

vscode C++17便捷配置教程(懒人版)

环境链接 以上是已经配置好的c17环境链接&#xff0c;直接下载解压即可&#xff08;注意文件路径上不要带有中文&#xff09; 下载解压之后按照msys64-mingw64-bin路径打开 然后单击该路径右方空白区域可直接复制路径 然后点击开始菜单搜索“环境变量“并打开&#xff08;如…...

动态数组实现链地址法哈希表

通常情况下哈希函数的输入空间远大于输出空间&#xff0c;因此理论上哈希冲突是不可避免的。比如&#xff0c;输入空间为全体整数&#xff0c;输出空间为数组容量大小&#xff0c;则必然有多个整数映射至同一数组索引。 解决哈希冲突方法常见有&#xff1a;链地址法、开放寻址…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...