php常见面试题

1.哈希冲突解决办法
链地址法(拉链法) :value设置成链表
开放寻址法:当要插入一个元素时,可以连续地检查散列表的个各项,直到找到一个空槽来放置这个元素为止。检查顺序可以是线性的,可以是二次的,也可以是再次散列的。

2.静态变量
静态变量本身就是静态存储方式, 全局变量也是,局部变量不是
静态存储方式是指在程序运行期间分配固定的存储空间,静态存储变量通常是在变量定义时就分定存储单元并一直保持不变,直至整个程序结束。
动态存储变量是在程序执行过程中,使用它时才分配存储单元,使用完毕立即释放。
当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效全局变量作用于整个源程序

3.共享锁,排它锁的区别
共享锁【S锁】【读锁】
又称读锁,若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁【X锁】【写锁。】
又称写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。这保证了其他事务在T释放A上的锁之前不能再读取和修改A。

4.加密方法
对称加密和非对称加密
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)
非对称加密算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快
对称加密双方使用相同钥匙,安全性得不到保证
对称加密算法公开、计算量小、加密速度快、加密效率高、可逆

MD5加密,根据输出值,不能得到原始的明文,即其过程不可逆,任意长度的数据,算出的MD5值长度都是固定的。
php md5($str)  输出值为32位, MD5 也可以加盐之后再加密

Base64加密方式(可逆) php base64_encode($str) base64_decode($str)
AES加密(对称加密)
RSA加密(非对称加密)

5.操作数组,字符串的方法
数组: 
array() count sort asort ksort  is_array in_array foreach 
array_push():将一个或多个元素插入数组的末尾(入栈)。
array_pop():删除数组的最后一个元素(出栈)。
array_shift():删除数组中首个元素,并返回被删除元素的值。
array_unshift():在数组开头插入一个或多个元素。
range():创建包含指定范围单元的数组。
shuffle():将数组打乱。
array_reverse() : 返回一个单元顺序相反的数组
list(): 将数组中元素的值赋值给变量,批量声明变量
array_merge(): 合并一个或多个数组
array_key():返回数组中所有的键名
array_values():返回数组中所有的值

字符串:
strlen explode strpos substr md5 
strrev: 反转字符串
chunk_split:把字符串分割为一连串更小的部分
trim():去除字符串首尾处的空白字符(或者其他字符)
str_replace:以其他字符替换字符串中的一些字符
ucfirst: 将字符串第一个字符改大写
substr_count:计算子串在字符串中出现的次数
str_replace: 替换字符串函数
strstr():查找字符串的首次出现位置,返回 第一次出现的位置开始到结尾的字符串
addslashes(): 转义字符串
htmlspecialchars(): HTML 实体转义

6.魔术方法
__get():读取不可访问属性的值
__set():在给不可访问属性赋值
__isset() :当对不可访问属性调用 isset() 或 empty()
__unset():当对不可访问属性调用 unset() 
__construct():具有构造函数的类会在每次创建新对象时先调用此方法
__destruct(): 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
__call():在对象中调用一个不可访问方法
__callStatic(): 在静态上下文中调用一个不可访问方法时
_toString(): 用于一个类被当成字符串时应怎样回应

7.@是为了抑制错误显示
让用户看不到,提升用户体验。注意:只是抑制错误,但是错误还是存在的,还会抛出异常。

8.debug_backtrace() 
函数生成 backtrace(回溯跟
踪),函数栈信息
返回一个数组:
Array (     [0] => Array (         [file] => C:\webfolder\test.php         [line] => 6         [function] => c         [args] => Array (             [0] => Cleveland         )     )     [1] => Array (         [file] => C:\webfolder\test.php         [line] => 3         [function] => b         [args] => Array (             [0] => Glenn         )     )     [2] => Array (         [file] => C:\webfolder\test.php         [line] => 11         [function] => a         [args] => Array (             [0] => Peter         )     ) )

