Jadual Kandungan
本节讲解的内容
前言
函数的概念
函数的分类
函数的变量问题
全局变量和局部变量
函数的参数讨论
参数的值传递和引用传递
内部函数
可变函数
匿名函数
回调函数
函数的递归调用
总结
Rumah pembangunan bahagian belakang tutorial php PHP基础教程五之函数

PHP基础教程五之函数

Mar 01, 2017 am 09:38 AM


本节讲解的内容

  • 函数的概念

  • 函数的分类

  • 函数的变量问题

  • 函数的参数讨论

  • 内部函数

  • 可变函数

  • 匿名函数

  • 函数的递归调用

前言


在PHP开发中,我们有时候会使用到大量的函数,那什么是函数,作用又是什么?函数的出现可以说初次引出了封装的概念,函数的使用可以使我们的代码不那么冗余,同时函数的定义可以上我们快速的滤清思路。提高代码的复用性,同时有利于模块化编程。

函数的概念

当我们在编程中,有这样一个需求,需要对一个功能进行统一的整合,以便于在别的地方使用这个功能的时候不用在编写一次(减少冗余性),只需要调用特定的代码就能实现。用现成的技术,我们很难实现这种需求,这时就需要使用到函数这个知识。

函数:为完成某一功能的程序指令(语句)的集合,一般一个函数最好只完成一个功能,降低代码的耦合度。

有时候我们把函数称之为方法,它们两个是一个概念。

函数的分类

几乎每种编程语言的函数都分为两种:

  • 自定义函数

  • 系统函数

自定义函数:
自定义函数就是我们自己根据自己的具体需求自己定义的函数,函数中的功能需要自己去实现。

自定义函数的语法规则:

function 方法名(形参列表){
    实现某种功能的代码;
    return 返回值(可以没有返回值,这个看需求)
}
Salin selepas log masuk

解释:

  1. function是一个关键字,如果想定义一个函数必须写function

  2. 方法名是自己定义的,这个名字你可以随意起,但是一般我们应该起有意义的名字,比如说这个函数要实现什么功能的缩写。

  3. 形参列表,当我们调用函数的时候,有时候需要传递给函数一些参数(也就是变量),在函数中进行操作,这个形参列表就是接受我们调用时传过来的参数,当然可以有多个。

  4. 在PHP中函数体是需要大括号包裹起来的,里面写我们的代码。

  5. return就是返回的意思,当我们调用函数后,有时候需要函数向我们返回一个结果,比如函数的功能是计算两个数的和,这时候当函数通过进行加法运算后,我们可以写return返回计算后的结果,当然有没有返回值需要看函数的具体功能是什么,需不需要返回结果。

函数名的命名规则:
函数名和 PHP 中的其它标识符命名规则相同。有效的函数名以字母或下划线打头,后面跟字母,数字或下划线。
我们在写函数是一般的命名规范是驼峰式命名法,也就是第二个单词的首字母大写。

示例:

<?php

$a = 12;
$b = 6;

function sum($num1,$num2){//这两个参数就是接受我们调用时传过来的参数

    $res = $num1 + $num2;

    return $res; //计算完两个数的和,返回给调用者。
}

$sum = sum($a,$b); //调用函数,在这里我们会传过去两个参数,同时返回结果用$sum接收。

echo $sum;
Salin selepas log masuk

系统函数:

系统函数就是也是函数的一种,是系统已经封装好的函数,系统函数有好多,不同的函数有不同的功能,我们可以根据自己的需求选取不同的函数。

在帮助文档中我们可以查询到我们经常使用的数学函数:

  1. abs — 绝对值

  2. ceil — 进一法取整

  3. decbin — 十进制转换为二进制

  4. dechex — 十进制转换为十六进制

  5. decoct — 十进制转换为八进制

  6. max — 找出最大值

  7. min — 找出最小值

  8. pow — 指数表达式

  9. rand — 产生一个随机整数

  10. round — 对浮点数进行四舍五入

  11. sqrt — 平方根

向我们有时使用的var_dump()输出类型就是系统函数。

系统函数使用到的时候可以查看帮助文档。

函数的变量问题

全局变量和局部变量

局部变量:

