php学习笔记-php自定义函数-day05

简介: 本文介绍了PHP自定义函数的创建、调用、参数赋值以及作用域和生命周期,还探讨了`global`和`static`关键字的使用,以及`return`、`exit`和`die`的不同用法。

php函数

php函数包括三种类型,内置函数,自定义函数,变量函数。

内置函数,即php内部提供的原生的,预定义好的,直接可调用使用的函数。

自定义函数,程序员自定义的函数,定义声明后才可使用。

变量函数,变量函数类似可变变量,变量函数的函数名为一个变量。(有点和js函数一样的感觉)

1.自定义函数

自定义函数格式:

    function functionName($param1,$param2,$param3,...$paramn=defaultValue){
   
        函数体
        return 返回值;
    }

其中 function ,是用来定义自定义函数的关键字,不区分大小写。functionName ,是自定义的函数名。$param是定义函数的形参。defaultValue,函数参数的默认值。 函数体,是函数功能的实现,在函数被调用时执行的语句块。return 即为返回值,其返回值可以是任意一种数据类型,函数可以没有返回值,这个需要自定义的功能来看

2.自定义函数的声明和调用

2.1 同文件调用自定义函数

在同文件中调用已经定义好的函数,直接使用函数名调用即可。

无参无返回值自定义函数示例 sayHello():

    //定义函数sayHello,它的功能是输出一句hello
    function sayHello(){
   
        echo "hello"."\n";// hello
    }
    // 在同文件中调用直接使用函数名调用即可
    sayHello();

有参有返回值自定义函数示例 sum():

    function sum($a,$b){
   
        return floatval($a+$b);//因为函数体比较简单,直接使用return关键字返回计算结果即可
    }

    $end =  sum(2,3);
    echo $end;// 5

2.2 跨文件调用自定义函数

通常,我们定义一个某种特定的功能函数,会被整个php程序频繁的调用,而且很多情况是跨文件调用。

跨文件调用,需要了解几个php语言结构(提供php文件间的相互引用功能,提高代码的重用性)。

include ,require 语言结构

