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
原文地址:https://www.cnblogs.com/xlzfdddd/p/9898863.html