【PHP常见面试题 PHP基础-自定义函数及内部函数】自定义函数及内部函数考察点

一、考点

1. 变量的 作用域静态 变量;

1) 变量的作用域:

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

① global关键字:

// global关键字
$outer = 'str'; // 全局变量
function mgfunc()
{
    global $outer; // 可以把外部的变量拿到内部来使用
    echo $outer; // 局部变量
}// 里面的 $outer 和 外面的 $outer不是一个变量

② $GLOBALS 及 其他超全局数组:

// $GLOBALS
$outer = 'str';
function mgfunc()
{
    $GLOBALS['outer']; 
}

2) 静态变量:

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

static 关键字

1) 仅初始化一次;
2) 初始化时需要赋值;
3) 每次执行函数该值会保留;
4) static 修饰的变量是局部的【仅在函数内部有效】;
5) 可以记录函数的调用次数,从而可以在某些条件下终止递归。

代码实现:

function mgFunc()
{
    static $a = 1;
    echo $a++;
}
myFunc(); // 1
myFunc(); // 2
myFunc(); // 3

2. 延伸

1) 函数的参数及参数的引用传递

1) 默认情况下,函数参数通过值传递;
2) 如果希望允许函数修改它的值,必须通过引用传递参数。

① 值传递 代码实现:

// 值传递:不管函数内部如何改变,函数外部不会改变
$a = 1;
function myFunc($a)
{
    $a = 2;
}
myFunc($a);
echo $a; // 1 

引用传递 代码实现

// 引用传递:只要函数内部的值改变,函数外部的值就会发生改变【只能传变量,不可以传一个固定的值】
$a = 1;
function myFunc(&$a)
{
    $a = 2;
}
myFunc($a);
echo $a; // 2 

2)函数的返回值及引用返回

① 函数的返回值:

1) 值通过使用可选的返回语句(return)返回;
2) 可以返回包括数组和对象的任意类型;
3) 返回语句会中止函数执行,将控制权交回函数调用处;
4) 省略 return,返回值为 NULL,不可有多个返回值;【若想返回多个值,可以返回一个数组,把多个值放到一个数组中】

② 函数的引用返回:

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

代码实现:

function &mgFunc()
{
    static $b = 10;
    return $b;
}
$a = myFunc(); // 10
$a = &myFunc(); // $a与$b互为引用,此时将$b = 10,赋值给$a
$a = 100; // 修改 $a的值,函数中 $b的值也会发生改变【指向的是一个内存空间】
echo myFunc(); // 100

分析:

function &myFunc()
{
    static $b = 10;
    return $b;
}

echo '引用前函数的值:'.myFunc().'<hr>'; // 10

$a = &myFunc(); // $a = 10【将函数中$b的值赋值给$a】

$a = 100; // ($a的值发生改变,$b的值也发生改变,因为二者指向同一个内存空间)

echo '引用后函数的值:'.myFunc(); // 100

运行结果:

函数的引用


3)外部文件的导入

1) include/require语句包含并运行指定文件;
2) 如果给出路径名按照路径来找,否则从 include_path 中查找;
3) 如果 include_path 中也没有,则从 调用脚本文件所再的目录 和 当前工作目录下 寻找;
4) 当一个文件被包含时,其中所包含的代码都继承了 include 所在行的变量范围。

includerequire 的区别

1) 加载过程中未找到文件,则 include结构会发出一条警告;这一点和 require不同,后者会发出一个致命错误;
2) require 在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致 脚本中止;而 include 只产生警告(E_WARNING),脚本会继续运行。

include_once/require_oncerequire/include 的区别

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

4)系统内置函数

① 时间日期函数

date();      // 格式化一个本地时间/日期
strtotime(); // 将任何字符串的日期时间描述解析为 Unix时间戳
mktime();    // 取得一个日期的 Unix时间戳
time();      // 返回当前的 Unix 时间戳
microtime(); // 返回当前 Unix时间戳 和 微妙数
date_default_timezone_set("RPC"); // 设置时区

② IP处理函数

ip2long(); // 将 IPV4 的字符串互联网协议转换成整型数字
long2ip(); // 将长整型转化成字符串形式带点的互联网标准格式地址(IPV4)

③ 打印处理

print();     // 输出字符串
printf();    // 输出格式化字符串
print_r();   // 以易于理解的格式打印变量
echo;        
sprintf();   // 返回格式化字符串
var_dump();  // 打印变量的相关信息
var_export();// 输出或返回一个变量的字符串表示

区别:

  • print 和 echo 的区别:
    • printecho 都是语言结构;
    • print 在打印的时候,只能打印一个变量,而 echo 可以打印多个变量,如果同时打印多个,中间用逗号隔开,效率更高【推荐使用】
  • printf() 和 sprintf() 的区别:
    • printf() 可以根据格式进行输出,会直接输出到缓存区;
    • sprintf() 会返回,不会输出。
  • print_r() 和 var_dump() 的区别:
    • print_r() 会将数组/对象进行格式化好,并打印出来【帮助我们进行排查一些错误或结果】;
    • var_dump()也有 print_r() 的功能,且 var_dump() 还会将每一个的类型显示出来;
    • 根本区别:如:打印 FALSEprint_r() 什么都不会有,只相当于是 echo 了一个 FALSE,什么都没有print_r() 如果打印一个 TRUE,结果不是 true 而是 1,因此在一些结果的判断中,会有一些误差,则【推荐使用 var_dump()】。
  • var_export 与 var_dump() 的区别:
    • var_export() 是将内容(如将一个数组)进行格式化并输出,当然也可以给后面的参数一个 true,这样会变成返回;
    • 对于 var_export()来说,它返回的值 符合PHP的语法结构(如可以把它打印出来的一个字符串,作为PHP的语法结构来使用),而 var_dump()不可以,var_dump()只是帮我们进行 debug,来查看一下 我们的错误信息 或者是 结果信息。