include 语言结构的语法格式 : mixed include ( string resource)
include 语言结构的功能 : include语言结构将一个资源文件 resource 载入到当前的php程序中, resource是一个资源文件的文件名。若找不到resource对应的文件则返回false,找到resource文件且其没有返回值时,include返回整数1,若resource有返回值,则include返回其返回值。
tip:(资源文件可以是php本地服务器的图片,html,php页面等,也可以是互联网上的资源(使用互联网上的资源,需要将php.ini配置文件中的allow_url_include设置为on,表示开启允许载入互联网资源)。

require 语言结构的语法格式 : mixed require ( string resource)
require 语言结构的功能 : 与上面的include基本一致,唯一的区别就是,include语言结构载入文件,如果出现错误后会提示错误信息然后继续执行;而require语言结构载入文件,如果出现错误后会提示错误信息然后停止执行

跨文件使用自定义函数例子:

先写一个untils.php,用来被其他php文件调用:

    <?php
    // 这里只为了演示跨文件调用功能,函数写的很简陋

    function sum($a,$b){
   
        return intval($a+$b);
    }

    function sub($a,$b){
   
        return intval($a-$b);
    }

    function mul($a,$b){
   
        return intval($a*$b);
    }

    function div($a,$b){
   
        return intval($a/$b);
    }

    ?>

创建一个 main1.php 并且 使用 include 语言结构将 untils.php 载入:

    // 使用include语言结构,引入刚刚写的自定义工具函数php文件 untils.php
    include("untils.php");
    echo sum(1,2)."\n";//3
    echo sub(1,1)."\n";//0
    echo mul(1,2)."\n";//2
    echo div(2,2)."\n";//1
    // 故意设置一个错误的资源文件,查看输出
    include "untils1.php";// Warning: include(untils1.php): failed to open stream: No such file or directory
    echo "include语言结构载入文件错误时,会会提示错误信息,并且继续执行剩下的代码~~~~";

创建一个 main2.php 并且 使用 require 语言结构将 untils.php 载入:

    // 使用require语言结构,引入刚刚写的自定义工具函数php文件 untils.php
    require("untils.php");
    echo sum(1,2)."\n";//3
    echo sub(1,1)."\n";//0
    echo mul(1,2)."\n";//2
    echo div(2,2)."\n";//1
    // 故意设置一个错误的资源文件,查看输出
    require "untils1.php";// Warning: include(untils1.php): failed to open stream: No such file or directory
    // 下面的这句输出不会显示 原因就是require的特点,遇到错误信息时,反馈错误信息后便停止运行
    echo "require 语言结构载入文件错误时,会提示错误信息,然后终止程序的运行~~~~";

include_once ,require_once 语言结构

include_once 和 require_once 这两种语言结构可以说是对上面的include和require的完善和补充。

因为随着程序规模的扩大,同一程序多次使用include或require来载入同一个资源文件,这样会导致资源文件混乱的问题,为了解决这个问题,便提出了 include_once ,require_once 语言结构,确保同一个资源文件只被引用一次

使用方法和上面的 include ,require 语言结构基本一样就不过多赘述。

2.3 自定义函数的参数赋值

自定义函数参数的赋值,也分为传值赋值和传地址赋值(与变量赋值和数组赋值一样)。

传值赋值,不会改变原有的值内容;而传地址赋值,会改变原有的值内容。

如下代码:

传值赋值:

    $a = 3;

    // 使用传值赋值,在不重新赋值的情况下,变量本身的值内容不会发生改变
    function add1($a){
   
        $a = intval($a+1);// 局部变量只在函数体内有效
        return $a;
    }

    echo add1($a)."\n";// 4

    echo $a; //3

传地址赋值:

    $a = 3;
    // 使用传地址赋值,原有的变量的值内容发生改变
    function add2(&$a){
   
        $a +=1;
        return  $a;
    }

    echo add2($a)."\n";// 4

    echo $a; //4

3.变量的作用域 及 生命周期

变量的作用域包括,全局变量和局部变量。(变量的作用域,取决于变量在php程序中的位置)。

  • 1.在函数内定义的变量(包括函数的参数)为局部变量,局部变量在调用函数结束后自动被回收释放。
  • 2.函数定义外的变量为全局变量,在当前的pphp程序中都可以访问到,当整个当前php程序被执行完毕后才会回收释放。

变量的生命周期也其实就是它的作用域,函数体内变量的生命周期就是从函数开始执行到函数执行完毕,而全局变量的生命周期就是当前php程序执行开始到执行完毕。

4.global 关键字 和 static 关键字

使用global关键字会将变量的作用域变为全局变量

global关键字用法的注意事项:

  • 1.不能使用global定义函数的参数
  • 2.在函数内使用global定义全局变量的同时,不能使用赋值语句给该变量赋值
  • 3.global可以一次性的定义多个全局变量。(global $a,$b,$c;
  • 4.在函数内使用global语句定义全局变量时,如程序已经存在该全局变量,则拿来直接使用,如果不存在则创建。
  • 5.经过global定义的全局变量,php会将该变量的定义放到$_GLOBALS数组中,数组的键该全局变量的变量名,数组的值为该全局变量的变量值。

static 关键字 可以将函数体内的变量从这次调用一直存活到下次调用。

static 关键字用法的注意事项:

  • 1.static主要用来修饰函数体内的变量,不能使用static定义函数的参数
  • 2.静态变量旨在php程序的当前执行有效,如果重新启动了程序,则一切又将重新开始。
  • 3.经static修饰的变量一般要进行初始化。
  • 4.static可以一次性的定义多个静态全局变量。(static $a,$b,$c;

5.return exit die

5.1 return

return是语言结构而不是函数。

如果一个函数中包含return 语句,当调用此函数时,函数的执行只会进行到return这一步,return之后的语句都不会执行,并将return的参数作为函数的值返回。

如果在全局范围中调用,则当前php文件中止运行。如果当前php文件是被 include 的或者 require 的,则控制交回调用文件。此外,如果当前php文件是被 include 的,则 return 的值会被当作 include 调用的返回值,相应的在主php文件中定义一个变量进行返回值的接收。
如果在主php文件中调用 return,则php程序中止运行。

5.2 exit()

输出一个消息并且退出当前脚本。

语法格式: void exit ([ string $status ] ) , void exit ( int $status )

如果 status 是一个字符串,在退出之前该函数会打印 status 。
如果 status 是一个 integer,该值会作为退出状态码,并且不会被打印输出。 退出状态码应该在范围0至254,不应使用被PHP保留的退出状态码255。 状态码0用于成功中止程序。
Note: PHP >= 4.2.0 当 status 是一个 integer,不会打印输出。

5.3 die()

关于die()的使用,官方文档给的是结构与die()一致。

5.4 三者比较

die与exit

手册上标明 "die — Equivalent to exit().This language construct is equivalent to exit().”
但在实际代码过程中可以存在一定的选择差别,例如这样:涉及到提前终止程序/脚本执行的情况,使用exit();当程序出错,为了停止执行并显示提示信息时,使用die()。

return与exit(或die)

如果在全局范围内调用exit()或return,它们产生影响是一样,即中止当前脚本运行,在其他范围内调用两者,return始终会返回值,不管当前文件被include/require。


相关文章
|
10天前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
6天前
|
机器学习/深度学习 算法 大数据
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
2024“华为杯”数学建模竞赛,对ABCDEF每个题进行详细的分析,涵盖风电场功率优化、WLAN网络吞吐量、磁性元件损耗建模、地理环境问题、高速公路应急车道启用和X射线脉冲星建模等多领域问题,解析了问题类型、专业和技能的需要。
2506 14
【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析
|
6天前
|
机器学习/深度学习 算法 数据可视化
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
2024年中国研究生数学建模竞赛C题聚焦磁性元件磁芯损耗建模。题目背景介绍了电能变换技术的发展与应用,强调磁性元件在功率变换器中的重要性。磁芯损耗受多种因素影响,现有模型难以精确预测。题目要求通过数据分析建立高精度磁芯损耗模型。具体任务包括励磁波形分类、修正斯坦麦茨方程、分析影响因素、构建预测模型及优化设计条件。涉及数据预处理、特征提取、机器学习及优化算法等技术。适合电气、材料、计算机等多个专业学生参与。
1519 14
【BetterBench博士】2024年中国研究生数学建模竞赛 C题:数据驱动下磁性元件的磁芯损耗建模 问题分析、数学模型、python 代码
|
8天前
|
编解码 JSON 自然语言处理
通义千问重磅开源Qwen2.5,性能超越Llama
击败Meta,阿里Qwen2.5再登全球开源大模型王座
531 13
|
1月前
|
运维 Cloud Native Devops
一线实战:运维人少,我们从 0 到 1 实践 DevOps 和云原生
上海经证科技有限公司为有效推进软件项目管理和开发工作,选择了阿里云云效作为 DevOps 解决方案。通过云效,实现了从 0 开始,到现在近百个微服务、数百条流水线与应用交付的全面覆盖,有效支撑了敏捷开发流程。
19282 30
|
1月前
|
人工智能 自然语言处理 搜索推荐
阿里云Elasticsearch AI搜索实践
本文介绍了阿里云 Elasticsearch 在AI 搜索方面的技术实践与探索。
18836 20
|
1月前
|
Rust Apache 对象存储
Apache Paimon V0.9最新进展
Apache Paimon V0.9 版本即将发布,此版本带来了多项新特性并解决了关键挑战。Paimon自2022年从Flink社区诞生以来迅速成长,已成为Apache顶级项目,并广泛应用于阿里集团内外的多家企业。
17524 13
Apache Paimon V0.9最新进展
|
8天前
|
人工智能 自动驾驶 机器人
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
过去22个月,AI发展速度超过任何历史时期,但我们依然还处于AGI变革的早期。生成式AI最大的想象力,绝不是在手机屏幕上做一两个新的超级app,而是接管数字世界,改变物理世界。
458 48
吴泳铭:AI最大的想象力不在手机屏幕,而是改变物理世界
|
1天前
|
云安全 存储 运维
叮咚!您有一份六大必做安全操作清单,请查收
云安全态势管理(CSPM)开启免费试用
355 4
叮咚!您有一份六大必做安全操作清单,请查收
|
2天前
|
存储 关系型数据库 分布式数据库
GraphRAG:基于PolarDB+通义千问+LangChain的知识图谱+大模型最佳实践
本文介绍了如何使用PolarDB、通义千问和LangChain搭建GraphRAG系统,结合知识图谱和向量检索提升问答质量。通过实例展示了单独使用向量检索和图检索的局限性,并通过图+向量联合搜索增强了问答准确性。PolarDB支持AGE图引擎和pgvector插件,实现图数据和向量数据的统一存储与检索,提升了RAG系统的性能和效果。