【PHP】函数-作用域可变函数匿名函数闭包常用系统函数
文章目录
- 函数
- 定义&使用
- 命名规则
- 参数种类
- 默认值
- 引用传递
- 函数返回值
- return关键字
- 作用域
- global关键字
- 静态变量
- 可变函数
- 匿名函数
- 闭包
- 常用系统函数
- 输出函数
- 时间函数
- 数学函数
- 与函数相关函数
函数
函数:function,是一种语法结构,将实现某一个功能的代码块(多行代码)封装到一个结构中,从而实现代码的重复利用(复用)。
定义&使用
function 函数名(参数){//函数体//返回值:return 结果;
}
定义函数的目的:是为了实现代码的重复利用,一个功能一个函数(简单明了)
函数的使用:通过 函数名()
的方式进行函数访问
注意:
- 如果函数在定义的过程中有参数,那么在调用的时候就必须传入对应的参数:函数是一种结构不会自动运行,必须通过调用才会执行
- 函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段。
- 函数的调用特点:只要系统在内存中能够找到对应的函数,就可以执行(函数的调用可以在函数定义之前)
display(20); //20hello Mangofunction display($val)
{echo $val;echo "hello Mango";
}
命名规则
命名规范:由字母、数字和下划线组成,但是不能以数字开头
函数作为一种常用的结构,一般遵循以下规则:函数通常名字代表着函数的功能,而有些功能会比较复杂,可能一个单词不足以表达,需要多个组合。
1.驼峰法:除了左边第一个单词外,后面所有的单词首字母都大写:showParentInfo()
2.下划线法:单词之间通过下划线连接,单词都是小写:show_parent_info()
函数名字:在一个脚本周期中,不允许出现同名函数(通常在一个系统开发中都不会使用同名函数)
参数种类
函数的参数分为两种:形参和实参
- 形参:形式参数,不具有实际意义的参数,是在函数定义时使用的参数
- 实参:实际参数,具有实际数据意义的参数,是在函数调用时使用的参数
形参是实参的载体:实参在调用时通常是需要传入到函数内部参与计算(运算),那么需要在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以实参的形式传递给形参:给形参赋值,从而使得函数内部可以用到外部数据。
例子:
注意:
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关键字
- return在函数内部存在的价值:返回当前函数的结果(当前函数运行结束,后续return的代码不会执行)
- 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关键字静态变量 可变函数匿名函数闭包常用系统函数输出函数时间函数数学函数与函数相关函数 函数 函数:function,是一种语法结构,将实现某一个…...
Python使用pymysql和sqlalchemy访问MySQL的区别
Python使用pymysql和sqlalchemy访问MySQL的区别 1. 两个数据库连接工具的对比 pymysql和sqlalchemy是两个Python中经常用于与MySQL数据库交互的库。都可以连接MySQL数据库,但它们有明显的区别。 (1)特点 pymysql是一个Python模块…...
ubuntu服务器的mysql,更改root密码,并允许远程连接
我只是一个搬运工 更改密码远程连接...
微信小程序【构建npm】使用记录
:: 问题 使用原生微信小程序开发时,通过官方 typescript 模板构建的小程序无法正确执行 构建npm 成功,从而导致我想通过 npm 安装并使用第三方库出现问题 :: 开发环境(可参照) 设备:macOS Ventura 13.0 微信开发者工…...
mybatis入门的环境搭建及快速完成CRUD(增删改查)
又是爱代码的一天 一、MyBatis的介绍 ( 1 ) 背景 MyBatis 的背景可以追溯到 2002 年,当时 Clinton Begin 开发了一个名为 iBATIS 的持久化框架。iBATIS 的目标是简化 JDBC 编程,提供一种更直观、易用的方式来处理数据库操作。 在传统的 JDBC 编程中&…...
《HeadFirst设计模式(第二版)》第九章代码——组合模式
上一章链接: 《HeadFirst设计模式(第二版)》第九章代码——迭代器模式_轩下小酌的博客-CSDN博客 前面说到,当一个菜单里面出现了子菜单的时候,前面的迭代器模式得换成组合模式。 组合模式: 允许将对象组合成树形结构来表现部分-整…...
iOS17 widget Content margin
iOS17小组件有4个新的地方可以放置分别是:Mac桌面、iPad锁屏界面、 iPhone Standby模式、watch的smart stack Transition to content margins iOS17中苹果为widget新增了Content margin, 使widget的内容能够距离边缘有一定的间隙,确保内容显示完整。这…...
计网第四章(网络层)(一)
前面学习了数据链路层,我们可以实现一个网络的内部通信,可是要把这些网络互连起来形成更大的互连网,就需要用网络层互联设备路由器。而有了路由器的参与,就有不同网络、跨网络的概念诞生。 这时候我想大家也能理解为什么叫网络层…...
【前端】vue3 接入antdv表单校验
1/🍕背景 1、表单校验是非常常见的需求,能够有效的拦截大部分的错误数据,提升效率。 2、快速的给使用者提示和反馈,用户体验感非常好。 3、成熟的表单校验框架,开发效率高,bug少。 最近使用的是vue3antdv的…...
CY3-COOH在蛋白质定位的特点1251915-29-3星戈瑞
欢迎来到星戈瑞荧光stargraydye!小编带您盘点: CY3-COOH是一种橙红色荧光标记试剂,可以用于蛋白质定位研究。**以下是CY3-COOH在蛋白质定位的特点和应用: 细胞定位:**将CY3-COOH标记到特定蛋白质上,可以…...
数据采集:selenium 获取某网站CDN 商家排名信息
写在前面 工作中遇到,简单整理理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大…...
5.从头跑一个pipeline
1.安装torch pip install torchvision torch PyTorch的torchvision.models模块中自带的很多预定义模型。torchvision 是PyTorch的一个官方库,专门用于处理计算机视觉任务。在这个库中,可以找到许多常用的卷积神经网络模型,包括ResNet、VGG、…...
leetcode原题: 堆箱子(动态规划实现)
题目: 给你一堆n个箱子,箱子宽 wi、深 di、高 hi。箱子不能翻转,将箱子堆起来时,下面箱子的宽度、高度和深度必须大于上面的箱子。实现一种方法,搭出最高的一堆箱子。箱堆的高度为每个箱子高度的总和。 输入使用数组…...
Java中数组和集合的对比,以及什么情况下使用数组更合适,什么情况下使用集合更合适。集合的基本介绍和集合体系图。
在Java中,数组和集合(Java集合框架)都用于存储多个元素。它们各自有不同的特点和适用场景。下面我会对数组和集合进行对比,并解释何时使用集合更好,以及何时使用数组更合适。 数组和集合的对比: 数组&…...
STM32之17.PWM脉冲宽度调制
一LED0脉冲宽度调制在TIM14_CHI,先将LED(PF9)代码配置为AF推挽输出模式,将PF9引脚连接到TIM14, #include <stm32f4xx.h>static GPIO_InitTypeDef GPIO_InitStruct;void Led_init(void) {//打开端口F的硬件时钟&a…...
VS2015打开Qt的pro项目文件 报错
QT报错:Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set 解决方法: 找到本机安装的QT路径,找到“msvc-version.conf”文件,用记事本打开, 在其中添加版本“QMAKE_MSC_VER 1900”保存即可。 …...
骨传导耳机会头疼吗?骨传导耳机会对身体不好吗
一般情况下,骨传导耳机不会引起头疼。由于骨传导耳机的工作原理是通过将声音传导到颞骨和耳部周围的骨骼来传达音频信号,而不是直接进入耳道,因此不会对耳朵造成压力或产生耳疼的感觉。 然而,每个人的感受和体验可能不同ÿ…...
【面试题系列】(一)
Redis有哪些数据结构?其底层是怎么实现的? Redis 系列(一):深入了解 Redis 数据类型和底层数据结构 字符串(String): 用于存储文本或二进制数据。可以执行字符串的基本操作…...
vscode C++17便捷配置教程(懒人版)
环境链接 以上是已经配置好的c17环境链接,直接下载解压即可(注意文件路径上不要带有中文) 下载解压之后按照msys64-mingw64-bin路径打开 然后单击该路径右方空白区域可直接复制路径 然后点击开始菜单搜索“环境变量“并打开(如…...
动态数组实现链地址法哈希表
通常情况下哈希函数的输入空间远大于输出空间,因此理论上哈希冲突是不可避免的。比如,输入空间为全体整数,输出空间为数组容量大小,则必然有多个整数映射至同一数组索引。 解决哈希冲突方法常见有:链地址法、开放寻址…...
Eclipse(STS):pom.xml 报错:Multiple markers at this line
pom.xml 报错:Multiple markers at this line STS中,项目能够正常运行,但是 pom.xml 报错:Multiple markers at this line 项目本身没有任何修改,之前不报错的,突然报错了。 Multiple markers at this li…...
CSerialPort教程4.3.x (3) - CSerialPort在MFC中的使用
CSerialPort教程4.3.x (3) - CSerialPort在MFC中的使用 环境: 系统:windows 10 64位 编译器:Visual Studio 2008前言 CSerialPort项目是一个基于C/C的轻量级开源跨平台串口类库,可以轻松实现跨平台多操作系统的串口读写&#x…...
2022版 的IDEA创建一个maven项目(超详细)
一.设置idea中指定的maven的位置以及本地存储仓库 开发中一般我们使用自己下载的maven,不使用IDEA工具自带的,这就需要将我们下载的maven配置到IDEA工具中,配置如下图所示: 或者直接 快捷键 CtrlAltS 直接进入设置 maven home pa…...
lvs实现DR模型搭建
目录 一,实现DR模型搭建 1, 负载调度器配置 1.1调整ARP参数 1.2 配置虚拟IP地址重启网卡 1.3 安装ipvsadm 1.4 加载ip_vs模块 1.5 启动ipvsadm服务 1.6 配置负载分配策略 1.7 保存策略 2, web节点配置 1.1 调整ARP参数 1.2 配置虚拟I…...
设计模式之迭代器模式(Iterator)的C++实现
1、迭代器模式的提出 在软件开发过程中,操作的集合对象内部结构常常变化,在访问这些对象元素的同时,也要保证对象内部的封装性。迭代器模式提供了一种利用面向对象的遍历方法来遍历对象元素。迭代器模式通过抽象一个迭代器类,不同…...
【0基础入门Python Web笔记】二、python 之逻辑运算和制流程语句
二、python 之逻辑运算和制流程语句 逻辑运算控制流程语句条件语句(if语句)循环结构(for循环、while循环)continue、break和pass关键字控制流程语句的嵌套以及elif 更多实战项目可进入下方官网 逻辑运算 Python提供基本的逻辑运算…...
容器——Docker
1.安装docker服务,配置镜像加速器 2.下载系统镜像(Ubuntu、 centos) 3.基于下载的镜像创建两个容器 (容器名一个为自己名字全拼,一个为首名字字母) 4.容器的启动、 停止及重启操作 5.怎么查看正在运行的容器…...
SQL注入之宽字节注入
文章目录 宽字节注入是什么?注入练习让转义符失效联合查询 代码审计 宽字节注入是什么? 宽字节注入准确来说不是注入手法,而是另外一种比较特殊的情况。宽字节注入的目的是绕过单双引号转义。 宽字节注入是一种绕过单双引号转义的手段&#x…...
MyBatis动态sql
文章目录 一、MyBatis动态sql1.1 概述1.2 if元素1.3 foreach元素 二、模糊查询2.1 使用#{字段名}2.2 使用${字段名}2.3 使用concat{%,#{字段名},%}2.4 mybatis中#与$的区别 三、MyBatis结果映射3.1 区别3.2 应用场景 一、MyBatis动态sql 1.1 概述 MyBatis是一个Java持久化框架…...
L1-032 Left-pad 测试点全过
题目 根据新浪微博上的消息,有一位开发者不满NPM(Node Package Manager)的做法,收回了自己的开源代码,其中包括一个叫left-pad的模块,就是这个模块把javascript里面的React/Babel干瘫痪了。这是个什么样的…...
网联科技网站建设/我要软文网
<题目链接> 题目大意: 有N头牛,F种食物,D种饮料,每一头牛都有自己喜欢的食物和饮料,且每一种食物和饮料都只有一份,让你分配这些食物和饮料,问最多能使多少头牛同时获得自己喜欢的食物和饮…...
好用网站推荐/线上电脑培训班
Object的hasOwnProperty()方法返回一个布尔值,判断对象是否包含特定的自身(非继承)属性。 判断自身属性是否存在 var o new Object(); o.prop exists;function changeO() {o.newprop o.prop;delete o.prop; }o.hasOwnProperty(prop); /…...
武汉做网站哪家公司好/百度seo什么意思
我们一般学习某个知识,一定会现有个较为复杂的配置让你理解其中的关系,这个配置清晰规整,但是可能会需要大量的配置,这个时候就会有约定大于配置的理论实现了,通过我们约定好的一致的名称,我可以少写很多对…...
长沙银狐做网站/营销型企业网站建设的内容
1. newman?report? 1.1 newman是什么 newman时一款基于Node.js开发的可以运行postman的工具,使用Newman可以直接从命令行运行postman集合。更多介绍可以参看这里。 1.2 reporter是什么 reporter决定了newman输出的形式,不同的repoter以不…...
个人直播网站怎么做/网站推广计划方案
外键解释 Navicat设置外键时 设置外键的界面,一共有七列。简单介绍一下这几列的意思。 ‘name’:可以不填,你一会保存成功系统会自动生成。 ‘FieldName’:就是你要把哪个键设置为外键。这里选择‘parent_dept_id’ ‘Reference DadaBase’:外键关…...
网站做cdn/企业推广方法
文章转自:http://usejava.iteye.com/blog/588389 1、将jad.exe解压到指定目录。如:c:\java\jad2、将jadeclipse插件net.sf.jadclipse_3.3.0.jar 拷贝到myeclipse安装目录\Genuitec\Common\plugins\目录下。3、在myeclipse安装目录下dropins/创建eclipse文件夹&#…...