PHP学习记录(函数)

函数

函数含义

  • 函数:是实现特定功能的、可以重复执行的代码段;
  • 函数名:从语法上讲,函数名中能有汉字,但在实际开发中不建议使用!

函数结构

function 函数名 () {
    //代码块
}

函数名定义规则

  • 开头:[a-zA-Z_\x7f-\xff]
  • 函数名:[a-zA-Z0-9_\x7f-\xff]
  • 函数的首字母不能为数字、可以是汉子或者字母,函数中间可以使用数字

函数的返回值

  • 和其他语言不同的是,PHP并没有在函数声明的时候显示函数是否有返回值,如果函数内部使用了return即表示有返回值,反之则表示没有返回值,返回类型可以为对象、数组、字符串等。

函数变量

//局部变量
//局部动态变量:变量只在函数内部执行,执行完毕则被销毁;
//局部静态变量:使用static修饰,执行完毕不被销毁;
//注:函数内部定义的变量,为局部变量,函数外部不能访问。
function func()
{
    $a = 3;  //局部动态变量
    static $b = 34;  //局部静态变量
}

//全局变量
//在函数外部定义的变量,称为全局变量。在函数内部使用全局变量的时候,不能和其他语言一样直接使用,有两种使用方法:
//(1)用global关键字进行声明后使用
$a = 3;
function func()
{
    global $a;
    echo $a;
}

//(2)使用超全局变量数组$GLOBALS直接访问
$a = 3;
function func()
{
    echo $GLOBALS['a'];
}

函数的参数

值传递和引用传递

//值传递:当一个变量的值赋予给另外一个变量的时候,改变其中一个变量的值,将不会影响到另外一个变量的值

//引用传递:新变量指向了原始变量,改动新的变量将影响到原始变量,反之亦然。(只有有名字的变量才能引用传递,比如表达式就不可以)
//注:在函数中传递参数的类型为对象时,即使不加&,也是引用传递,因为对象名对应的是该对象的引用地址。

$a = 4;
function func1($c)  //值传递
{
    $c = 7;
}
func1($a);
echo $a, "\n";  //4,函数没有改变$a的值

function func2(&$d)  //引用传递
{
    $d = 7;
}
func2($a);
echo $a, "\n";  //7,函数改变了$a的值

参数默认值

//如果$a和$b没有默认值,调用该函数的时候必须传值,否则会报错,如果有默认值,可以不传参数
function func($a = 3, $b = 5)
{
    echo "a的值为{$a}, b的值为{$b}\n";
}
func();

可变参数列表

/*
 *在函数定义时,形参可以省略不写,在函数内部可以通过系统方法获取传递进行的参数数组。
 *func_num_args():传入函数实参的个数
 *func_get_args():传入函数实参列表(数组形式)
 *func_get_arg(index):传人函数具体位置的实参
 */

function fun6()
{
    echo func_num_args(), "\n";  //3
    print_r(func_get_args());  //数组
    echo func_get_arg(0);  //10
}
fun6(10, 11, 12);

传参类型限定

//函数定义时,可以给参数限定类型,共三种类型:array,object,callback
function func(array $a)  //实参必须为数组类型
{
    print_r($a);
}
//func(1);  //会报错
func([1, 2, 3]);

复杂函数

可变函数

//将函数的名字赋值给变量,通过变量去调用函数,让函数的调用更具多样性
/*
 * is_callable(函数):判断函数能否被调用
 * function_exists(函数):判断函数是否存在
 */
function func()
{
    echo 'hello, world', "\n";
}

$fun = 'func';

if (is_callable($fun)){  //判断是否能调用
    echo '能调用', "\n";
    $fun();
}

if (function_exists($fun)){
    echo '能调用', "\n";
    $fun();
}

函数的嵌套

/*                                                 
* php所有定义的函数,作用域都是全局的                             
*                                                 
* 和其他语言比如java相比,php不存在内置函数,意思就是说bar()不是foo()的内置函数, 
* 两者没有区别,作用域都是全局的,在bar()函数内不能调用foo()中声明的变量,但是bar()
* 函数必须在foo()调用之后才会被定义,才能被调用                       
*                                                 
*/                                                
function foo()                                     
{                                                  
$a = 'hello, world';                           
function bar()                                 
{                                              
    /* 不能调用变量$a */                             
    echo 'bar()函数被调用';                         
}                                              

/* 内部可以调用bar(),因为其已经被定义 */                                                  
//bar();                                         
}                                                  
                                                   
/* 现在不能调用bar(),因为其还没有被定义 */                        
                                                   
foo();                                             
                                                   
/* 现在可以调用bar(),因为foo()调用之后,bar()已经被定义 */           
                                                   
bar();

递归调用:函数调用自己本身,递归里面需要有跳出递归的判断条件

匿名函数

/*                                  
 * 匿名函数                             
 * 函数没有指定名称,称为匿名函数                  
 * 通过将函数赋给变量,通过变量来实现调用函数                                            
 */                                 
$say = function($str) {             
    echo 'hello, world';            
};                                  
$say('aaa');

相关推荐