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

文章目录

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

函数

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

定义&使用

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

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


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

注意:

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

function 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都是统计的对应实参的数量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/89314.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测

时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测 目录 时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化卷积双向门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab实现SO-CNN-BiGRU蛇群算法优化…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 四)

Observed装饰器和ObjectLink装饰器&#xff1a;嵌套类对象属性变化 上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数…

1.1 VMware Workstation与Kali的安装和配置1

资源见专栏第一篇文章https://blog.csdn.net/algorithmyyds/article/details/132457258 安装VMware 不多加赘述&#xff0c;直接按顺序安装即可。 有以下需注意的地方&#xff1a; 1.建议选择增强型服务&#xff1b; 2.不要加入体验改进计划。是否开启提示更新看你的想法&…

MySQL数据的导入导出mysqldump、mysqlimport into outfile和load data

0、概述 MySQL数据的导入导出方案通常是配套的&#xff0c;例如&#xff1a; 方案一&#xff1a;使用mysqldump导出数据&#xff0c;再使用mysql客户端导入数据 方案二&#xff1a;使用SELECT INTO OUTFILE命令导出数据&#xff0c;再使用LOAD DATA或mysqlimport导入数据 方案…

Tokenview再度升级:全新Web3开发者APIs数据服务体验!

Tokenview发布全新版本的区块链APIs和数据服务平台&#xff0c;为开发者打造更强大、更便捷的开发体验&#xff01; 此次升级&#xff0c;我们整合了开发者使用习惯以及Tokenview产品优势。我们深知对于开发者来说&#xff0c;时间是非常宝贵的&#xff0c;因此我们努力提供一…

概率论与数理统计:第六章:数理统计

文章目录 Ch6. 数理统计(一) 总体与样本(二) 统计量 (5个)2.5个常用统计量3.矩的概念 (三) 抽样分布 (3个)0.上α分位点1.χ分布2.t分布3.F分布 (四) 抽样分布定理1.单个正态总体2.两个正态总体 Ch6. 数理统计 (一) 总体与样本 1.概念&#xff1a; (1)总体 (2)样本 简单随机…

利用“病毒制造机”实现脚本病毒的制造

一、脚本病毒的概念&#xff1a; 脚本病毒通常是 JavaScript 或 VBScript 等语言编写的恶意代码&#xff0c;一般广告性质&#xff0c;会修改 IE 首页、修改注册表等信息&#xff0c;对用户计算机造成破坏。 通过网页进行的传播的病毒较为典型&#xff0c;脚本病毒还会有如下前…

大模型+学习机,是概念游戏还是双向奔赴?

众所周知&#xff0c;2023年上半年大模型概念炙手可热。各大科技公司纷纷卷入&#xff0c;或宣称布局相关领域&#xff0c;或率先官宣自研大模型。而随着资本市场对大模型概念的热情有所消退&#xff0c;属于这片战场的新一轮角逐慢慢聚焦在了技术的落地应用上。 8月15日&#…

基于XL32F003单片机的可控硅调光方案

可控硅调光是一种用于调节电源输出电压的技术&#xff0c;被广泛应用于各种场景。它主要通过改变波形的导通角度来调节输出电压的大小&#xff0c;从而实现对照明设备亮度的控制。在照明市场占据了很大的调光市场。 可控硅调光的兼容性强&#xff0c;应用范围广。例如&#xff…

Flink、Yarn架构,以Flink on Yarn部署原理详解

Flink、Yarn架构&#xff0c;以Flink on Yarn部署原理详解 Flink 架构概览 Apache Flink是一个开源的分布式流处理框架&#xff0c;它可以处理实时数据流和批处理数据。Flink的架构原理是其实现的基础&#xff0c;架构原理可以分为以下四个部分&#xff1a;JobManager、TaskM…

【RuoYi移动端】uniApp导入和引用uView2.0插件