在函数中我们在处理数据中,可能会定义一些变量,这些在函数中定义的变量我们称之为局部变量,局部:顾名思义,就是在函数中使用的变量。

<?php

$a = 12;
$b = 6;

function sum($num1,$num2){

    $res = $num1 + $num2; //定义了一个变量用来存储两个数的和。

    return $res; 
}

$sum = sum($a,$b);
echo $res; //尝试在函数外进行输出。
echo $sum;
.....结果.....
Notice: Undefined variable: res in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\yusuanfu.php on line 14
18
Salin selepas log masuk

可以看到当尝试在函数外使用函数内的变量的时候,就会报错。

全局变量:

在上面的代码中我们可以看到在函数外,我们定义两个变量,

b,这种在函数外定义的变量我们称之为全局变量。那么全局变量能不能再函数内使用呢?


<?php

$a = 12;
$b = 6;

function sum($num1,$num2){

    $res = $num1 + $num2;

    echo $a;//在函数内输出函数外的变量。

    return $res; 
}

$sum = sum($a,$b);
echo $sum;
.....结果.....
Notice: Undefined variable: a in D:\mywamp\Apache24\htdocs\zendstudio\yunsuanfu\yusuanfu.php on line 10
Salin selepas log masuk

可以看到,在函数内使用函数外的全局变量时,提示错误。

全局变量称为全局,那怎么在函数内使用呢?答案很简单,只需要在函数中用关键字声明一下就行了。

<?php

$a = 12;
$b = 6;

function sum($num1,$num2){

    $res = $num1 + $num2;

    global $a;//在函数内输出函数外的变量。
    echo $a;
    return $res; 
}

$sum = sum($a,$b);
.....结果.....
12
Salin selepas log masuk

在函数中利用global这个关键字进行声明,便是需要使用全局变量$a,在这里不得不说一下函数的调用在内存中的变化。

函数的调用过程大致图:
这里写图片描述

我们的代码都是在栈(也就是内存中)中运行的。在栈中通过一行行的执行代码,进行解析,在运行的时候有一个存放我们数据的区域,叫数据区。当定义变量的时候,在数据区就会生成一个数据区,存放自己定义的变量。

当代码执行到调用函数的时候,系统就会在栈中重新开辟一个栈区,并在这个新栈中执行函数(每执行一个函数就会开辟一个新栈),当在函数中创建对象的时候,就会在数据区重新定义一个区域用来存放函数中的变量。这就是在函数外不能使用函数内变量的原因。它们两个是两个不同的区域。

但是当我们声明了global的时候,系统就不会在函数自己的数据区建立一个变量,而是会去函数外部的数据区,尝试寻找用global定义的变量。但是当外部的数据区没有我们用global定义的变量的时候,就会自动的在外部的数据区定义一个变量,使其成为全局变量。

<?php

$b = 6;

function sum($num1){

    global $a;//在函数内通过global定义一个外部没有的变量。
    $a = 23; //在函数内进行赋值。
}

$sum = sum($b);
echo $a; //直接使用函数内的变量。
.....结果.....
23
Salin selepas log masuk

上面的$a在外部没有定义

函数的参数讨论

我们在调用函数的时候经常会去传过去参数,而在函数上我们也定义了参数进行接受。调用函数时传的参数称为实际参数(实参),而函数接受的参数称为形式参数(形参),它两个是没有影响的,定义时名字一样也是可以的,但是一定要对应,不能出现调用时传过去两个参数,接收时一个参数。

函数的参数是允许有默认值的,也就是当我们没有传过去数值时,它使用默认值,但是当我们传过去有值的时候,使用我们传过去的值。

使用默认的:

<?php

$a = 3;
$b = 6;
function sum($a,$b,$oper = &#39;+&#39;){ //形参和实参名字可以使一样的。

    if($oper == &#39;+&#39;){ 
        echo $a + $b; //使用默认的加
    }else if($oper == &#39;-&#39;){
        echo $a - $b;
    }
}

$sum = sum($a,$b); //只传进去两个参数,运算符使用默认的情况。
.....结果.....
9
Salin selepas log masuk

可以看到它并没有报错,同时$oper使用了默认的值+;

使用传过去的:

<?php

