版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2025年php考试题及答案一、单项选择题(每题2分,共20分)1.以下关于PHP变量作用域的描述,正确的是()A.使用global声明的变量会创建新作用域B.static关键字声明的变量在函数调用结束后会被销毁C.类属性默认作用域为publicD.闭包中无法访问父作用域的变量答案:C2.执行以下代码后,$result的值是()```php$arr=[1=>'a',2=>'b'];$result=array_merge($arr,[2=>'c',3=>'d']);```A.[1=>'a',2=>'b',3=>'d']B.[1=>'a',2=>'c',3=>'d']C.[0=>'a',1=>'b',2=>'c',3=>'d']D.[2=>'c',3=>'d',1=>'a']答案:B3.若要限制PHP脚本的最大执行时间为30秒,应使用()A.set_time_limit(30)B.ini_set('max_execution_time',30)C.bothAandBD.以上都不正确答案:C4.以下关于PHP异常处理的说法,错误的是()A.自定义异常类需继承Exception或其子类B.try块中抛出异常后,后续代码不会执行C.finally块中的代码仅在异常未被捕获时执行D.可以使用多个catch块捕获不同类型的异常答案:C5.执行以下代码,输出结果是()```php$x=5;echo$x&&($x=10)?'A':'B';```A.AB.BC.5D.10答案:A(运算符优先级:&&高于?:,$x为5(真),所以表达式为真,输出A)6.关于PHP命名空间,以下说法错误的是()A.命名空间声明必须在文件顶部(无其他输出)B.use语句可以导入类、函数或常量C.全局命名空间中的元素需用反斜杠开头访问D.一个文件只能声明一个命名空间答案:D(PHP7+支持同一文件声明多个命名空间)7.以下哪项不是PHP8.2引入的新特性?()A.只读类(readonlyclass)B.枚举(Enum)C.空合并运算符赋值(??=)D.不可变日期对象(ImmutableDateTime)答案:C(空合并赋值运算符在PHP7.4引入)8.使用PDO连接MySQL时,正确的DSN格式是()A.mysql:host=localhost;dbname=testB.pdo_mysql:host=localhost;dbname=testC.mysqli:host=localhost;dbname=testD.mysql:server=localhost;database=test答案:A9.以下代码的输出结果是()```phpclassA{publicfunctiontest(){echo'A';}}classBextendsA{publicfunctiontest(){parent::test();echo'B';}}$obj=newB();$obj->test();```A.ABB.BAC.AD.B答案:A10.若要获取当前请求的完整URL(含查询参数),最可靠的方法是()A.$_SERVER['REQUEST_URI']B.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']C.(isset($_SERVER['HTTPS'])?'https':'http').'://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']D.$_SERVER['PHP_SELF']答案:C二、填空题(每空2分,共20分)1.PHP中用于获取客户端IP地址的常用服务器变量是__________。(答案:$_SERVER['REMOTE_ADDR'])2.正则表达式中匹配非数字字符的元字符是__________。(答案:\D)3.实现自动加载类的函数是__________。(答案:spl_autoload_register())4.Laravel框架中,用于提供CSRF令牌的辅助函数是__________。(答案:csrf_token())5.PHP8.0引入的__________语法允许在函数参数中指定多种可能的类型。(答案:联合类型/UnionTypes)6.若要限制文件上传的最大大小,需修改php.ini中的__________和__________配置项。(答案:upload_max_filesize、post_max_size)7.数据库事务的四大特性(ACID)是原子性、一致性、__________、持久性。(答案:隔离性)8.使用password_hash()函数时,推荐的第二个参数是__________(填常量)。(答案:PASSWORD_DEFAULT)三、简答题(每题8分,共40分)1.简述mysqli扩展的面向对象模式与过程化模式的区别,并说明各自适用场景。答案:面向对象模式通过创建mysqli对象调用方法(如$conn->query()),代码更符合OOP规范,适合大型项目;过程化模式通过函数调用(如mysqli_query($conn,$sql)),适合小型脚本或习惯过程式编程的开发者。两者功能相同,但面向对象模式更易维护。2.解释PHP中“魔术方法”的概念,并列举至少4个常用魔术方法及其作用。答案:魔术方法是PHP预定义的以双下划线开头的方法,用于实现特定功能。常用魔术方法包括:__construct():构造函数,对象创建时自动调用;__destruct():析构函数,对象销毁时自动调用;__toString():对象转字符串时调用(需返回字符串);__get():访问不可访问属性时调用;__set():设置不可访问属性时调用;__call():调用不可访问方法时调用。3.说明Laravel框架中服务容器(ServiceContainer)的作用,并举例说明如何绑定自定义服务。答案:服务容器用于管理类的依赖注入和生命周期,实现松耦合。绑定自定义服务示例:在服务提供者的register()方法中使用$container->bind()或$container->singleton(),例如:```phppublicfunctionregister(){$this->app->bind(PaymentGateway::class,function($app){returnnewStripePaymentGateway(config('services.stripe.key'));});}```后续可通过类型提示或app()函数获取实例。4.对比PHP中session和cookie的区别(至少列出4点)。答案:存储位置:session存储在服务器端,cookie存储在客户端;安全性:session更安全(数据不暴露),cookie易被篡改(需加密);存储大小:session无严格限制,cookie通常限制4KB;生命周期:session默认随浏览器关闭失效(可延长),cookie可设置长期有效;传输方式:每次请求cookie会自动发送,session需通过session_id关联。5.列举PHP中防止SQL注入的主要方法,并说明其原理。答案:使用预处理语句(PreparedStatements):通过参数绑定分离SQL语句和数据,数据库将数据视为普通字符串;转义输入数据:使用mysqli_real_escape_string()或PDO::quote()转义特殊字符;限制用户输入类型:对数字、日期等字段进行类型校验;最小权限原则:数据库用户仅赋予必要权限(如只读)。四、编程题(共70分)1.(15分)实现一个用户登录验证函数,要求:接收用户名($username)和密码($password)参数;验证用户名是否存在(假设数据库表user,字段username、password_hash);验证密码是否匹配(密码已使用password_hash()存储);返回关联数组:成功时['status'=>true,'msg'=>'登录成功'],失败时['status'=>false,'msg'=>'用户名或密码错误'];包含必要的防SQL注入措施。答案:```phpfunctionuserLogin($username,$password){//连接数据库(示例使用PDO)$pdo=newPDO('mysql:host=localhost;dbname=test;charset=utf8','root','');$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);try{//预处理防止SQL注入$stmt=$pdo->prepare("SELECTpassword_hashFROMuserWHEREusername=:usernameLIMIT1");$stmt->bindParam(':username',$username,PDO::PARAM_STR);$stmt->execute();$user=$stmt->fetch(PDO::FETCH_ASSOC);if(!$user){return['status'=>false,'msg'=>'用户名或密码错误'];}//验证密码if(password_verify($password,$user['password_hash'])){return['status'=>true,'msg'=>'登录成功'];}else{return['status'=>false,'msg'=>'用户名或密码错误'];}}catch(PDOException$e){//实际生产环境应记录日志而非直接输出return['status'=>false,'msg'=>'服务器错误'];}}```2.(20分)编写一个函数,将数据库查询得到的商品分类数据(数组格式如下)转换为树形结构(要求使用递归或迭代实现)。输入示例:```php$categories=[['id'=>1,'name'=>'家电','parent_id'=>0],['id'=>2,'name'=>'手机','parent_id'=>1],['id'=>3,'name'=>'电视','parent_id'=>1],['id'=>4,'name'=>'苹果','parent_id'=>2],['id'=>5,'name'=>'华为','parent_id'=>2],];```输出示例(结构不限,需体现层级关系):```php['id'=>1,'name'=>'家电','children'=>[['id'=>2,'name'=>'手机','children'=>[['id'=>4,'name'=>'苹果','children'=>[]],['id'=>5,'name'=>'华为','children'=>[]]]],['id'=>3,'name'=>'电视','children'=>[]]]]```答案:```phpfunctionbuildCategoryTree(array$categories,$parentId=0){$tree=[];foreach($categoriesas$category){if($category['parent_id']==$parentId){$children=buildCategoryTree($categories,$category['id']);$category['children']=$children;$tree[]=$category;}}return$tree;}//使用示例(输出根节点为parent_id=0的分类)$result=buildCategoryTree($categories);//若需单根结构(如示例输出),可调整返回第一个元素//实际可能需要根据业务调整,如家电可能有多个根分类,此处假设只有一个根```3.(25分)设计一个日志记录类(LogWriter),要求:使用单例模式(确保全局唯一实例);支持记录不同级别日志(debug、info、warn、error);日志格式包含时间戳、级别、消息、可选上下文信息;日志写入文件时需处理并发写冲突(如加锁);日志文件按天分割(如2025-01-01.log)。答案:```phpclassLogWriter{privatestatic$instance;private$logDir=__DIR__.'/logs/';privatefunction__construct(){//初始化日志目录if(!is_dir($this->logDir)){mkdir($this->logDir,0755,true);}}privatefunction__clone(){}publicstaticfunctiongetInstance(){if(!self::$instance){self::$instance=newself();}returnself::$instance;}publicfunctiondebug($message,$context=[]){$this->log('debug',$message,$context);}publicfunctioninfo($message,$context=[]){$this->log('info',$message,$context);}publicfunctionwarn($message,$context=[]){$this->log('warn',$message,$context);}publicfunctionerror($message,$context=[]){$this->log('error',$message,$context);}privatefunctionlog($level,$message,$context){$timestamp=date('Y-m-dH:i:s');$logData=['timestamp'=>$timestamp,'level'=>$level,'message'=>$message,'context'=>$context];$logLine=json_encode($logData,JSON_UNESCAPED_UNICODE).PHP_EOL;$filename=$this->logDir.date('Y-m-d').'.log';$fp=fopen($filename,'a');if(flock($fp,LOCK_EX)){//独占锁fwrite($fp,$logLine);flock($fp,LOCK_UN);//释放锁}else{//记录锁失败处理(如写入临时日志)}fclose($fp);}}//使用示例$logger=LogWriter::getInstance();$logger->info('用户登录成功',['user_id'=>123]);$logger->error('数据库连接失败',['error'=>'PDOException']);```4.(10分)编写一个API接口签名验证函数,要求:客户端请求时携带参数:app_id(应用ID)、timestamp(时间戳)、sign(签名);签名提供规则:将除sign外的所有参数按字典序排序后拼接成字符串,再与应用密钥(app_secret)拼接,最后提供MD5哈希;服务端验证逻辑:检查时间戳是否在有效时间内(如5分钟)、验证签名是否正确。答案:```phpfunctionverifyApi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 承包装修宾馆合同范本
- 广告生产制作合同范本
- 德云社的演出合同范本
- 工程代建代销合同范本
- 学校的食堂承包协议书
- 幼儿园灭四害合同范本
- 客户交接资料合同范本
- 中班音乐活动教案歌曲郊游(2025-2026学年)
- 五年级数学上册小数除法第四课时教案北京版
- 完整版窗教案教学设计三(2025-2026学年)
- 2025-2026学年人教版七年级上册道德与法治期末试卷(含答案和解析)
- 无锡公建工程质量检测有限公司2025年下半年公开招聘专业技术人员备考题库及答案详解一套
- 部编版(2024)小学语文三年级上册期末综合质量调研卷(含答案)
- 2026年高级会计师面试题及答案解析
- 湖南省邵阳市2025-2026学年高二历史上学期期末模拟卷(试卷及全解全析)
- 2026年青海省海东地区单招职业倾向性测试模拟测试卷附答案
- 八年级数学 期末总结
- (2025版)腹膜后肿瘤诊治专家共识课件
- 2025年中国农业大学 高级生物化学 知到智慧树期末考试题库及答案
- 房地产公司各岗位绩效考核指标表4资料
- 基因编辑真菌鉴定
评论
0/150
提交评论