一、打开uiew官网 安装 | uView 2.0 - 全面兼容 nvue 的 uni-app 生态框架 - uni-app UI 框架uView UI&#xff0c;是 uni-app 生态最优秀的 UI 框架&#xff0c;全面的组件和便捷的工具会让您信手拈来&#xff0c;如鱼得水https://uviewui.com/components/install.html 也可直…

数据库类型

文章目录 数据库的类型1. 关系型数据库2. 非关系型数据库NOSQL3. 常见的关系型数据库3.1 Oracle3.2 DB23.3 SQL Server3.4 MySQL 数据库的类型 主要分为四大类&#xff1a; 一&#xff1a;关系型数据库。 二&#xff1a;非关系型数据库。 三&#xff1a;网状数据库。 四&#…

ArcGIS Serve Windows下用户密码变更导致Server服务无法启动问题

问题&#xff1a; 因未知原因Windows下的Server安装账户密码变更&#xff0c;但是又忘记了密码&#xff0c;导致&#xff0c;Server服务启动失败&#xff0c;错误1069&#xff1a; 解决方法&#xff1a; 在账户管理界面&#xff0c;重置对应的arcgis账户的密码&#xff0c;…

融合算法综述

融合算法 前言一、概念二、原理三、融合的先决条件四、融合分类4.1、前融合和后融合4.2 、数据级融合、特征级融合和决策级融合 五、典型融合算法 多传感器信息融合&#xff08;Multi-sensor Information Fusion,MSIF&#xff09;&#xff1a;利用计算机技术将来自多传感器或多…

网深科技与中科方德完成兼容性认证

网深科技的产品NetInside可观测性分析平台与国产中科方德主流操作系统完成兼容性适配&#xff0c;系统名称&#xff1a;方德高可信服务器操作系统V4.0&#xff0c;系统运行稳定&#xff0c;性能卓越&#xff0c;完美兼容&#xff0c;能够为广大用户提供灵活、专业、直观可视性&…

[网络架构]Self-organized operational neural networks (SelfONN)

Self-organized operational neural networks (SelfONN 背景CNNONNSelfONNCNN, ONN&#xff0c; SelfONN对比SelfONN与CNN的关系总结相关资源References 背景 本节要分享的是SelfONN, SelfONN可以看作是ONN的优化/升级&#xff0c; 而ONN可以看作是更一般化的CNN&#xff0c; …

Azure文件共享

什么是Azure文件共享 Azure文件共享是一种在云中存储和访问文件的服务。它允许用户在不同的计算机、虚拟机和服务之间共享数据&#xff0c;并在应用程序中进行访问、修改和管理。 Azure文件共享可以用于各种用途&#xff0c;例如&#xff1a; 共享文件资源给多个虚拟机或服务…

laravel aws s3

由于公司有境外项目&#xff0c;服务器、文件存储都是用的亚马逊&#xff0c;真真地是没有用过&#xff0c;在此记录一下自己的s3研究结果 Laravel - aws - s3 第一步创建用户&#xff0c;生成秘钥&#xff1a; 第二步创建存储桶&#xff1a; 1、创建存储桶时&#xff0c;以下…

人工智能如何颠覆和改变信息安全格局

当谈及网络信息安全领域&#xff0c;人工智能&#xff08;AI&#xff09;正扮演着关键的角色。其作用是分析庞大的风险数据&#xff0c;以及企业信息系统中不同威胁之间的关联&#xff0c;从而识别出全新类型的攻击方式。这一过程的成果为各类网络安全团队提供了重要情报&#…

shell学习

shell是什么&#xff1f; shell是一块包裹着系统核心的壳&#xff0c;处于操作系统的最外层&#xff0c;与用户直接对话&#xff0c;把用户的输入&#xff0c;解释给操作系统&#xff0c;然后处理操作系统的输出结果&#xff0c;输出到屏幕给用户看到结果。 什么是shell脚本…