PHP学习笔记9(函数)

(1)函数结构

  • PHP中的函数就是完成某些功能的代码段
  • PHP中的函数分为系统函数和自定义函数
    • 系统函数:字符串、数学、数组、日期函数…
    • 自定义函数:按照具体需求封装的函数
  • 关键字 函数名 参数列表 函数体 返回值
  • 如果省略return,则返回NULL
  • 函数名不区分大小写
  • 函数名不可以重复,包括系统函数名
  • function_exists(‘name’)检测函数是否存在
  • 函数的声明不必在调用之前
function name($a,$b){
     return $a+$b;
}

(2)参数列表

  • 实参的数目大于形参的数目,函数正常执行(截取前面的)
<?php
     function sum($a,$b){
          echo $a+$b;
     }

sum(1);//报错

sum(1,2);//正常执行

sum(1,2,3);// 正常执行没有报错
  • 参数的默认值(缺省值必须在后面 )
<?php

function greet($name,$is_formal = false){
    if(!$is_formal){
        echo "Hi, ",$name,"\n";
    }else{
        echo "Hello, ",$name,"\n";
    }
}
greet("Jack"); //正确
greet("Tom",true);//正确

<?php

function greet($is_formal = false,$name){
    if(!$is_formal){
        echo "Hi, ",$name,"\n";
    }else{
        echo "Hello, ",$name,"\n";
    }
}

greet(true,"Tom");//没问题
greet("Tom");// 错误
  • 强类型参数
    • 为参数列表中的参数指定类型。如果传入的数据类型不匹配,将会抛出TypeError异常
<?php

function add1($a,$b){
    echo $a+$b;
}

function add2(int $a,int $b){
    echo $a+$b;
}
add1(3.5,5);//不报错

add2(3.5,5);//报错
  • 可变参数列表
    • 实现方式一func_get_args()
<?php

//计算传入的所有参数的和
function get_sum(){
    $args_num = func_num_args();//查看传入参数的数量
    $sum = 0;
    print_r(func_get_args());//查看的参数列表的数组
    if($args_num == 0){
        return $sum;
    }else{
        for($i=0;$i<$args_num;$i++){
            $sum += func_get_arg($i); // 获取指定偏移量的参数列表值
        }
        return $sum;
    }
}

echo get_sum(1,2,3,4,5);
echo get_sum();
echo get_sum(11,22);
  • 实现方式二…$name
<?php

//计算传入的所有参数的和
function get_sum(...$nums){

    $sum = 0;

    if(!$nums){
        return $sum;
    }else{
        foreach($nums as $num){
            $sum += $num;
        }
        return $sum;
    }
}

echo get_sum(1,2,3,4,5);
echo get_sum();
echo get_sum(11,22);

(3)返回值

  • 函数可以有0个或者一个返回值
  • 如果想返回多个返回值可以通过数组或对象实现
  • 函数通过return加返回值,函数碰到return立即结束
  • 函数的返回值可以是任意类型
  • 函数默认返回NULL
  • 返回值不等于输出echo

(4)值传递和引用传递

  • 值传递(只能由实参传递给形参)
<?php

//计算传入的所有参数的和
function factorial($num){
    $sum = 1;
    for($i=1;$i<=$num;$i++){
        $sum *= $i;
    }
    $num = 5; //这里改变传入的值
    echo $sum+"\n";
}
$num = 3;
factorial($num);

echo $num; //这里输出还是3,没有改成5,值传递
  • 引用传递
<?php

//交换两个引用
function swap(&$a,&$b){
    $tmp = $a;
    $a = $b;
    $b = $tmp;
}

$a = 5;
$b = 10;
swap($a,$b);
echo $a,$b; // 10,5

(5)变量作用域

  • 全局变量
    • 在页面中生成的变量都是全局变量,在整个页面都是有效,不能被传递到其他页面
    • 但是不能被函数或者类中的方法访问
<?php

    $a = 1;//全局变量
    function test(){
        echo $a;//错误 页面中声明的全局变量不能在函数中访问
    }
    test(); //调用会报错


<?php

    static $a = 1;//没有static修饰的全局变量 ,错误,没有这种写法
    function test(){
        echo $a;
    }
    test(); //调用会报错
  • 全局化方式一
<?php

    // 全局化方式一
    $g_name = "Lily";
    //global $g_name;在外部这样写无用,必须写在函数内
    function show(){
        global $g_name;
        echo $g_name;//输出Lily
    }
    show();
  • 全局化方式二
<?php

// 全局化方式二
$g_sex = "女";
function display(){
    echo $GLOBALS['g_sex'];
}
display();
  • 两种方式的区别
