函数中的变量
局部变量
局部动态变量

局部动态变量执行完毕之后值立即释放

实例

<?php
function testa(){
    $a = 3;
    echo $a;
}
testa(); //3

局部静态变量

局部静态变量 通过 static 关键字声明的变量为静态变量,当第一次调用函数的时候相当于初始化静态变量,当函数执行完毕之后静态变量没有释放而是保存在静态内存中,当再次调用函数的时候首先从静态内存中取出变量的值继续执行。

实例

<?php
function testb(){
    static $b = 3;
    $b++;
    echo $b;
}
testb(); //4
testb(); //5
testb(); //6

TIPS
函数里的变量都是局部变量,它们只能在这个函数内部使用
全局变量
全局变量只要是在这个页面里就能使用,在函数体外声明的变量然后在函数体内通过 global 关键字声明的变量称为全局变量

实例

<?php
$a = 3;
$b = 4;
function testc(){
    global $a, $b;
    echo $a;
    echo $b;
}
testc(); //34

$name = 'xuxiaoke';
$email = '811637032@qq.com';
$age = 23;
echo $GLOBALS['name']; //xuxiaoke
echo $GLOBALS['email']; //811637032@qq.com
echo $GLOBALS['age']; //23

return
return()是语言结构而不是函数,仅在参数包含表达式时才需要用括号将其括起来。当返回一个变量时通常不用括号,这样可以降低PHP的负担。如果执行了return,则return 语句后面的内容将不会被执行了;

  1. return expression // 返回一个表达式结果
  2. return(expr) // 函数表达式
  3. return // 直接返回,或返回空值

实例

<?php
function a(){
     $b=1;
    return $b;
}
function b(){
    $b=1;
    echo $b;
}
echo a();  //  输出1
b();   //输出1
//看起来都是输出1,而且b()好像还更方便,其实不然,如果要用到函数的返回值,b()就不行了
 
echo a()+1;  //输出2
//b();这个就不能实现这种功能,需要进去函数里面改,扩展不方便

function add($a,$b){
    return $a+$b;
    return $a*$b; //不在执行此语句
}
$c = add(5,3);//得到的$c值可以用在程序的其他地方!
echo $c;

值传递和引用传递

<?php
$a = 3;
function change($c){
    $c = 5;
}
change($a);
echo $a; //3

$d = 3;
function change(&$f){
    $f = 5;
}
change($d);
echo $d; //5

可变函数

<?php
function test(){
    echo "hello world";
}
//test();
$func = "test";
if (function_exists($func)){//判断函数是否存在
    $func();
}

函数的嵌套

<?php
function bar(){
    echo "hello world";
}
function foo(){
    bar();
}
foo();

function foo(){
    function bar(){
        echo "hello world";
    }
}
foo();
bar();

回调函数

回调函数就是调用函数的时候将另外一个函数的名称当做参数传递进去,并且在函数体中进行调用。

<?php
header("content-type:text/html;charset=utf-8");

function study(){
    echo 'studying';
}
function play(){
    echo 'playing';
}
if (!function_exists('sleep')){
    function sleep(){
        echo 'sleeping';
    }
}

function doWhat($funcName){
    echo '我正在';
    $funcName();
}
doWhat('study');

函数的递归调用