imooc慕课 PHP函数篇 笔记
一、为什么要使用函数
封装的代码块,简化重复的书写和调用,便于管理维护。
二、函数结构
三、函数命名规则
有效的函数名以字母或下划线开头,后面跟字母,数字或下划线
四、函数返回值
定义 : 值通过使用可选的返回语句返回 (ps:如果省略return 则返回的是null)
可以返回包括数组和对象的任意类型
返回语句会立即中止函数的运行,并且将控制权交回调用该函数的代码行
五、函数参数篇
1.形参,实参
function show_args($a,$b) //$a $b为形参
{
echo "$a---$b";
}
show_args(1,2); //1,2 为实参
$a=2;
$b=3;
show_args($a+$b,2+2);//$a+$b,2+2 为实参
实参数目大于形参时,会截取掉多余的,实参可以是常量,变量,表达式
2.参数默认值
function foo($arg1,$arg2,$arg3){}
function foo1($arg1,$arg2,$arg3 = "value"){} //$arg3有默认值
没有传值,则会使用默认值,需要写默认值的形参放后面
3.强类型参数
定义 为参数列表中的参数指定类型,如果传入的数据类型不匹配,将会抛出TypeError异常
function sum(array $a,array $b)
{
return $a[0]+$b[0];
}
var_dump(sum([1],[2])); //int(3) 必须要传入数组类型
4.可变参数列表
实现方式1:
func_num_args() 返回传递给函数的参数数。
func_get_arg() 返回参数列表的某一项 配合func_num_args使用
func_get_args() 返回一个包含函数参数列表的数组
(ps:在5.5及更早里面使用)
实现方法2:
function _sum(...$nums){
var_dump($nums);
}
_sum(1,2,3,4); //array(4) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(4) }
(ps:php5.6以后)
function _sum(...$nums){
$sum = 0;
if($nums){
foreach ($nums as $num){
$sum += $num;
}
}
return $sum;
}
echo _sum(1,2,3,4); //10
5.值传递&引用传递
传递类型:数值 对象 字符串 数组等
//值传递
function sum($a,$b)
{
return $a+$b;
}
(ps:实参传递给形参,形参改变,实参并不会改变)
function swap(&$a, &$b)
{
$tmp = $a;
$a = $b;
$b = $tmp;
}
$a = 1;
$b = 2;
swap($a,$b);
echo '$a='.$a.'--$b='.$b; //$a=2--$b=1
(ps:没有返回值,但是$a和$b的值改变了)
6.变量的作用域
变量范围与生命周期:
局部变量
1) 当前页面中声明的普通变量,不能在函数或者类中起作用
2)当前页面中声明的普通变量,不能被传递到其他页面
3)在函数中声明的普通变量,在函数内部有效
4)在类中声明的属性,在类的内部有效
全局变量(global)
对于php而言,可以这么说,在页面综合那个生成的变量都是全局变量,在整个页面都是有效。但是不能被函数或者类中的方法访问
如果想被函数或者类中方法访问,我们就有了超全局变量
php自定义超全局变量:$_GET $_POST $_COOKIE $_SERVER $_FILES $_ENV $_REQUEST $_SESSION
$g_name = 'zhangxingju';
function show_name()
{
global $g_name;
echo $g_name;
//echo $GLOBALS['g_name'];
}
show_name(); //zhangxingju
global 和 $GLOBAL区别
$v1 = 1;
$v2 = 2;
function test_global()
{
global $v1,$v2;
$v2 = &$v1;
}
test_global();
echo '$v1='.$v1.'--$v2='.$v2; //$v1=1--$v2=2 其中$v2并没有改变
$v1 = 1;
$v2 = 2;
function test_global()
{
$GLOBALS['v2'] = &$GLOBALS['v1'];
}
test_global();
echo '$v1='.$v1.'--$v2='.$v2; //$v1=1--$v2=1 其中$v2改变了 $GLOBALS其实引用了外部真实的$v1 $v2
静态变量(static)
function test_static()
{
static $a = 0; //这里所赋的值不能是函数表达式 比如static $a = sqrt(3);
echo $a++;
}
test_static(); //0
test_static(); //1 上一次$a的值被保存下来了
六.可变函数
变量名后有圆括号,php将寻找与变量的值同名的函数,并且尝试执行它
function get_apple()
{
return 'In get_apple()';
}
function get_orange()
{
return 'In get_orange()';
}
$f1 = 'get_apple';
echo $f1(); //In get_apple()
$f1 = 'get_orange';
echo $f1(); //In get_orange()
七、嵌套函数
php嵌套函数有一些特别之处,最特别的是,当外部函数被调用时,内部函数就会自动进入全局域中,成为新的定义函数。
function out()
{
if(!function_exists('in'))
{
function in()
{
echo '如果外部函数out()没有被调用的话,我是不存在的';
}
}
}
out();
in(); //如果外部函数out()没有被调用的话,我是不存在的
用法&注意 单层&多层嵌套
function f_out()
{
echo "out \n";
function f_mid()
{
echo "mid \n";
function f_in()
{
echo "in \n";
}
}
}
f_out();
f_mid();
f_in();
//需要依次调用
传参的情况
function out($str_msg)
{
if (!function_exists('in')) {
function in($msg)
{
echo 'funciton in():' . $msg . "
";
}
}
echo 'funciton out():' . $str_msg . "
";
in($str_msg);
}
out('zhangxingju');
in('wtsxia');
//funciton out():zhangxingju
//funciton in():zhangxingju
//funciton in():wtsxia
八、递归函数
函数在它的函数体内调用它自身
分解问题,调用自身
function recursive($i)
{
$sum = 1;
if(1 == $i){
return 1;
}else{
$sum = $i * recursive($i-1);
// 或者 $func=__FUNCTION__; $sum = $i * $func($i-1);
}
return $sum;
}
echo recursive(3); //6
(ps:201170722更新 内部可以使用魔术常量 来代替函数名 __FUNCTION__ 当前的函数名)
九、匿名函数(闭包)
定义 匿名函数(Anonymous functions) 也叫闭包函数(closures),允许临时创建一个没有指明名称的函数。最经常用作回调函数(callback)参数的值
使用 闭包函数可以作为变量的值来使用
$message = "hello";
$example = function ($name) use (&$message) //引用传值 这样后面重新声明的$message才可以传值进来
{
echo $message,",",$name;
}; //一定要有分号
$message = "Hi";
$example("zhangxingju"); //Hi,zhangxingju
//回调
function test_closure($name, Closure $clo)
{
echo "hello,{$name}.";
$clo();
}
test_closure("zhangxingju",function (){
echo "this is callback";
});
十、代码复用
单独引用
include 与 require
include_once 与 require_once
include 遇到警告报错,继续执行 require遇到错误直接停止运行
路径引用
set_include_path 设置 include_path 配置选项
get_include_path 获取当前的 include_path 配置选项