<?php
    // global GLOBALS区别
    // global 引用的是传递来的值非本身的值
    $v1 = 1;
    $v2 = 2;
    function swap1(){
        global $v1,$v2;
        $v2 = &$v1;
    }
    swap1();
    echo $v2;//v2的值还是2,没有改成v1的值1

    // global GLOBALS区别
    // GLOBALS 引用的是外部本身的值
    $v1 = 1;
    $v2 = 2;
    function swap2(){
        $GLOBALS['v2'] = &$GLOBALS['v1'];
    }
    swap2();
    echo $v2;//v2的值改为1了
  • 查看该页面所有全局变量
<?php
    $g_name = "Lily";
    //global $g_name;在外部这样写无用,必须写在函数内
    function show(){
        global $g_name;
        echo $g_name;//输出Lily
    }
    show();

    // 全局化方式二
    $g_sex = "女";
    function display(){
        echo $GLOBALS['g_sex'];
    }
    display();


    var_dump($GLOBALS);

Lily女

C:\Users\wangc\Desktop\php\test.php:20:array (size=10)
  '_GET' =>
    array (size=0)
      empty
  '_POST' =>
    array (size=0)
      empty
  '_COOKIE' =>
    array (size=0)
      empty
  '_FILES' =>
    array (size=0)
      empty
  '_ENV' =>
    array (size=0)
      empty
  '_REQUEST' =>
    array (size=0)
      empty
  '_SERVER' =>
    array (size=35)
      'HTTP_HOST' => string 'localhost:8080' (length=14)
      'HTTP_USER_AGENT' => string 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:57.0) Gecko/20100101 Firefox/57.0' (length=78)
      'HTTP_ACCEPT' => string 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' (length=63)
      'HTTP_ACCEPT_LANGUAGE' => string 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2' (length=59)
      'HTTP_ACCEPT_ENCODING' => string 'gzip, deflate' (length=13)
      'HTTP_CONNECTION' => string 'keep-alive' (length=10)
      'HTTP_UPGRADE_INSECURE_REQUESTS' => string '1' (length=1)
      'HTTP_CACHE_CONTROL' => string 'max-age=0' (length=9)
      'PATH' => string 'C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files (x86)\NVI'... (length=1014)
      'SystemRoot' => string 'C:\WINDOWS' (length=10)
      'COMSPEC' => string 'C:\WINDOWS\system32\cmd.exe' (length=27)
      'PATHEXT' => string '.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC' (length=53)
      'WINDIR' => string 'C:\WINDOWS' (length=10)
      'SERVER_SIGNATURE' => string '<address>Apache/2.4.23 (Win64) PHP/5.6.25 Server at localhost Port 8080</address>
' (length=82)
      'SERVER_SOFTWARE' => string 'Apache/2.4.23 (Win64) PHP/5.6.25' (length=32)
      'SERVER_NAME' => string 'localhost' (length=9)
      'SERVER_ADDR' => string '::1' (length=3)
      'SERVER_PORT' => string '8080' (length=4)
      'REMOTE_ADDR' => string '::1' (length=3)
      'DOCUMENT_ROOT' => string 'C:/Users/wangc/Desktop/php' (length=26)
      'REQUEST_SCHEME' => string 'http' (length=4)
      'CONTEXT_PREFIX' => string '' (length=0)
      'CONTEXT_DOCUMENT_ROOT' => string 'C:/Users/wangc/Desktop/php' (length=26)
      'SERVER_ADMIN' => string 'wampserver@wampserver.invalid' (length=29)
      'SCRIPT_FILENAME' => string 'C:/Users/wangc/Desktop/php/test.php' (length=35)
      'REMOTE_PORT' => string '63522' (length=5)
      'GATEWAY_INTERFACE' => string 'CGI/1.1' (length=7)
      'SERVER_PROTOCOL' => string 'HTTP/1.1' (length=8)
      'REQUEST_METHOD' => string 'GET' (length=3)
      'QUERY_STRING' => string '' (length=0)
      'REQUEST_URI' => string '/test.php' (length=9)
      'SCRIPT_NAME' => string '/test.php' (length=9)
      'PHP_SELF' => string '/test.php' (length=9)
      'REQUEST_TIME_FLOAT' => float 1514209541.292
      'REQUEST_TIME' => int 1514209541
  'GLOBALS' =>
    &array<  'g_name' => string 'Lily' (length=4)
  'g_sex' => string '女' (length=3)
  • 局部变量
    • 函数体内声明的变量为局部变量
    • 局部变量分为动态变量和静态变量
    • 动态变量在函数执行完立即释放
    • 静态变量,第一次执行函数时初始化静态变量,当函数执行完毕后静态不会释放而是保存在静态内存中,当再次调用时直接从静态内存中取出变量值执行
    • 在函数中声明的普通变量,在函数内部有效
    • 在类中声明的属性,在类的内部有效
<?php

    function test(){
        $b = 2;//局部变量
        echo $b;
    }
    test();
    var_dump($b);// 错误 函数中声明的局部变量不能在页面中访问
  • 静态变量
<?php

function sum1(){
    $a = 0;
    echo $a++;
}
sum1();//0
sum1();//0