④ 序列化及反序列化函数

serialize(); // 产生一个可存储的值的表示
unserialize(); // 从已存储的表示中创建PHP的值

⑤ 字符串处理函数

explode(); // 使用一个字符串分割另一个字符串
implode(); // 将一个以为数组的值转化为字符串
join();    // 别名 implode()
strrev();  // 反转字符串
trim();    // 去除字符串首尾处的空白字符串(或者其他字符)
ltrim();   // 删除字符串开头的空白字符(或其他字符)
rtrim();   // 删除字符串末端的空白字符(或者其他字符)
strstr();  // 查找字符串的首次出现
strpos();  // 查找字符串首次出现的位置【返回字符串所在的下标】
strrchr(); // 查找指定字符在字符串中的最后一次出现
substr();  // 返回字符串的子串
number_format(); // 以千位分隔符方式格式化一个数字
str_replace();   // 子字符串替换
...

⑥ 数组处理函数

array_keys();      // 返回数组汇总部分的或所有的键名
array_values();    // 返回数组中所有的值
array_combine();   // 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
array_diff();      // 计算数组的差集
array_intersect(); // 计算数组的交集
array_merge();	   // 合并一个或多个数组
array_shift();     // 将数组开头的单元移除数组
array_unshift();   // 在数组开头插入一个或多个单元
array_pop();       // 弹出数组最后一个单元(出栈)
array_push();      // 将一个或过个单元压入数组的末尾(入栈)
sort();			  // 对数组排序(从低到高)
...

二、解题方法

着重 记忆 PHP函数的定义相关内容,理解变量作用域、静态变量、函数的参数和返回值的相关内容,重点记忆我们总结的内置函数。


三、真题

1、写出如下程序的输出结果:
$count = 5; // 不能在函数内部使用 
function get_count()
{
    static $count;
    return $count++;
}
echo $count; // 5
++$count; 

echo get_count(); // NULL
echo get_count(); // 1

分析:执行顺序如下

1) $count = 5;
2) echo $count; // 5
3) ++$count; // 6

4) echo get_count(); // NULL
    function get_count()
    {
		static $count; // NULL 【局部变量】
		return $count++; // 1
    }
    
5) echo get_count(); // 1
	function get_count()
	{
        static $count; 
        return $count++; // 1
	}

执行结果:

5 NULL 1
由于NULL不输出,因此运行结果为:5, 1

运行结果:

在这里插入图片描述


2. 写出下列函数的执行结果:
$var1 = 5;
$var2 = 10;

function foo(&$my_var)
{
    global $var1;
    $var1 += 2;
    $var2 = 4;
    $my_var += 3;
    return $var2;
}

$my_var = 5;
echo foo($my_var).'<br>'; // 4
echo $my_var.'<br>'; // 8
echo $var1.'<br>'; // 7
echo $var2.'<br>'; // 10
$bar = 'foo';
$my_var = 10;
echo $bar($my_var).'<br>'; // 4

分析:

  • 考点
1) 全局;
2) 变量作用域;
3) 引用传参;
4) 返回值
  • 执行顺序分析:遇到函数先跳过,当执行的时候,再去分析
// 第一步
$var1 = 5;
// 第二步
$var2 = 10;
// 第三步
$my_var = 5;

// 第四步:调用 foo函数
echo foo($my_var).'<br>'; // 返回结果:4 
// 将全局变量$my_var拿到函数中
function foo(&$my_var) 
{
    global $var1; // 5
    $var1 += 2; // 7 【全局】
    $var2 = 4; // 4 【局部】
    $my_var += 3; // 8【此处的 $my_var指传入的值,即 $my_var = 5】
    return $var2; // 4
    
}

// 第五步
echo $my_var.'<br>'; // 返回结果:8 【由于$my_var是引用进去的,因此里面的值改变,外面的也改变】

// 第六步
echo $var1.'<br>'; // 返回结果:7
// 第七步
echo $var2.'<br>'; // 返回结果:10
// 第八步
$bar = 'foo';
// 第九步
$my_var = 10;

// 第十步:调用函数 foo
echo $bar($my_var). '<br>'; // <=> echo foo($my_var);【可变函数】 // 返回结果:4
// 将 $my_var = 10 传入函数
function foo(&$my_var)
{
    global $var1; // 7 【全局】
    $var1 += 2; // 9 【全局】
    $var2 = 4; // 4 【局部】
    $my_var += 3; // 13 
    return $var2; // 4
}

运行结果:

在这里插入图片描述

注意事项:在读题的时候,遇到函数,不要先进行读,当函数执行的时候再去读;没有执行就跳过,没执行则表示函数中的内容未参与运算,不要去管,否则会越看越乱!!!

猜你喜欢

转载自blog.csdn.net/studyphp123/article/details/83511936