PHP面试知识【深入理解】

本文深入探讨了PHP中的引用变量,解释了如何通过`&`定义引用,并详细阐述了PHP的COW(Copy-On-Write)机制。通过示例展示了在赋值和修改过程中内存的变化。此外,还讨论了常量、正则表达式、会话控制以及函数中的静态变量。同时,提到了nginx与apache的区别,以及多线程在PHP中的实现。最后,涉及了一些编程面试题及其解答。
摘要由CSDN通过智能技术生成

PHP基础知识考点

引用

  • 1.什么是引用变量?在PHP中,用什么符号定义引用变量
    引用意味着用不同名字访问同一个变量,定义方式 &
$a = range(1,100);
$b = $a;

在这里插入图片描述
这是当前内存使用情况,为啥不是开辟新空间给b呢?因为php的 COW(copy on write)机制,只有修改了才会开辟新空间

$a = range(1,100);
$b = $a;
$a = range(1,100);

在这里插入图片描述
就会变成这样。
用函数来查看实际情况

//定义一个变量
$a = range(1, 1000);
var_dump(memory_get_usage()); 
//定义变量b,将a变量的值赋值给b
//注意!!!这里只是把$b指向了$a的地址,COW机制,copy on write ,只要进行了修改操作,才会新开辟一个空间
$b = $a;
var_dump(memory_get_usage());

//如果这里对a修改了
$a = range(1,1000);
var_dump(memory_get_usage());
//这里就会开辟新的空间给a

打印结果如下图:
在这里插入图片描述
我们可以看到,第一次和第二次内存空间并没太多变化,第三次就发生了变化

再看一段代码

<?php
//定义一个变量
$a = range(1, 1000);
var_dump(memory_get_usage());
//定义变量b,将a变量的值赋值给b
//注意!!!这里只是把$b指向了$a的地址,COW机制,copy on write ,只要进行了修改操作,才会新开辟一个空间
$b = &$a;
var_dump(memory_get_usage());
$a = range(1,1000);
var_dump(memory_get_usage());

在这里插入图片描述
我们发现内存没有变化。这是为何? 因为使用了引用 KaTeX parse error: Expected 'EOF', got '&' at position 3: b=&̲a,

当使用引用之后,无论怎么变, a , a, a,b都会指向同一个内存区域

  • unset 这个函数不会销毁变量,只会切断指向。php回收机制就是没有指向的值就会被销毁
  • 对象本身就是引用传递

面试题:

<?php
$a = ['aa','bb','cc'];
foreach ($a as $key => $value) {
	$value = &$a[$key];
}
//每次循环结束后$a的值是什么?
//程序最终结果$a的值是什么?
//分析 

**第一次 k=0 ,v=aa 循环体内 a[0]的地址给了v,cow机制,修改就创建新地址,所以,内存原v的地址没有了,新建了新的v地址,内存和a[0]相等,所以,第一个值还是aa 所以结果为 aa bb cc
第二次 k=1,v=bb 循环体内 a[1]为bb,地址给了v,cow开启新的空间,因为第一次a[0]和v共享一个地址,现在改变了v,所以 bb bb cc
第三次 k=2,v=cc 循环体a2为cc 地址给v,cow开辟新空间,a[1]的地址和v共享,现在v为cc,所以a[1]的地址为cc,a2也是cc 结果 bb cc cc
最终 bb cc cc
这种可以总结为,第一次和原数据一样,往后的每一次的值会覆盖上一次的值,只会覆盖上一次的值
**

常量

  • 定义字符串的方法
    ·- 单引号,双引号, Heredoc=双引号,Newdoc=单引号

运算符

流程控制

函数

  • 静态变量
    1. 仅初始化一次
    2. 初始化时需要赋值
    3. 每次执行函数该值会保留
    4. static 修饰的变量是局部的,仅在函数内部有效
    5. 可以记录函数的调用次数,从而可以在某些条件下终止递归
  • 试题
<?php
$num = 5;
function get_count($n){
	static $num; 
	return $num++ + $n;
}
echo $num;
++$num; 
var_dump(get_count(1));
var_dump(get_count(2));

在这里插入图片描述

  • 分析一下为啥是这个结果
$num = 5,第一次echo 所以 值为5
++$num 此时$num的值加了1 值为6
调用函数  get_count(1)
static $num 局部变量,和外面的$num不一样,那是全局,所以这是两个东西。所以$num = null
$num++ + $n    $num++[后值加1] 所以return出去的$num还是null1 null+1 = 1
调用函数  get_count(2)
因为有static 所以只初始化一次,等于第二次,static $num这个就不会执行,因为经过了上一次的调用,此时的$num已经+1,后置就是只要$num++后面还有操作,就会+1,所以$num=1,然后又是后置,所以结果为1+2 = 3
如果我们再加一个呢  get_count(5)
$num此时为2 所以结果是2+5 = 7

正则

  • 正则表达式的作用:分割,查找,匹配,替换字符串
  • 分隔符:/ # ~
  • 通用原子:\d【数字0-9】 \D【取反,除了0-9】 \w【数字,字母下划线】 \W【除了数字字母下划线】 \s【空白符】 \S【除了空白符】

会话控制

session_set_save_handler 【操作mysql,redis等】

新更新

  1. tp 和 Smarty的区别
    tp是一个PHP web框架,
    Smarty是一个PHP的模板引擎,模板引擎说白了就是一个大型正则匹配库,匹配一些字段替换为PHP语法在html中输出
  2. nginx和apache区别
    nginx轻量级,处理静态资源快,抗高并发能力强,请求是异步非阻塞
    apache,重量级,请求是同步阻塞,模块稳定,Bug少
    延申知识点:
  • 程序执行就会创建进程,进程会创建线程,线程是共享当前进程的资源的。一般线程做两件事,执行cpu命令,二是处理数据或者请求。
  • 阻塞和非阻塞的理解,当线程io处理数据,是否要自己等待结果返回才继续处理下一个操作,如果需要等待,那就是阻塞,反之就是非阻塞
  • 同步和异步的理解,线程io处理完的结果是否主动通知给你,如果结果需要线程主动等待给出,就为同步,而如果是等结果处理完主动通知你,就是异步
  1. 输入整数n,求m,m>9,m中各个数位的乘积=n的最小整数,如n=36,m=49 【贪心算法】
  2. 二叉树前序遍历的非递归实现
  3. 求第 n 个数,这个序列满足(2i)*(3j)*(5^k),前 7 个为:2,3,4,5,6,8,10…
  4. PHP有没有多线程
    没有,但是可以依靠exec和pthreads扩展来实现
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值