function sum2(){
    static $a = 0;
    echo $a++;
}
sum2();//0
sum2();//1
  • 超全局变量
    • 如果想被函数或者类中方法访问,就得使用超全局变量$_GET $_POST $_COOKIE $_SERVER $FILES $_ENV $_REQUEST $_SESSION

(6)复杂函数

  • get_defined_functions()获取所有定义的函数
<?php
    print_r(get_defined_functions());

Array (
     [internal] => Array ( [0] => zend_version  [1910] => xdebug_get_headers )                    
     [user] => Array ( ) )
  • 可变函数
    • 可变函数不能用于像echo print unset() isset() empty include require等类似的语言结构,需要自己封装之后实现
<?php

function apple(){
    echo 'apple';
}

function banana(){
    echo 'apple';
}

// 可变函数
$name = 'apple';
$name();

// 可变函数
$name = 'banana';
$name();

  • 嵌套函数
  • 当外部函数被调用时,内部函数就会自动进入全局域中,成为新的定义函数
  • 单层嵌套
<?php

function out(){
    echo '外部函数被调用';
    if(!function_exists('in')){
        function in(){
            echo '外部函数没有被调用,内部函数是不存在的';
        }
    }
}

//in();//直接调用内部函数会报错,函数未定义

out();
in();

out();//再次调用out会报错,function已经存在,在上面加一层判断
  • 多层嵌套
<?php

function out(){
    echo 'out';
    function mid(){
        echo 'mid';
        function in(){
            echo 'in';
        }
    }
}

//依次调用 不然会报错
out();
mid();
in();
  • 嵌套传值
<?php

function out($name){

    if(!function_exists('in')){
        function in($name){
            echo 'in:'.$name;
        }
    }
    echo 'out:'.$name;
}

//依次调用 不然会报错
out('Hello'); // Hello

in('Hi'); // Hi
  • 递归函数
    阶乘
function factoria($num){
    $sum = 1;
    if(1 == $num){
        $sum = $sum * 1;
    }else{
        $sum = $num * factoria($num-1);
    }
    return $sum;

}

echo factoria(6);
  • 回调函数
  • 灵活调用函数
<?php
    function add($x,$y){
        return $x+$y;
    }

    function reduce($x,$y){
        return $x-$y;
    }

    function calc($funcName,$i,$j){
        return $funcName($i,$j);
    }

    echo calc('add',3,2);
    echo calc('reduce',3,2);
  • 数组相关
<?php
    $arr = array(1,2,3,5);

    function add($num){
        return $num*2;
    }

    $res = array_map('add',$arr);
    print_r($res);//2 4 6 10
  • call_user_func()
<?php
    function add($x,$y){
        return $x+$y;
    }

    function reduce($x,$y){
        return $x-$y;
    }

    echo call_user_func('add',3,2);
    echo call_user_func('reduce',3,2);

    echo call_user_func_array('add',array(3,2));
    echo call_user_func_array('reduce',array(3,2));
  • 匿名函数
  • 闭包函数:临时创建的没有指定名称的函数。经常用作回调函数callback参数
  • use引用一些页面变量
<?php

$message = "Hi";
$example = function() use(&$message){
    echo $message;
};
$message = "Hello";
$example(); //此处输出的是Hello 因为use中使用的是&引用,去掉&则输出Hi
  • create_function
<?php $name = create_function('$a','echo $a;'); //参数列表 函数体 $name(1); 
  • 经典用法
function test($name,Closure $clo){
    echo $name;
    $clo();
}

test("Tom",function(){
    echo "Closure";
});

(6)函数复用

  • include require区别
<?php
//include require必须出现在调用之前
require('util.php');//使用require当文件不存在,会直接崩溃
include('util.php');//使用include当文件不存在,不抛出异常程序继续执行
add(1,4);
  • include_once require_once
<?php // require两次会报函数已经声明错误 //require('util.php'); //require('util.php'); require('util.php'); require_once('util.php'); // include两次会报函数已经声明错误 //include('util.php'); //include('util.php'); include('util.php'); include_once('util.php'); 
  • set_include_path
//使用include繁琐写法
include('testa/t1.php');
include('testa/t2.php');
include('testb/t3.php');
include('testb/t4.php');
t1();
t2();
t3();
t4();

//多个文件set_include_path
set_include_path(get_include_path().PATH_SePARATOR.'testa');
set_include_path(get_include_path().PATH_SePARATOR.'testb');

include(t1.php);
include(t2.php);
include(t3.php);
include(t4.php);

t1();
t2();
t3();
t4();

//换成init_set写法
init_set('include_path',get_include_path().PATH_SePARATOR.'testb');
init_set('include_path',get_include_path().PATH_SePARATOR.'testb');

include(t1.php);
include(t2.php);
include(t3.php);
include(t4.php);

t1();
t2();
t3();
t4();
  • restore_include_path();取消引用路径
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码充电宝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值