9.魔术常量
__LINE__
文件中的当前行号。
__FILE__
文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
__DIR__
文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。它等价于dirname(__FILE__)。除非是根目录,否则目录中名不包括末尾的斜杠。(PHP 5.3.0中新增) =
__FUNCTION__
函数名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该函数被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。
__CLASS__
类的名称(PHP 4.3.0 新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。在 PHP 4 中该值总是小写字母的。类名包括其被声明的作用区域(例如 Foo\Bar)。注意自 PHP 5.4 起 __CLASS__ 对 trait 也起作用。当用在 trait 方法中时,__CLASS__ 是调用 trait 方法的类的名字。
__TRAIT__
Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。
__METHOD__
类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。
__NAMESPACE__
当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

10.PHP三种访问修饰符
在PHP5中如果类没有指定成员的访问修饰符,默认就是public的访问权限。
 public(公共的、默认) 能在程序的任意地方引用,类内类外都可以引用,
 protected(受保护的) 声明的类内能用,继承类能引用
 private(私有的)只能在声明的类里引用

11.参数传递

12.global $GLOBALS
global 关键词用于在函数内访问全局变量。
$GLOBALS[index] 的数组中存储了所有的全局变量。下标存有变量名。这个数组在函数内也可以访问,并能够用于直接更新全局变量。
在 PHP 中,作用域是不重叠的,函数之外的是全局变量,函数内部定义的则是局部变量

13.数组排序

14.解析url
(1.)parse_url : 解析 URL 字符串。
返回一个数组{
  "scheme"    协议名
  "host"    域名
  "port"  端口号
  "path" 路径          例: "/path/login.php"
 "query"  请求参数  例 : "arg=value&a=b"
}
(2.)利用$_SERVER内置数组变量
QUERY_STRING: 查询字符串  例 : "arg=value&a=b"
HTTP_HOST: 当前请求头中 Host: 项的内容
REQUEST_URI: URI 用来指定要访问的页面。例如 “/index.html”。
(3.)利用pathinfo内置函数
$test = pathinfo("http://localhost:8080/path/index.php?a=b&c=d");
Array
(
    [dirname] => http://localhost:8080/path
    [basename] => index.php?a=b&c=d
    [extension] => php?a=b&c=d
    [filename] => index
)
(4.)利用basename内置函数
$test = basename("http://localhost/path/index.php?name=tank&sex=1#top");
结果如下
index.php?name=tank&sex=1#top

15.超全局变量
超全局变量是在全部作用域中始终可用的内置变量,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需执行 global $variable; 就可以访问它们。

$GLOBALS — 引用全局作用域中可用的全部变量
$_SERVER — 服务器和执行环境信息
$_GET — HTTP GET 变量
$_POST — HTTP POST 变量
$_FILES — HTTP 文件上传变量
$_REQUEST — HTTP Request 变量, 默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组
$_SESSION — Session 变量
$_ENV — 环境变量
$_COOKIE — HTTP Cookies

16.函数
函数名是大小写无关的

(1)目录:
is_dir(): 判断路径是否是目录
mkdir():创建目录
opendir() :打开目录句柄
readdir():返回目录中下一个文件的文件名
closedir():关闭目录句柄

(2)文件
file_exists() 判断文件是否存在
file_put_contents() 函数把一个字符串写入文件中。与依次调用 fopen(),fwrite() 以及 fclose() 功能一样。
file_get_contents() 把文件内容 或者 url返回的内容 全部读入字符串 
注:请求url可能存在超时的现象,如果php-fpg设置的是无超时时间,进而可能导致php-fpm进程一直占用, 阻塞请求处理,返回大量502
fopen():打开文件或者 URL
fwrite():函数写入文件(可安全用于二进制文件)
fclose():关闭一个打开文件
flock(): 锁定或释放文件

(3)排序
sort(),根据数组中元素的值,以英文字母顺序排序,索引键会由 0 到 n-1 重新编号。主要是当数组索引键的值无关紧要时用来把数组排序。
asort(),对数组value进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。
ksort(),根据数组中索引键的值,以英文字母顺序排序,特别适合用于希望把索引键排序的关联数组。

17.模板引擎
smarty是一个模板引擎,使用smarty主要是为了实现逻辑和外在内容的分离,如果不使用模板的话,通常的做法就是php代码和html代码混编。使用了模板之后,则可以将业务逻辑都放到php文件中,而负责显示内容的模板则放到html文件中。

18.PHP的垃圾回收机制
PHP可以自动进行内存管理,清除不再需要的对象。
PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

19.引用计数

20.php 中传值与传引用
变量默认总是传值赋值。
那也就是说,当将一个表达式的值赋予一个变量时,整个原始表达式的值被赋值到目标变量。这意味着,例如,当一个变量的值赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。
PHP 也提供了另外一种方式给变量赋值:引用赋值。
这意味着新的变量简单的引用(换言之,“成为其别名” 或者 “指向”)了原始变量。改动新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)。
对象默认是传引用。
对于较大的数据,传引用比较好,这样可以节省内存的开销。

21.常量
常量类似变量,但是常量一旦被定义就无法更改或撤销定义。
注释:与变量不同,常量贯穿整个脚本是自动全局的。
设置常量:define() 函数 const关键字 
Const可在类中使用,define不能

22.发送http请求函数
(1)curl
$ch = curl_init();  //初始化 cURL 会话
curl_setopt(); //设置 cURL 传输选项
curl_exec($ch); //执行 cURL 会话
curl_close($ch); //关闭 cURL 会话

(2)socket
gethostbyname()  //返回IP 网址
fsockopen() //打开一个网络连接或者一个Unix套接字连接
fputs() //写入文件
feof()  // 检测是否已到达文件末尾
fgets() //从文件指针中读取一行。
fclose() //关闭一个打开文件

(3)stream
stream_context_create() //创建资源流上下文
file_get_contents() //把整个文件一次性读入一个字符串中

23.php中require,include,use区分

24.合并数组+与array_merge的区别
1)键名为数字时,array_merge()不会覆盖掉原来的值,但+合并数组则会把最先出现的值作为最终结果返回,而把后面的数组拥有相同键名的那些值“抛弃”掉(不是覆盖) 

猜你喜欢

转载自blog.csdn.net/xal0610/article/details/79531757
今日推荐