PHP面试 PHP基础知识 五(自定义函数和内部函数)
自定义函数
变量的作用域和静态变量
变量的作用域:变量的作用域也成为变量的范围,变量的范围即它定义上的上下文背景(也就是它生效的范围)。
大部分的PHP变量只有一个单独的范围。这个单独的范围跨度同样包含了include和require引入的文件。
global 关键字
$GLOBALS 及其他超全局数组
$outer = 'str'; //全局变量 不能拿到函数体内部使用 function mgfunc() { global $outer; //使用global关键字 可以把外部变量拿到内部使用 $GLOBALS['outer']; // 也可以把全局变量拿到函数内部使用 echo $outer; //局部变量 和外部变量没有关联 }
静态变量:静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不会消失。
static关键字
1、仅初始化一次
2、初始化时需要赋值
3、每次执行函数该值会保留
4、static修饰的变量是局部的,仅在函数内部有效
5、可以记录函数的调用次数,从而可以在某些条件下终止递归
function mgfunc() { static $a = 1; echo $a++; } myfunc(); //第一次调用 结果为1 myfunc(); //第二次调用 结果为2 myfunc(); //第三次调用 结果为3 //以上结果证明 static关键字声明静态变量 其值不会消失
延伸:函数的参数及参数的引用传递
默认情况下,函数参数通过值传递
全局变量如果希望允许函数修改它的值,必须通过引用传递参数
$a = 1; function myfunc( $a ) { $a = 2; } myfunc($a); echo $a; //输出结果为1 函数内部变量值改变与外部变量没有关系 //如果 希望内部函数修改全局变量的值 需要通过引用传参的方式& $a = 1; function myfunc( &$a ) { $a = 2; } myfunc($a); //只能传变量 echo $a; //输出结果为2
延伸:函数的返回值及引用返回
函数的返回
值通过使用可选的返回语句(return)返回
可以返回包括数组和对象的任意类型
返回语句会终止函数执行,将控制权交回函数调用处
省略return,返回值为null ,不可有多个返回值 返回多个值 可以返回一个数组 把值放在一个数组中
引用返回
从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&
function &myfunc() { static $b = 10 ; return $b; } echo myfunc(); //结果10 正常调用 $a = &myfunc(); // 此时就是把$a 和$b 互为引用 $a = 100; echo myfunc(); //结果为100;
延伸:外部文件的导入
include/require语句包含并运行指定文件
如果给出路径名按照路径来找,否则从include_path查找
如果include_path中也没有,则从调用脚本文件所在的目录和当前工作目录下寻找
当一个文件被包含时,其中所包含的代码继承了include所在行的变量范围
include和require的区别
加载过程中未找到文件则include结构会发出一条警告;这一点和require不同,后者会发出一个致命错误。
require在出错时产生E_COMPILE_ERROR级别的错误。就是说将导致脚本终止。
include只会产生警告(E_WARNING),脚本会继续执行。
require(include)/require_one(include_once)唯一的区别就是PHP会检查该文件是否已经被包含,如果是则不会再次包含。
延伸:系统内置函数
时间日期函数
//格式化一个日期 date() //将任何字符串的时间日期解析为时间戳 strtotime() //取得一个日期的时间戳 mktime() //返回当前时间戳 time() //返回当前Unix时间戳的微秒数 microtime() //在脚本中动态设置所有日期时间的时区 date_default_timezone_set() //获取脚本所有日期时间使用的时区 date_default_timezone_get()
ip处理函数
//把IP转换为整型数字(便于存储数据库) ip2long() //相反 把整型数字转换为IP long2ip()
打印处理函数
print() echo() //都是语言结构 不同是print只能打印一个 echo可以打印多个 用逗号隔开 printf() sprintf() //printf会根据格式进行输出 sprintf会返回不会输出 var_dump() print_r() //print_r会将数组对象格式化好打印出来 打印false不会有输出打印true输出1 // var_dump会把类型也打印出来 var_export() //将内容格式化输出 结果符合PHP语法结构
序列化及反序列化函数
//序列化用于存储或传递PHP值过程中,同时不丢失其类型和结构 //序列化 serialize() //反序列化 unserialize() //序列化函数原型如下 string serialize (mixed $value) //反序列化函数如下 mixed unserialize (sting $str)
字符串处理函数
//返回字符串长度 strlen() 例:strlen("hello world!"); 输出:12 //查找字符串内指定的字符或文本 strpos() 例:strpos("hello world","world"); 输出:world //将一个一维数组转化为字符串 implode() 例:$array = array('a','b','c'); $str = implode(',' , $array); 输出:a,b,c //将一个字符串转化为数组 explode() 例:$str = "a,b,c"; $array = explode(',' , $str); 输出:Array ( [0] => a [1] => b [2] => c ) //implode 的别名 join() 例:$arr = array('Hello','World!','I','love','Shanghai!'); echo join(" ",$arr); 输出:Hello World! I love Shanghai! //反转字符串 strrev() 例:echo strrev("I love Shanghai!"); 输出:!iahgnahS evol I //移除字符串两侧的空白字符和其他字符。 trim() 例:$str = "Hello World!"; echo trim($str,"Hed!"); 输出:llo Worl //移除字符串左侧的空白字符或其他字符 ltrim() 例:$str = "Hello World!"; echo ltrim($str,"Hello"); 输出:World! //移出字符串右侧的空白字符或其他字符 rtrim() 例: $str = "Hello World!"; echo rtrim($str,"World!"); 输出:Hello //搜索字符串在另一字符串第一次出现 返回字符串的剩余部分 strstr() 例:echo strstr("I love Shanghai!","Shanghai"); 输出:Shanghai! //通过千位分组来格式化数字 number_format() 例:echo number_format("5000000"); 输出:5,000,000
数组处理函数
//返回数组中的所有键名 array_keys() 例:$a=array("a"=>"apple","b"=>"pear","c"=>"peach"); print_r(array_keys($a)); 输出:Array ( [0] => a [1] => b [2] => c ) //返回数组中的所有值 array_values() 例:$a=array("a"=>"apple","b"=>"pear","c"=>"peach"); print_r(array_values($a)); 输出:Array ( [0] => apple [1] => pear [2] => peach ) //返会数组差集 array_diff() 例:$a=array("a"=>"apple","b"=>"pear","c"=>"peach","d"=>"banana"); $b=array("a"=>"apple","b"=>"pear","c"=>"peach"); print_r(array_diff($a,$b)); 输出:Array ( [d] => banana ) //返回数组交集 array_intersect() 例:$a=array("a"=>"apple","b"=>"pear","c"=>"peach","d"=>"banana"); $b=array("a"=>"apple","b"=>"pear","c"=>"peach"); print_r(array_intersect($a,$b)); 输出:Array ( [a] => apple [b] => pear [c] => peach ) //合并数组 返回一个新的数组 array_merge() 例:$a=array("c"=>"peach","d"=>"banana"); $b=array("a"=>"apple","b"=>"pear"); print_r(array_merge($a,$b)); 输出:Array ( [c] => peach [d] => banana [a] => apple [b] => pear ) //删除数组中的首个元素,并返回删除元素的值 array_shift() 例:$a=array("c"=>"peach","d"=>"banana"); print_r(array_shift($a)); 输出:peach //在数组开头插入一个或多个值 返回新数组元素个数 array_unshift() 例:$a=array("c"=>"peach","d"=>"banana"); print_r(array_unshift($a,'apple')); 输出:3 //删除数组的最后一个元素(出栈) 返回删除的值 array_pop() 例:$a=array("c"=>"peach","d"=>"banana"); print_r(array_pop($a)); 输出:banana //在数组的最后加入一个元素(入栈) 返回新数组的元素个数 array_push() 例:$a=array("c"=>"peach","d"=>"banana"); print_r(array_push($a, "apple")); 输出:3 //对数组进行排序 升序排序 成功返回true 失败返回false sort() 例:$array = array(4,6,2,22,11); var_dump(sort($array)); 输出:true //对数组进排序 降序排序 成功返回true 失败返回false rsort(); 例:$array = array(4,6,2,22,11); var_dump(rsort($array)); 输出:true
重点记忆PHP函数的定义相关内容,理解变量作用域,静态变量,函数的参数和返回值的相关内容,重点记忆上面的内置函数