$a = 3;
$b = 6;
function sum($a,$b,$oper = &#39;+&#39;){ //形参和实参名字可以使一样的。

    if($oper == &#39;+&#39;){ 
        echo $a + $b; 
    }else if($oper == &#39;-&#39;){
        echo $a - $b;//使用传过来的加
    }
}

$sum = sum($a,$b,&#39;-&#39;); //传过去三个参数。
Salin selepas log masuk

参数的值传递和引用传递

在函数的调用中,参数的传递有两种方式:

  • 值传递

  • 引用传递

值传递

当我们在调用函数,传递参数后在函数中进行修改,而在函数外再次使用,还是修改前的值,可以看代码:

<?php

$a = 12;
function setA($a){ 
    $a = $a * 12; //把$a的值乘以12;
}

setA($a);//调用函数
echo $a;
.....结果.....
12
Salin selepas log masuk

这种传递方式我们为值传递,默认情况下,函数参数通过值传递(因而即使在函数内部改变参数的值,它并不会改变函数外部的值)。如果希望允许函数修改它的参数值,必须通过引用传递参数。

引用参数

有时我们希望我们传进去的值,在没有返回的情况下,直接进行修改,这是就需要用到引用传递。

<?php

$a = 12;
function setA(&$a){  //只是在前面加了一个取地址符号。
    $a = $a * 12; //把$a的值乘以12;
    //函数没有返回值
}

setA($a);//调用函数
echo $a;
.....结果.....
144
Salin selepas log masuk

在上面的代码中只是在函数中添加了一个取地址符&,学过C语言的都知道,在C语言中使用&直接进行地址的传递。这就表示它在函数中的数据,会指向外边的变量。
这里写图片描述

内部函数

内部函数: 函数内部可以申明函数,供函数内部使用,称为内部函数
,比如某位程序员为防止他人调用,可以使用内部函数。

<?php

$a = 12;
$b = 6;

function calculator($a,$b){
    function sum($a,$b){ //在函数内部定义一个函数,
        return $a + $b;
    }
    function subtract($a,$b){
        return $a - $b;
    }
    return sum($a,$b); // 调用自己定义的函数,把传进来的两个值直接传过去。
}

echo calculator($a,$b); //调用函数,对返回结果直接进行输出。
.....结果.....
18
Salin selepas log masuk

其实内部函数也是可以在函数外边使用的,就像上面的代码, 如果我们没有执行 calcuator, 就去调用内部函数 sum() ,就会报错。但是如果我们执行过 calculator 则,我们也可以使用内部函数了.

<?php

$a = 12;
$b = 6;

function calculator($a,$b){
    function sum($a,$b){ //在函数内部定义一个函数,
        return $a + $b;
    }
    function subtract($a,$b){
        return $a - $b;
    }
}

calculator($a,$b); //调用函数
echo sum($a,$b); //当上面的调用过之后才能这样调用,不然会出错。
.....结果.....
18
Salin selepas log masuk

当调用过calcuator,可以理解为内存中有函数内的这两个函数,然后接着调用函数内的函数,就不会出错。

可变函数

可变函数: PHP 支持可变函数的概念。这意味着如果一个变量名后有圆括号,PHP 将寻找与变量的值同名的函数,并且尝试执行它。可变函数可以用来实现包括回调函数,函数表在内的一些用途。

看代码可以比较清晰的理解什么是可变函数。

<?php

$a = 12;
$b = 6;

function add($a,$b){
    $res = $a + $b;
    echo $res;
}

$fun_name = &#39;add&#39;;//定义一个变量,这个变量的名字是函数的函数名。

$fun_name($a,$b); //把变量当成一个函数名
.....结果.....
18
Salin selepas log masuk

我们在回调函数中会使用到这种方式。
案列:

<?php

$a = 6;
$b = 6;

function getVal($a,$b,$fun_name){ //第三个参数是一个函数的名字。
    return $fun_name($a,$b); //如果一个变量名后有圆括号,寻找与变量的值同名的函数,并且尝试执行它。
}

function sum($a,$b){ //在getVal中实际上调用的就是这个函数。
    return $a + $b;
}

echo getVal($a,$b,&#39;sum&#39;);
.....结果.....
12
Salin selepas log masuk

在上面把一个函数的名字当成变量进行传递。

匿名函数

匿名函数: 匿名函数,也叫闭包函数,允许临时创建一个没有指定名称的函数。最经常用作回调函数参数的值。当然,也有其它应用的情况. 简单的理解就是 匿名函数就是没有名字的函数。

<?php

$a = 6;
$b = 16;

function getVal($a,$b,$fun_name){ 
    return $fun_name($a,$b); 
}

echo getVal($a,$b,function($a,$b){ //在传递的时候临时的定义一个匿名函数,没有名字,只有关键字function。
    return $a + $b;
});
.....结果.....
22
Salin selepas log masuk

回调函数

上面的代码其实也是一个回调函数。匿名函数当作回调函数来调用。

回调函数简单的理解是:你调用了某个函数,而这个函数(A)内又会调用一个由你实现的另一个函数(B),那么这个另一个函数(B)就是所谓的回调函数,所以,一般来说,你只是不直接去调用罢了。

函数的递归调用

递归直白的说就是自己调用自己,比如函数自己调用自己,递归是一种算法,它的专业说法是:

递归通过把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大的减少了程序的代码量。

我们在这里只是简单的讨论一下,不做过多的深入。

示例:

<?php

function abc($n){
    if($n > 2){
        abc(--$n); //进行自己调用自己。
    }
    echo &#39;$n的值是&#39; . $n . &#39;<br>&#39;;
}

abc(4);
.....结果.....
2 2 3
Salin selepas log masuk

看到结果可能一时没有反应过来。但是如果画图就好理解了。
这里写图片描述

函数的递归需要满足几个条件:
- 基准情形。必须总要有某些基准条件,它无需递归就能解出
- 不断推进。对于那些需要递归的求解的情形,每一次递归调用都必须要使状况朝向一种基准情形推进

总结

上面的讲解的基本上是函数的基本应用,想要熟悉的掌握函数的应用,只用多练,多想。同时,不知道有没有发现,本节的函数都是写在一个文件里面的,但是有时我们写的函数是在另外一个文件,这时就不能再另外一个文件直接使用,上面的所有功能都不能使用,作为PHP程序员,你必须要知道,必然有一种方法能解决这种问题,恩,确实能解决,include和require。

 以上就是PHP基础教程五之函数的内容,更多相关内容请关注PHP中文网(www.php.cn)!


Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
2 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Repo: Cara menghidupkan semula rakan sepasukan
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Cara mendapatkan biji gergasi
4 minggu yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Konfigurasi Projek CakePHP Konfigurasi Projek CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan memahami Pembolehubah Persekitaran, Konfigurasi Umum, Konfigurasi Pangkalan Data dan Konfigurasi E-mel dalam CakePHP.

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Tarikh dan Masa CakePHP Tarikh dan Masa CakePHP Sep 10, 2024 pm 05:27 PM

Untuk bekerja dengan tarikh dan masa dalam cakephp4, kami akan menggunakan kelas FrozenTime yang tersedia.

Muat naik Fail CakePHP Muat naik Fail CakePHP Sep 10, 2024 pm 05:27 PM

Untuk mengusahakan muat naik fail, kami akan menggunakan pembantu borang. Di sini, adalah contoh untuk muat naik fail.

Penghalaan CakePHP Penghalaan CakePHP Sep 10, 2024 pm 05:25 PM

Dalam bab ini, kita akan mempelajari topik berikut yang berkaitan dengan penghalaan ?

Bincangkan CakePHP Bincangkan CakePHP Sep 10, 2024 pm 05:28 PM

CakePHP ialah rangka kerja sumber terbuka untuk PHP. Ia bertujuan untuk menjadikan pembangunan, penggunaan dan penyelenggaraan aplikasi lebih mudah. CakePHP adalah berdasarkan seni bina seperti MVC yang berkuasa dan mudah difahami. Model, Pandangan dan Pengawal gu

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Pengesah Mencipta CakePHP Pengesah Mencipta CakePHP Sep 10, 2024 pm 05:26 PM

Pengesah boleh dibuat dengan menambah dua baris berikut dalam pengawal.

See all articles