• php自定义函数及内部函数


    1、变量的作用域

    变量的作用域也称为变量的范围,变量的范围即它定义的上下文背景(也是它的生效范围)。大部分php变量只有一个单独的范围。这个单独的范围跨度同样包含了include和require引入的文件。

    (1)global关键字

      全局变量可以在程序的任何地方访问。但是,要想修改全局变量 ,就必须要在修改该变量的函数中将其显式的声明为全局变量。声明全局变量时要在变量的前面加上global关键字,如果将该关键字放在一个已有的变量面前,就是告诉php要使用同名的全局变量。

    例:

    $month = 10;
    function getMonth(){
        global $month;
        $month--;
        return $month;
    }
    getMonth();
    echo $month;//输出结果是9

    调用该函数时,在函数内部将函数内部的全局变量进行了全局话,这样这样在函数内部操作,其实就是对函数外部的month进行的操作,函数调用一次,该变量就处理一次。若函数内部没有申明global,则无论函数调用多少次,month的值均不变,还是10。

    除了使用global之外,还可以使用$GLOBALS[]数组。

    $month = 10;
    function getMonth(){
        $GLOBALS["month"]--;
    
    }
    getMonth();
    echo $GLOBALS["month"];//输出结果是9

    (2)静态变量:静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不会消失。

      static关键字:

      ① 仅初始化一次

      ② 初始化时需要赋值

      ③ 每次执行函数,该值会保留

      ④ static修饰的变量是局部的,仅在函数内部有效

      ⑤ 可以记录函数的调用次数,从而可以在某些条件下终止递归

      例:

    $count = 5;
    function get_count(){
        static $count;  //此处进行初始化,若没有指定则初始化为null,并且仅初始化一次,以后每次调用时,该步不会再执行
        return $count++;
    }
    echo $count;    //输出结果5
    echo "</br>";
    ++$count;       //count=6
    echo get_count();//在函数内部,$count=null,$count++ => $count=1,输出空(啥都不输出)
    echo get_count();//在函数内部,$count=1,$count++ => $count=2,输出1

     (3)函数参数

    默认情况下,函数参数通过值传递。

    如果允许函数修改它的值,必须通过引用传递参数。

    $a = 1;
    function myFunc($a){
        $a = 2;
    }
    myFunc($a);
    echo $a;  // 输出:1
    
    //引用传递,参数的值也会改变
    $a = 1;
    function myFunc(&$a){
        $a = 2;
    }
    myFunc($a);   //传入的参数只能是变量,而不能是具体的值
    echo $a;  // 输出:2

    (4)函数返回值

    值通过可选的返回语句(return)返回。

    可以返回包括数组和对象的任意类型。

    返回语句会终止函数的执行,将控制权交回函数调用处。

    省略return,返回值为null,不可有多个返回值,若要返回多个值,可以用数组返回。

    下面说一下函数的引用返回:

    从函数返回一个引用,必须在函数声明指派返回值给一个变量时都使用引用运算符&。

    function &myFunc(){    //注意函数声明的 &
        static $b = 10;
        return $b;
    }
    $a = myFunc();// $a = 10   正常调用
    $a = &myFunc();//此时 $a 和 $b 互为引用; 注意在这里指派返回值给 $a 时的 &
    $a = 100;  //$b = 100;
    echo myFunc();//输出100

    二、外部文件导入

    include 和 require 语句包含并运行指定文件。

    如果给出路径名按照路径来查找,否则从include_path中查找

    如果include_path中也没有,则从调用脚本文件所在目录和当前工作目录下查找。

    当一个文件被包含时,其中所包含的代码继承了include所在行的变量范围。

    加载过程中未找到文件则 include 结构会发出一条警告,这一点与require不同,后者会发出一个致命错误

    require在出错时会产生E_COMPILE_ERROR级别的错误。换句话说将导致脚本终止,而include只会产生警告(E_WARNING),脚本会继续执行

    require(include)/require_once(include_once)唯一区别是php会检查该文件是否已经被包含过,如果是则不会再次包含。

    三、系统内置函数

    (1)时间日期函数

      下面将用一个章节具体讲解。

    (2)IP处理函数

    //当前运行脚本所在的服务器的 IP 地址。
    echo $_SERVER['SERVER_ADDR'];  //输出:::1
    echo "</br>";
    
    //浏览当前页面的(客户端)用户的 IP 地址。
    echo $_SERVER['REMOTE_ADDR'];  //输出:::1
    echo "</br>";
    
    // 返回主机名(域名)对应的 IPv4地址。
    $ip=gethostbyname('www.baidu.com');
    echo $ip;            //输出:220.181.112.244
    echo "</br>";
    
    //把ip转换为整型数字(便于存储数据库)
    $ip_int = ip2long($ip);
    echo $ip_int;       //输出:-592088844
    echo "</br>";
    
    //把整型数字转换为IP
    $int_ip = long2ip($ip_int);
    echo $int_ip;      //输出:220.181.111.37

    (3)打印处理函数

    ① echo:函数输出一个或多个字符串。

    echo函数可以同时输出多个字符串,带多个参数,但并不要求使用圆括号,也没有返回值。但是,如果带上圆括号也可以。echo() 函数比 print() 函数速度稍快。

    ② print :函数输出一个或多个字符串。

    print() 函数比 echo() 速度稍慢。

    $str1="小林子";
    $str2="奋斗的点滴!!!";
    echo  $str1 . "</br>" . $str2;
    //输出:
    //      小林子
    //      奋斗的点滴!!!
    
    print $str1 . "</br>" . $str2;
    //输出:
    //      小林子
    //      奋斗的点滴!!!

    ③ printf :输出格式化的字符串

    使用方式:printf(format,arg1,arg2,arg++) 。arg1arg2arg++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。

    可能的格式值:

    • %% - 返回一个百分号 %
    • %b - 二进制数
    • %c - ASCII 值对应的字符
    • %d - 包含正负号的十进制数(负数、0、正数)
    • %e - 使用小写的科学计数法(例如 1.2e+2)
    • %E - 使用大写的科学计数法(例如 1.2E+2)
    • %u - 不包含正负号的十进制数(大于等于 0)
    • %f - 浮点数(本地设置)
    • %F - 浮点数(非本地设置)
    • %g - 较短的 %e 和 %f
    • %G - 较短的 %E 和 %f
    • %o - 八进制数
    • %s - 字符串
    • %x - 十六进制数(小写字母)
    • %X - 十六进制数(大写字母)
    • 附加的格式值。必需放置在 % 和字母之间(例如 %.2f):

      • + (在数字前面加上 + 或 - 来定义数字的正负性。默认地,只有负数做标记,正数不做标记)
      • ' (规定使用什么作为填充,默认是空格。它必须与宽度指定器一起使用。)
      • - (左调整变量值)
      • [0-9] (规定变量值的最小宽度)
      • .[0-9] (规定小数位数或最大字符串长度)

    ④ sprintf :把格式化的字符串写入变量中。

    sprintf不能直接输出变量值,而是直接将值读取给指定的变量

    ⑤  print_r:用于输出数组,带一个或者两个。如果参数二设置为YES,则不会输出表达式信息,而是直接return回来。

    $a = array ('A' => '小', 'B' => '林', 'C' => '子', 'D' => array ('奋','斗','的','点','滴'));
    print_r ($a);
    //输出:Array ( [A] => 小 [B] => 林 [C] => 子 [D] => Array ( [0] => 奋 [1] => 斗 [2] => 的 [3] => 点 [4] => 滴 ) )
    
    $b = array ('A' => '小', 'B' => '林', 'C' => '子', 'D' => array ('奋','斗','的','点','滴'));
    $results = print_r ($b, true); // $results 包含了 print_r 的输出结果

    ⑥ var_dump :用于输出变量的内容、类型、字符串的内容,常用于开发中调试使用

    $a = 13;
    $b = 1.3;
    $c = true;
    $d = "小林子";
    $e = array(1,2,3);
    var_dump($a, $b, $c, $d, $e);
    //输出 :int(13) float(1.3) bool(true) string(9) "小林子" array(3) { [0]=> int(1) [1]=> int(2) [2]=> int(3) }

    ⑦ var_export : 返回变量或数组的字符串表示。

    在开发过程中,我们常用var_dump()来打印数组内容,但有时候我们不方便通过浏览器查看调试信息,这时候可以将信息输出到文件中查看,var_export()可以打印或返回变量的字符串表示,返回值是一个字符串,形式类似var_dump()打印的字符串,使用var_export()可以将POST、GET和SESSION等数据写入文件,方便查看。

    ⑧ die : 在调试过程中,经常会中断下面的执行,它会先输出内容,然后退出程序或者不输出内容。

    (4)序列化和反序列化函数

    我们在开发的过程中常常遇到需要把对象或者数组进行序列号存储,反序列化输出的情况。特别是当需要把数组存储到mysql数据库中时,我们时常需要将数组进行序列号操作。

    序列化(串行化):是将变量转换为可保存或传输的字符串的过程;serialize。json_encode

    反序列化(反串行化):就是在适当的时候把这个字符串再转化成原来的变量使用。unserialize;json_decode

    对于 serialize 和 unserialize :

    $a = array('a' => '小' ,'b' => '林' , 'c' => '子');
    
    //序列化数组
    $s = serialize($a);
    echo $s;
    //输出结果:a:3:{s:1:"a";s:3:"小";s:1:"b";s:3:"林";s:1:"c";s:3:"子";}
    
    //反序列化
    $o = unserialize($s);
    print_r($o);
    //输出结果 Array ( [a] => 小 [b] => 林 [c] => 子 )

    对于 json_encode 和 json_encode :(该函数只对 UTF-8 编码的数据有效。)

      使用json_encode和json_decode格式输出要serialize和unserialize格式快得多。

      JSON格式是可读的。

      JSON格式比serialize返回数据结果小。

      JSON格式是开放的、可移植的。其他语言也可以使用它。

    $a = array('a' => 'xiao' ,'b' => 'lin' , 'c' => 'zi');
    
    //序列化数组
    $s = json_encode($a);
    echo $s;
    //输出结果:{"a":"xiao","b":"lin","c":"zi"}
    echo "</br>";
    
    //反序列化
    $o = json_decode($s);
    var_dump($o);
    //输出结果:object(stdClass)#11 (3) { ["a"]=> string(4) "xiao" ["b"]=> string(3) "lin" ["c"]=> string(2) "zi" }

    还可以序列化对象,这里不再赘述。

    (5)字符串处理函数

    下面将用一个章节具体讲解。

    (6)数组处理函数

    下面将用一个章节具体讲解。

    最后放一个题目作为检测学习成果:

    $var1 = 5;
    $var2 = 10;
    function foo(&$my_var){
        global $var1;   // 5
        $var1 += 2;      // 7
        $var2 = 4;       // 4
        $my_var += 3;    // 8  引用:内部变外部也跟着变
        return $var2;   //4
    }
    
    $my_var = 5;
    echo foo($my_var)."</br>";
    echo $my_var."</br>";
    echo $var1."</br>";
    echo $var2."</br>";
    $bar = 'foo';
    $my_var = 10;
    echo $bar($my_var)."</br>";
    
    //结果:
    //4
    //8
    //7
    //10
    //4
  • 相关阅读:
    如何缓解考前紧张和焦虑
    **浅谈差分【复习】**
    杂题训练之十一
    浅谈dfs/Tarjan找环【复习】
    杂题训练之十一
    杂题训练之十
    动态规划训练之二十
    浅谈欧拉函数【复习】
    数论训练之五
    浅谈杨辉三角【复习】
  • 原文地址:https://www.cnblogs.com/xlzfdddd/p/9898863.html
Copyright © 2020-2023  润新知