尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

360春招PHP笔试客观题全解析:核心考点与答题策略

360春招PHP笔试客观题全解析:核心考点与答题策略 先说一个我个人的判断很多准备春招的同学尤其是瞄着大厂PHP岗位去的会把大量时间花在“刷算法题”和“背框架源码”上。但真正到了笔试现场第一关往往是几十道客观题——单选、多选、判断题。这一关不过后面的一切都是零。360公司2018春招这次PHP开发工程师的客观题合集我前前后后翻了几遍也带着团队里几个新人复盘过。它的风格代表了一类非常典型的“大厂基础能力扫描”不考偏题怪题而是把PHP开发日常中最容易忽略、最容易模糊的知识点铺开揉碎放在你面前。你做的时候会觉得“这题我见过”对答案的时候才发现“原来我从来就没真正搞懂过”。这篇文章我就借着这份合集把里面的核心考点、出题逻辑、以及我自己在带人过程中总结的答题经验完整拆开讲一遍。不管是准备笔试还是单纯想检验一下自己的PHP功底都值得花点时间过一遍。1. 这份笔试合集考什么——整体设计思路拆解1.1 为什么大厂笔试第一关是客观题先想明白一个问题为什么360这类公司明知道PHP开发日常写业务代码更多笔试却要先来几十道客观题我个人的理解是客观题是最公平、最高效的“知识面扫描器”。它不考验你临场发挥不考验编辑器熟练度就是单纯考察你脑子里有没有积累。PHP开发这行踩坑踩得多了很多知识是靠经验堆出来的。但笔试没法让你现场踩坑所以只能把“经验”变成“选择题”看你平时有没有把坑记住。这份合集的设计思路很明确从PHP基础语法、变量作用域、数组操作到面向对象、魔术方法再到MySQL、网络协议、Web安全最后落到框架和工程实践。覆盖面广但每道题的深度都不算钻牛角尖。它要的不是你会不会写一个高难度的算法而是你有没有一个完整的、扎实的PHP知识体系。1.2 考点分布与题型权重分析根据我对近几年大厂PHP笔试题的观察结合这份合集的题型分布可以大致画出一个考点权重。注意这个权重不是官方数据是我个人根据题目数量做的经验估算但八九不离十考点板块大致占比常见出题形式PHP语法与语言特性25%-30%单选、判断考的细节多数组与字符串函数15%-20%代码运行结果类题目面向对象与魔术方法15%单选、多选概念辨析MySQL与数据库10%-15%索引、SQL执行顺序、事务网络协议与Web安全10%状态码、Cookie/Session、注入/XSS框架与工程化5%-10%常以ThinkPHP等具体框架为引子数据结构与算法5%偏简单的栈、队列概念或者在主观题里出现这个分布暴露出一个趋势光会用PHP写页面不够你必须懂语言底层的运行逻辑懂Web交互的完整链路懂数据库这种外部依赖的基本原理。后面所有内容我都按这个权重逻辑来讲。2. PHP核心语法与语言特性考点精讲2.1 变量作用域、引用与传值的经典陷阱这部分是客观题的重灾区也是新手和老手区分度最高的地方。客观题特别喜欢考“下面代码的输出结果是”这类题本质上就是考察你对PHP变量机制的掌握程度。先看作用域。PHP的函数作用域和全局作用域是严格隔离的函数内部无法直接访问外部变量。很多人写代码遇到“明明定义了变量函数里却用不了”就是作用域问题。笔试常考的变体有两个一是函数内用global关键字声明后再使用二是通过$GLOBALS超全局数组访问。这里的核心记忆点是global $var不等于$var $GLOBALS[var]前者是建立引用后者是值拷贝。这个细微差别在函数内修改变量后外部变量是否变化上体现得淋漓尽致。再说引用和传值。PHP里对象默认就是引用传递PHP 5之后的版本都是这样而普通变量默认是值传递。笔试里最常见的坑是一个函数接收数组参数内部用foreach遍历并尝试修改值结果外部数组没变。因为foreach默认传的是值拷贝必须写成foreach ($arr as $value)才能修改原数组。但这里又引出一个更深的坑用引用遍历后$value这个变量在循环结束后仍然保留着对数组最后一个元素的引用。如果不unset($value)后续代码对$value的修改会意外改动数组的最后一个元素。这个点我在实际Code Review里抓到过不止一次笔试也爱考。$arr [1, 2, 3]; foreach ($arr as $value) { $value * 2; } unset($value); // 这行不能省 $value 100; var_dump($arr); // 如果没有unset这里的$arr[2]会被意外改成100这道题我建议每个准备笔试的人都亲手跑一遍理解unset($value)存在的意义。这不只是应付考试是真实项目里非常隐蔽的bug来源。2.2 字符串与数组函数考的是记忆宽度PHP的函数命名虽然历来被调侃“不一致”但它的函数库确实庞大。客观题不会要求你背完所有函数但高频的那几十个出题人默认你必须烂熟于心。字符串函数里substr、strpos、str_replace、explode、implode、trim、strlen、mb_strlen这几个是绝对高频。笔试的坑通常藏在两点第一substr返回的是空字符串还是FALSE。旧版行为和新版行为不一致会导致对结果判断出错。第二strpos找到字符串位置时返回的是整数0而0在松散比较下等于FALSE。所以正确写法是if (strpos($str, abc) ! false)用全等比较。这属于经典到不能再经典的考题。数组函数方面array_merge、array_diff、array_intersect、array_key_exists、in_array、array_unique、sort系列都是熟面孔。这里要特别提醒一个合并数组的细节使用array_merge合并两个键名为字符串的数组时如果键名相同后面的值会覆盖前面的但如果键名是全数字array_merge不会覆盖而是重新编号后追加。这是新手写配置合并时最容易踩的坑。$default [name default, limit 10]; $custom [limit 20, page 1]; var_export(array_merge($default, $custom)); // 输出[name default, limit 20, page 1] $nums1 [0 a, 1 b]; $nums2 [0 c, 2 d]; var_export(array_merge($nums1, $nums2)); // 输出[0 a, 1 b, 2 c, 3 d]这类题只要在本地跑过一次形成肌肉记忆笔试基本就不会错。怕的就是光看文档不实践到考场凭感觉猜。2.3 运算符优先级与类型比较错题率天花板如果说数组和字符串是“记忆题”那运算符和类型比较就是“逻辑题”而且错题率极高。因为PHP是弱类型语言和的区别0 abc的结果null false的结果这些在笔试里出现频率极高而且几乎每次都能放倒一批人。核心规律只有一条只比较值比较值和类型。但笔试要考的远不止这么简单。比如0 abc在PHP 7之前的版本里非数字字符串会转换成0所以这个表达式返回TRUE这是个非常反直觉的结果。PHP 8之后字符串和数字比较规则改了0 abc返回FALSE。不同版本下同一个表达式结果不同这种题目其实是在考你有没有关注PHP版本升级带来的行为变化。另一个高频考点是自增自减的返回时机。$i先返回后自增$i先自增后返回。这类题表面上考前置后置的区别实际也在考察你对“表达式返回值”这个概念的理解深度。我见过不少候选人写业务代码没问题但一遇到echo $i和echo $i的混合表达式立马露出马脚。建议复习时把PHP官方手册里的“类型比较表”完整看一遍那张表把null、false、0、0.0、0、、abc、[]之间的松散比较结果全列出来了。笔试前过一遍这张表比刷十套模拟题都管用。3. 面向对象与设计思想——最容易被轻视的板块3.1 魔术方法笔试的保留节目PHP的面向对象部分客观题最爱考的就是魔术方法。__construct、__destruct、__get、__set、__call、__callStatic、__toString、__clone、__autoloadPHP 7.2之后已废弃改用spl_autoload_register……每一个都对应一个特定的使用场景。出题人考魔术方法通常有两种方式。一种是直接问“当访问一个未定义的属性时会触发哪个魔术方法”答案当然是__get。另一种是给一段代码里面定义了__set和__get然后问某个赋值和读取操作分别触发了什么。后一种更绕因为它把“属性越权访问”和“魔术方法拦截”串在一起了。有一个细节很多人会忽略__get只对“不可访问属性”生效。包括未定义属性和私有属性外部访问。但如果在类内部访问私有属性是不会触发__get的。这个“内外有别”的细节就是客观题用来拉分的点。__toString也是高频题但坑通常在返回值上。如果__toString方法没有明确返回一个字符串而是返回了数组或者其他类型PHP会抛出致命错误。笔试会把这个过程包装成“请问以下代码会输出什么”或者“以下说法正确的是”。答案是会触发致命错误不是警告也不是静默忽略。这个概念延展到日志记录、异常处理场景里都需要格外小心。3.2 静态方法与类的延迟绑定面向对象部分还有一类必考内容类型约束、抽象类、接口、static::延迟静态绑定。延迟静态绑定是理解门槛较高的一个概念。假设父类中有一个方法使用了self::子类继承并调用这个静态方法时self::永远指向定义时的父类而不是运行时所在的子类。要解决就得用static::这个关键字会在运行时才决定由哪个类来解析调用。class A { public static function who() { echo __CLASS__; } public static function testSelf() { self::who(); } public static function testStatic() { static::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::testSelf(); // A B::testStatic(); // B这类题目思路清晰只要理解“self编译期绑定、static运行期绑定”就能全对。但我也见过不少工作两三年的开发在这道题上犹豫。原因很现实大部分业务代码用不到延迟静态绑定没用过自然不熟。但笔试就是要把这些“你不知道自己不知道”的地方挖出来。3.3 设计模式在客观题里的考法严格说设计模式不是PHP语言本身的知识但大厂PHP笔试几乎必考。常见考法是给你一段场景描述问你最适合用哪种设计模式。比如全局只允许一个实例避免重复连接资源单例模式连接数据库、缓存时最常用。为一个对象动态添加职责且职责可以组合装饰器模式。将请求发送者和接收者解耦多个对象都有机会处理请求责任链模式。定义算法骨架将某些步骤延迟到子类实现模板方法模式。出现Laravel和ThinkPHP之后又多了容器、门面模式等的考法。比如Facade本质上是“静态代理”的体现它让静态调用看起来像面向过程实际上背后走的是服务容器。这类题已经不只是考模式本身而是考模式在框架中的落地应用。复习的时候最好能对着一个框架源码找出它用到设计模式的几个具体位置。4. 数据库、网络与安全——拉开分差的实战知识4.1 MySQL索引与SQL执行顺序答错就露馅PHP开发日常离不开MySQL所以笔试对数据库的考察不会太浅。客观题里最常见的考点集中在两块索引和SQL执行顺序。索引方面考的是“哪些情况会导致索引失效”。这是一个特别接地气的话题。比如对索引列使用函数、隐式类型转换、左模糊查询LIKE %abc、联合索引不满足最左前缀原则等。笔试不会让你讲理论而是给一个WHERE条件问它能不能用到索引。这种题的判断标准只有一个能不能快速定位到有序的索引区间。比如WHERE name 张三和WHERE name 123如果name列是字符串类型但存储的都是数字第二个查询会把整数转成字符串再比较索引可能失效。这个细节在真实业务里也极其常见因为前端传过来的参数往往不区分类型。SQL执行顺序也是高频题。SELECT语句的书写顺序和逻辑执行顺序不一致很多人背了但不会用。实际执行顺序是FROM→WHERE→GROUP BY→HAVING→SELECT→ORDER BY→LIMIT。为什么先WHERE后HAVING因为WHERE是在分组之前过滤行HAVING是在分组之后过滤组。为什么SELECT在ORDER BY之前因为ORDER BY可以用别名排序而WHERE不能用别名过滤。这一系列“为什么”的答案都藏在执行顺序里。4.2 事务隔离级别与锁读已提交还是可重复读MySQL事务的考察在客观题里通常以“读现象”的形式出现。脏读、不可重复读、幻读三个概念要能准确对应到隔离级别。四个隔离级别按严格程度排序读未提交、读已提交、可重复读、串行化。其中读未提交可能发生脏读读已提交解决了脏读但可能发生不可重复读可重复读更进一步解决了不可重复读但InnoDB的默认隔离级别下通过间隙锁还能解决大部分幻读问题。笔试不会问“InnoDB默认隔离级别是什么”这种送分题而是给出一个具体的并发场景问“这个现象在哪个隔离级别下不会出现”。比如“事务A读取了一行数据事务B修改并提交了这行数据事务A再次读取发现数据变了这是什么现象”答案是不可重复读在可重复读隔离级别下不会发生。客观题还喜欢把行锁、表锁、间隙锁放在一起考。核心记忆点是行锁锁的是索引记录不是没有索引的记录行。如果查询条件没有命中索引InnoDB会退化为锁表。这和索引失效的知识点是连通的。复习时建议把“索引 - 执行计划 - 锁机制”串成一条线不要割裂地背。4.3 Cookie、Session与HTTP状态码Web基础不能含糊PHP是Web语言网络协议这一块完全绕不开。客观题考得最多的是Cookie和Session的区别、HTTP状态码的含义以及HTTP和HTTPS的差异。Cookie和Session这对概念几乎所有PHP笔试都会涉及。核心结论是Cookie存储在客户端浏览器Session存储在服务端Session通过在Cookie里保存一个会话ID通常叫PHPSESSID来识别用户。如果用户禁用了CookieURL重写技术也可以传递Session ID但PHP默认配置下是关闭的需要在php.ini里设置session.use_trans_sid 1。状态码部分200、301、302、400、401、403、404、500、502、503这十个是必须条件反射级别记住的。其中容易被坑的是301和302的区别301是永久重定向302是临时重定向。搜索引擎对两者的处理方式不同301会转移权重302不会。笔试如果问你“网站改版旧地址应该返回什么状态码以利于SEO”答案是301。还有一类变体是考“502 Bad Gateway和504 Gateway Timeout的区别”。502是网关Nginx收到了上游PHP-FPM的无效响应504是网关在指定时间内没等到上游的响应。这俩在线上排查时天天用客观题考到也不意外。4.4 Web安全SQL注入、XSS与CSRFWeb安全在客观题里的地位这几年越来越重。360本身就是安全公司自家的笔试题在安全这块出得很有水平。常见考法不是问“什么是SQL注入”而是给你一段代码让你判断哪里存在注入点。$id $_GET[id]; $sql SELECT * FROM users WHERE id . $id;像这种字符串拼接SQL的写法就是典型的注入入口。正确做法是使用预处理语句PDO预处理或mysqli_stmt而不是靠过滤函数去“堵漏洞”。为什么预处理更安全因为预处理将SQL结构和数据分离数据在到达数据库引擎之前已经被当作纯文本处理不会被解析为SQL语法。这是从设计上消除注入问题而不是事后补救。XSS的考点集中在反射型、存储型、DOM型的区分以及htmlspecialchars函数是否真的能防住所有XSS。笔试的坑在于htmlspecialchars默认只转义、、、、但如果你没有设置ENT_QUOTES单引号可能不被转义。另一个经典场景是属性注入img src[用户输入]如果用户输入 onerroralert(1)不加处理就能突破引号执行脚本。这道题考的是“上下文决定转义策略”——在HTML标签里输出和在属性里输出、在JavaScript里输出需要的编码方式完全不同。CSRF的经典概念是“跨站请求伪造”核心是利用浏览器自动携带Cookie的机制诱导用户在不知情的情况下发起请求。客观题常问的防御手段有这么几个校验Referer字段、使用Token令牌、二次确认操作。其中Token方案是目前的主流做法因为Referer可能因为隐私策略缺失或被伪造。Token在Laravel里就是csrf_token在ThinkPHP里也有对应的表单令牌机制。这里还想多说一句如果笔试题里出现了“SameSite Cookie属性”它也是CSRF防御体系的一部分SameSiteLax或Strict可以阻止跨站携带Cookie这是近几年安全策略里越来越重要的一环。这方面我整理了几道高频题型的解题思路。比如遇到SQL注入题先看有没有预编译/参数化遇到XSS题看输出是否经过编码以及输出位置的上下文遇到CSRF题看有没有Token。这套判断流程其实和做安全审计的流程是一致的。5. 客观题背后藏着的工程化考点5.1 自动加载、Composer与命名空间PHP工程化的基石在客观题里框架和工程化占比虽然不算最大但几乎必然出现。因为大厂用PHP不只是写脚本而是构建大规模Web应用这就绕不开自动加载、Composer、命名空间这三件套。自动加载经历了几个阶段__autoload已被废弃→spl_autoload_register→ Composer的vendor/autoload.php。客观题常问的是Composer生成的自动加载文件包含了哪两种自动加载方式答案是PSR-4和“Classmap”。PSR-4按命名空间和目录的映射关系动态加载Classmap则是在安装依赖时扫描生成一个类文件路径映射表加载速度更快但需要重新生成缓存。命名空间的考法更有意思。笔试给你两段代码一段是namespace App\Controllers;另一段是use App\Models;问这两者的关系。namespace声明的是当前文件里的类归属哪个命名空间use是在当前文件内引入别的类方便直接用短名称。很多人分不清这两者的区别其实跟文件系统里的“当前目录”和“快捷方式”很像。这里还有一个细节use只影响“导入别名”并不会真的加载类文件真正加载要靠自动加载机制。也就是说use只负责“让名字变短”不负责“让类存在”。5.2 错误处理与日志记录从题库到实战错误处理这个知识点客观题爱考error_reporting、ini_set、try-catch、set_exception_handler和set_error_handler这几者的分工。传统PHP的“错误”和“异常”是两个不同概念错误是PHP引擎产生的异常是代码里主动抛出的。两者捕获机制不同需要分别处理。笔试里最经典的判断题是“try-catch可以捕获所有PHP错误。”这个说法对不对严格说不对。E_PARSE这种解析错误无法在运行时捕获甚至E_WARNING级别的错误默认也不会进入catch除非通过set_error_handler将错误转成ErrorException抛出。到了实战层面PHP 7之后引入了Throwable接口Error和Exception都实现了它。推荐的做法是直接用catch (Throwable $e)来兜底这样不管是“错误”还是“异常”都能捕获。但注意捕获不等于解决Throwable兜底之后还要根据日志去定位问题这是线上排查的基本功。日志方面客观题偏简单主要考error_log函数和Monolog的区别。但我觉得这里有个更值得关注的题面转向现在的框架普遍使用PSR-3日志接口规范。Monolog是实现这个接口的主流库它有debug、info、notice、warning、error、critical、alert、emergency八个级别。笔试如果问到“想要记录一条不影响正常业务但需要关注的日志应该用哪个级别”答案是warning。这个分级意识和日志检索能力在实际的工作中用得比想象中多得多。5.3 队列与异步处理从笔试题到架构思维客观题偶尔会用“队列”做引子考察PHP开发对异步处理的理解。因为搜索热词里都出现了“PHP队列”可见大家对这个方向关注度很高。具体出题方式通常是某个耗时操作发邮件、生成图片缩略图、推送通知应不应该在请求周期内同步完成答案显然是否定的。生产环境里这样的耗时操作要丢进队列由独立的工作进程异步消费。常见的队列实现有Redis列表LPUSH/RPOP、RabbitMQ、Beanstalkd以及Laravel框架自带的队列系统。客观题通常不会要求你写队列代码但会考一个关键判断“把任务放入Redis队列时最应该注意什么”答案是任务消息的持久化和消费失败的处理。如果任务已经入队但消费者进程崩溃任务会不会丢失如果任务处理失败是重试还是进入死信队列这些意识和架构思维才是这类题目真正想考察的东西。6. 备考方法与答题技巧实录6.1 把“刷题思维”升级为“知识补全思维”复盘了这么多知识点我特别想强调一点不要为了笔试而刷题。很多人把网上能找到的PHP笔试题库刷了三遍答案都背下来了但遇到稍微变形的题目还是错。原因在于题库的答案覆盖的是“某个具体题目”而不是“某个知识点”。我建议的复习方法是每做完一套题把错题对应的知识点单独拎出来在PHP官方手册里找到原始说明亲手跑一遍示例代码再自己改改参数试试结果。这个过程能帮你把“这道题选C”的短期记忆转化成“这个行为背后的机制是什么”的长期理解。比如你错了一道关于array_map和array_walk区别的题别只记“array_map返回新数组array_walk返回布尔值”亲手跑一遍传引用进去看看原数组有没有被修改。这种细节只有在动手的过程中才能真正记住。6.2 时间分配客观题不能恋战360这份笔试是有时间限制的。客观题部分我的经验是平均每题不要超过1分钟拿不准的题先标记最后统一回看。遇到完全没头绪的题先蒙一个但别空着。为什么不能恋战因为Spring招聘的笔试通常后面还有编程题和问答题那些分值更高更需要整块的思考时间。客观题考的是知识面的下限主观题考的是能力的上限。在下限上过于纠结只会压缩上限的发挥空间。还有一个细节判断容易白给分数多选题要留意“少选得一半分、多选不得分”这类规则。不同公司的规则不同题目描述里通常会写清楚。有些人考前看了规则但没往心里去考场上手一抖多选了一个整题归零非常可惜。我个人应试的时候就习惯在选项前打个勾不确定选项就标个问号最后检查时再衡量要不要选。6.3 从笔试反推平时写代码就按笔试标准来最后聊点我自己的体会。带新人这几年我发现一个规律笔试成绩好的人往往不是考前突击最猛的人而是平时写代码就带着“一颗清醒的脑子”的人。他们写foreach时会想到引用变量的残留问题写SQL拼接时第一反应是预处理写Cookie时会想HttpOnly和Secure标记加没加。这些东西不是刻意背的而是踩过坑之后养成的习惯。笔试题目尤其是客观题本质上就是把你在真实开发中踩过的坑换了一层皮重新问你。所以备考的尽头不是刷题是平时工作的严谨程度。反过来如果你还没入职那就从现在开始把每一次写代码都当成一次笔试把每一个报错都当成一道错题搞清楚背后原因积累下去笔试和面试都只是时间问题。遇到一个知识点不会、没见过的框架或者说不上来的概念不要焦虑这是入行过程的必修课。我在这个行业待了十几年到现在看这类笔试题依然有收获依然有盲区。PHP这个生态足够大足够深想靠突击把所有知识点全吃透基本不可能。但反过来正因为每年都有新人把这类笔试题认真消化掉每年也都会有技术氛围扎实的团队能招到足够优秀的新人。如果你也在准备PHP方向的春招希望这篇文章能帮你把复习的重点和节奏理顺。笔试只是一个筛选动作真正的成长一定发生在这个过程中你搞清楚的那些“为什么”里。
返回列表