函数:function 是一种语法结构,将实现某一个功能的代码块封装到一个结构中,从而实现代码的重复利用
关键点:function 关键字,函数名,参数(实参和形参),函数体和返回值
语法:
function 函数名(参数){
函数体
返回值:return 结果;
}
函数的使用:通过访问函数的名字+(); 、、如果函数在定义过程中有参数,那么调用的时候就必须传入对应的参数
函数是在代码执行阶段,碰到函数名字的时候才会调用,不是在编译阶段
调用特点:只要系统在内存中能够找到对应的函数,就可执行(函数的调用可以在函数定义之前,在java里是不可以的)
function trace(){
echo 'helo';
}
// 执行
trace();
$b = 'trace';
$b();
// 输出一样
// 传参
function num($a){
echo 'a = '.$a;
}
num(10);
function add ($a,$b){
return $a + $b;
}
echo add(10,2).'<br/>';
命名规范:有字母,数字和下划线组成,但不能以数字开头
驼峰法:除了左边第一个单词外,后面所有的单词首字母都大写 mysteriousKiller()
下划线:单词之间通过下划线连接,单词都是小写 kai_tou_kid()
--------------------------------------------
实参和形参
形参:形式参数,不具有实际意义的参数,是在函数定义时使用的参数
实参:实际参数,具有实际数据意义的参数,是在函数调用时使用的参数
形参是实参的载体:实参在调用时通常是需要传入到函数内部参与计算,那么需要在函数内部去找到实际数据所在的位置才能找到数据本身:需要实际调用的时候,将数据以实参的形式传递给形参:给形参赋值,从而使得函数内部可以用到外部数据
注意:实参不能少于形参个数
默认值:default value ,指的是形参的默认值,在函数定义的时候,就给形参进行一个初始赋值,如果实际调用传入的实参没有提供,那么形参就会使用定义时的值来进入函数内部参与运算
注意:默认值的定义是放在最后的,不能左边参数有默认值,但右边没有
function jian($a = 0,$b = 0){ // 给形参赋予默认值 echo $a - $b; // 函数体 } $a = 5; $b = 2; // 调用函数,传入实参 jian($a); jian($a,$b);
--------------------------------
引用传递
实参在调用是会将值赋值给形参,那么实际上使用的方式就是一种简单的值传递:将实参(如果是变量或常量再者是其他表达式)的结果(值)取出来赋值给形参:形参与外部实际传入的参数本身没有任何关联关系。
如果希望允许函数修改它的参数值,必须通过引用传递参数。 如果想要函数的一个参数总是通过引用传递,可以在函数定义中该参数的前面预先加上符号 & :
<?php function actionB(&$string) { $string .= 'and something extra.'; } $str = 'This is a string, '; actionB($str); echo $str; // outputs 'This is a string, and something extra.' ?>
-------------------------------
函数体:函数内部({}里面) 的所有代码都称之为函数体
返回值:return 指的是将函数试下的结果,通过 return 关键字,返回给函数外部调用处
---------------------------------------
作用域:变量(常量)能够被访问的区域
全局变量:定义在函数外,对整个函数来说就是全局变量,调用函数,传入全局变量,来使用
局部变量:定义在函数内,函数内部使用,外部无法使用。唯一想到的是值可以返回到外部,外部使用这个值
系统变量:没有访问限制,如:预定义变量
// 全局变量 $a = 1; $b = 2; function add(){ $c = $GLOBALS['b']+$GLOBALS['a']; // $c 是局部变量, $GLOBALS['b'] 意思是个访问全局变量 b 等于函数外的 b 这个变量名 echo $c.'<br/>'; function a($c,$d = 0){ $e = $c *$d; echo $e; } a($c); } add();
global 关键字:是一种在函数里面定义的一种方式
如果使用global 定义的变量名在外部存在(全局变量),那么系统在函数内部定义的变量直接指向外部全局变量所指向的内存空间(同一个变量),如果使用global 定义的变量名在外部不存在(全局变量),那么系统会自动在全局空间(外部)定义一个与局部变量同名的全局变量
本质的形式:在函数的内部和外部,对一个同名变量(全局和局部)使用同一块内存地址保存数据,从而实现共同拥有
语法:
Global 变量名;
变量名 = 值;
---------------------------------------------
静态变量: static 是在函数内部定义的变量,使用 static 关键字修饰,用来实现扩函数共享数据的变量:函数运行结束所有局部变量都会清空,如果重新运行一下函数,所有的局部变量有会重新初始化
语法:
function 函数名(){
static $变量名= 值;
}
作用:为了跨函数共享数据,同一个函数被多次调用
使用:为了统计:当前函数被调用的次数。为统筹函数多次调用的到的不同结果(递归)
--------------------------------------------------
可变函数:当前有一个变量所保存到值,刚好是一个函数的名字,那么就可以使用 变量+(); 来充当函数名使用
$变量 = 'add';
function add(){};
// 可变函数
$变量();
将一个用户定义的函数传入给另外一个函数(函数名)去使用的过程,称之为回调过程,而被传入的函数称之为回调函数
-------------------------------------------
匿名函数:没有名字的函数
语法:
$变量名 = function(){
函数体
};
// 调用
$变量名();
闭包:closure 词来源于一下两者的结合:要执行的代码块(有与自由比那里被包含在代码块中,这些自由变量以及他们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)
理解:函数内部有一些局部变量(要执行的代码块)在函数执行之后没有被释放,是因为在函数内部还有对应的含糊在引用(函数的内部函数:匿名函数)
----------------------------------------
类中 静态方法和静态属性的引用方法
例如
class Test{
public static $test = 1;
public static function test(){
}
}
可以不用实例化对象直接使用 Test::$test 来取得$test属性的值
静态方法调用也同理Test::test(); 直接调用静态方法test