结合实际 PHP 面试,汇总自己遇到的问题,以及网上其他人遇到的问题,尝试提供简洁准确的答案
1、echo、print、print_r、var_dump 区别
-
echo和print是语言结构、print_r和var_dump是普通函数
-
echo:输出一个或多个字符串
-
print:输出字符串
-
print_r:打印关于变量的易于理解的信息
-
var_dump:打印关于变量的易于理解的信息(带类型)
2、单引号和双引号的区别
双引号可以被分析器解析,单引号则不行
3、isset 和 empty 的区别
-
isset:检测变量是否已设置并且非 NULL
-
empty:判断变量是否为空,变量为 0/false 也会被认为是空;变量不存在,不会产生警告
4、static、self、$this 的区别
-
static:static 可以用于静态或非静态方法中,也可以访问类的静态属性、静态方法、常量和非静态方法,但不能访问非静态属性
-
self:可以用于访问类的静态属性、静态方法和常量,但 self 指向的是当前定义所在的类,这是 self 的限制
-
base64
25、ip2long 实现
ip2long124.205.30.150=2093817494 list($p1,$p2,$p3,$p4) = explode(',','124.205.30.150'); $realNum = $p1<<24+$p2<<16+$p3<<8+$p4;
26、MVC 的理解
MVC 包括三类对象。模型 Model 是应用对象,视图 View 是它在屏幕上的表示,控制器 Controller 定义用户界面对用户输入的响应方式。不使用 MVC,用户界面设计往往将这些对象混在一起,而 MVC 则将它们分离以提高灵活性和复用性
27、主流 PHP 框架特点
Laravel
易于访问,功能强大,并提供大型,强大的应用程序所需的工具
-
简单快速的路由引擎
-
强大的依赖注入容器
-
富有表现力,直观的数据库 ORM
-
提供数据库迁移功能
-
灵活的任务调度器
-
实时事件广播
Symfony
-
Database engine-independent
-
Simple to use, in most cases, but still flexible enough to adapt to complex cases
-
Based on the premise of convention over configuration--the developer needs to configure only the unconventional
-
Compliant with most web best practices and design patterns
-
Enterprise-ready--adaptable to existing information technology (IT) policies and architectures, and stable enough for long-term projects
-
Very readable code, with phpDocumentor comments, for easy maintenance
-
Easy to extend, allowing for integration with other vendor libraries
CodeIgniter
-
基于模型-视图-控制器的系统
-
框架比较轻量
-
全功能数据库类,支持多个平台
-
Query Builder 数据库支持
-
表单和数据验证
-
安全性和 XSS 过滤
-
全页面缓存
ThinkPHP
-
采用容器统一管理对象
-
支持 Facade
-
更易用的路由
-
注解路由支持
-
路由跨域请求支持
-
验证类增强
-
配置和路由目录独立
-
取消系统常量
-
类库别名机制
-
模型和数据库增强
-
依赖注入完善
-
支持 PSR-3 日志规范
-
中间件支持
-
支持 Swoole/Workerman 运行
28、对象关系映射/ORM
优点
- 缩短编码时间、减少甚至免除对 model 的编码,降低数据库学习成本
- 动态的数据表映射,在表结构发生改变时,减少代码修改
- 可以很方便的引入附加功能(cache 层)
缺点
- 映射消耗性能、ORM 对象消耗内存
- SQL 语句较为复杂时,ORM 语法可读性不高(使用原生 SQL)
29、链式调用实现
类定义一个内置变量,让类中其他定义方法可访问到
30、异常处理
set_exception_handler — 设置用户自定义的异常处理函数
使用 try / catch 捕获
31、如何实现异步调用
$fp = fsockopen("blog.maplemark.cn", 80, $errno, $errstr, 30); if (!$fp) { echo "$errstr ($errno)<br />\n"; } else { $out = "GET /backend.php / HTTP/1.1\r\n"; $out .= "Host: blog.maplemark.cn\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); /*忽略执行结果 while (!feof($fp)) { echo fgets($fp, 128); }*/ fclose($fp); }
32、多进程同时写一个文件
加锁、队列
33、PHP 进程模型,进程通讯方式,进程线程区别
消息队列、socket、信号量、共享内存、信号、管道
34、PHP 支持回调的函数,实现一个
array_map、array_filter、array_walk、usort
is_callable + callbacks + 匿名函数实现
发起 HTTP 请求有哪几种方式,它们有何区别
cURL、file_get_contents、fopen、fsockopen
35、php for while foreach 迭代数组时候,哪个效率最高
36、弱类型变量如何实现
PHP 中声明的变量,在 zend 引擎中都是用结构体 zval 来保存,通过共同体实现弱类型变量声明
37、PHP 拓展初始化
- 初始化拓展
$ php /php-src/ext/ext_skel.php --ext
- 定义拓展函数
zend_module_entry 定义 Extension name 编写 PHP_FUNCTION 函数
- 编译安装
$ phpize $ ./configure $ make && make install
38、如何获取扩展安装路径
39、垃圾回收机制
引用计数器
40、Trait
自 PHP 5.4.0 起,PHP 实现了一种代码复用的方法,称为 trait
41、yield 是什么,说个使用场景 yield、yield 核心原理是什么
一个生成器函数看起来像一个普通的函数,不同的是普通函数返回一个值,而一个生成器可以yield生成许多它所需要的值
42、traits 与 interfaces 区别 及 traits 解决了什么痛点
43、如何 foreach 迭代对象、如何数组化操作对象 在这里插入图片描述 在这里插入图片描述
更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)
以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群
-
网友评论