在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
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++) 。arg1、arg2、arg++ 参数将被插入到主字符串中的百分号(%)符号处。该函数是逐步执行的。在第一个 % 符号处,插入 arg1,在第二个 % 符号处,插入 arg2,依此类推。 可能的格式值:
④ 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
|
2022-08-17
2022-11-06
2022-07-29
2022-08-17
2022-08-12
请发表评论