PHP工程师笔试主观题

啊南 1493阅读 2020.04.01

【导语】: 笔试主观题,是PHP工程师笔试考核中最重要的一道关卡,分数所占的比重高,主要是为了检测各位求职者的专业知识和语言表达能力。只要多写多练,就可以轻松拿下主观题的分数!

PHP工程师笔试主观题5例

1、从命名、定义和作用等方面阐述PHP变量和常量的区别。
答:
(1)常量前面没有美元符号($) 
(2)常量只能用 define() 函数定义,而不能通过赋值语句
(3) 常量可以不用理会变量范围的规则而在任何地方定义和访问 
(4)常量一旦定义就不能被重新定义或者取消定义 
(5) 常量的值只能是标量 
2、HTML、JavaScript、CSS和PHP分别在一个网站开发中承担什么作用。
答:
HTML:超文本标记语言,是网页的组成部分是一种标记性语言。
JavaScript:是一种嵌入在浏览器内的客户端的脚本语言,属于解释型语言,是html中用来动态交互的脚本。
CSS:叠层样式表,是一种用来表示HTML或XML等文件样式的计算机语言。
PHP:是后台服务器语言,在服务器上面编译,包括了对服务器上面的其内容的操作。
3、阐述表单的两种提交方式get和post的区别。
答:表单提交中get和post方式的区别有5点  
1.get是从服务器上获取数据,post是向服务器传送数据。
2.get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTPpost机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。 
3.对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。 
4.get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
5.get安全性非常低,post安全性较高。
4、列举3个常用的预定义数组及其含义。
答:$_SERVER:变量由web服务器设定或者直接与当前脚本的执行环境相关联 $_ENV:执行环境提交至脚本的变量 $_GET:经由URL请求提交至脚本的变量 
$_POST:经由http post方法提交至脚本的变量 
$_REQUEST:经由get、post和cookie机制提交至脚本的变量,因此该数组并不值得信任 
$_FILES:经由http、post文件上传而提交至脚本的变量 $_COOKIE:经由http cookies方法提交至脚本的变量 $_SESSION:当前注册给脚本会话的变量
$GLOBALS:包含一个引用指向每个当前脚本的全局变量范围内有效的变量。该数组的键名为全局变量的名称 
5、Apache,PHP,MySQL在网站开发中承担什么作用? 
答:
Apache: Web服务器软件,它快速、可靠并且可通过简单的API扩充,将Perl/Python/Php等解释器编译到服务器中。
PHP:是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。
MySQL: MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。与Oracle、DB2、SQL Server 等数据库类似。

PHP工程师笔试主观题10例

1、变量赋值方式有哪几种?  
1)直接赋值   $str = 123;  
2)变量间赋值 
        $arr = array();
        $arr[] = 123; 
        $arr[] = 456;  
        $a; 
        $a = 123;  
3)引用赋值
        $a = 123; 
        $b = $a;  
2、引用和拷贝有什么区别? 
 拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。
 引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。
3、 php中变量有哪些基本数据类型?  
php支持8种原始数据类型。
 包括: 
 四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string)  
 两种复合类型(数组array , 对象object) 
 两种特殊类型(资源resource,NULL)  
4、其它类型转换为boolean类型时,哪些被认为是false? 
 布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串'0', 空数组, 空对象, 特殊数据类型NULL, 没有设定的变量。
5、常量和变量有哪些区别? 
 1)常量前没有$符号; 
 2)常量只能通过define()定义,而不能通过赋值语句定义; 
 3)常量可以在任何地方定义和访问,而变量定义的反问有固定的规则; 
 4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定义; 
 5)常量的值只能是标量数据,而变量的数据库类型有8中原始数据类型。
6、函数的优越性有哪些? 
 提高程序的可维护性   
 提高软件的可靠性   
 提高程序的可重用性   
 提高程序的开发效率 
7. 如何定义一个函数?函数名区分大小写吗? 
 1)使用 function 关键字; 
 2)函数命名规则和变量一样,以字母或者下划线开头,而不能以数字开头; 
 3)函数名不区分大小写; 
 4)函数名不可以使用已经声明过的或者系统自建的函数名称。
8. 什么是局部变量和全局变量?函数内是否可以直接调用全局变量? 
 局部变量是函数内部定义的变量,其作用域是所在的函数。如果函数外还有一个跟局部变量名字一样的变量,程序会认为它们两个是完全不同的两个变量。当退出函数的时候,其中的局部变量就同时被清除。
 全局变量是定义在所有函数以外的变量,其作用域是整个php文件,但是在用户自定义的函数内部是无法使用的。
 如果一定要在用户自定义的函数内部使用全局变量,那么就需要使用global关键字声明。
 也就是说如果在函数内的变量前加上golbal来修饰,那么函数内部就可以访问到这个全局变量,不仅可以利用这个全局变量进行运算而且可以对这个全局变量进行重新赋值。全局变量还可以使用 $GLOBALS['var'] 来调用。
9. php中函数传递参数的方式有哪些?两者有什么区别?  按值传递和按地址传递(或按引用传递) 
 (1)按值传递、  待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对该变量值做的修改,不影响原本的变量值。
 (2)按地址传递、 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存中是同一个。函数体做的修改,直接影响到函数体外部的该变量的值。
10. 控制流程语句有哪些? 
 1:三种程序结构    顺序结构、分支结构、循环结构 
 2:分支: if/else/elseif/     switch/case/default 
 3: switch 需要注意的: 
  case子句中的常量可以是整型、字符串型常量、 或者常量表达式,不允许是变量。
  同一个switch子句中,case的值不能相同,否则只能取到首次出现case中的值。
 4: 循环  for while   do...while
    do...while 后面必须加入分号结尾。
    while 和 do...while 的区别 
 5:break 和 continue 的区别。
  break可以终止循环。
  continue没有break强大,只能终止本次循环而进入到下一次循环中

PHP工程师笔试主观题15例

1. 数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种? 
 数组是一个可以存储一组或一系列数值的变量(复合型变量) 
 索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值)  
 数组的声明方式主要有两种。
 1.通过array()函数声明数组; 
  可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。
 2.直接为数组元素赋值,不需要调用array()函数。例如:   $arr[0] = 1;   $arr[1] = 2;  特别注意: 
 数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。
    例如: $array[3] 与  $array['3'] 引用的是相同的一个元素,而 $array['03'] 引用的则就是另外的一个元素了。
2.数组如何遍历? 
 ①for循环 
        $arr[] = 123;
        $arr[] = 456; 
        $arr[] = 789; 
        for($i=0; $i<count($arr); $i++){
echo $arr[$i]."<br>";
}
 ②foreach循环  ,这是最常用的遍历方式。用法如下:foreach($arr as $key=>$value){} 
 ③list each 和while 配合起来循环  
3. foreach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢? 
 当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。
 而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset().  reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。 
4. 如何计算数组长度(或者说计算数组中所有元素的个数)?字符串怎么取长度?  count() -- 计算数组中的元素个数。
 可以使用count(数组名)或者count(数组名,1),如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。
 如果第二个参数是数字0,则等同于只有一个参数的count()函数。
 sizeof() -- count() 的别名
 字符串:strlen()、mb_strlen(); 
5. 数组中相关的常用函数有哪些? 
 1) count --(sizeof别名)— 计算数组中的单元数目或对象中的属性个数
      例如:int count ( mixed $var [, int $mode ] )  $var 通常都是数组类型,任何其它类型都只有一个单元。 $mode 默认值为0. 1为开启递归地对数组计数 
 2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 检查数组中是否存在某个值。
  如果 needle 是字符串,则比较是区分大小写的。
  如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。
 3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
   特别注意:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
   如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引 
 4) 数组与字符串之间的转换 
  (1)explode ( string $separator , string $string [, int $limit ] )  使用一个分隔字符来分隔一个字符串。
  (2)implode ( string $glue , array $arr )  使用一个连接符将数组中的每个单元连接为一个字符串。
  join 为 implode 的别名 
 5) sort(array &$array [, int $sort_flags ]) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。 
6、 数组合并函数array_merge()和数组加法运算$arr + $arr2 的区别是什么? 
 使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是后者附加到前者后面。
 使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃,也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。
7.页面字符出现乱码,怎么解决? 
 1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是 在header()函数中指定了charset;
  例如:    header(“content-type、text/html;charset=utf-8”); 
 2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致,两者必须保持统一; 
 3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一, 例如:mysql_query(“set names utf8”)。
8. 获取当前时间戳的函数主要有哪些? 
用PHP打印出今天的时间,格式是2010-12-10 22:21:21?  
用PHP打印出前一天的时间格式是2010-12-10 22:21:21? 
如何把2010-12-25 10、30、25变成unix时间戳?  
 echo date ("Y-m-d H、i、s" ,strtotime(‘-1,days’));    
 date('Y-m-d H、i、s',time()); 
 mktime(小时,分钟,秒,月,天,年);//将时间信息转化为时间戳 
 $unix_time = strtotime("2009-9-2 10、30、25");//变成unix时间戳 
 echo date("Y-m-d H、i、s",$unix_time);//格式化为正常时间格式  
9. 连接数据库操作的步骤是什么?每一步的返回值是什么数据类型?尤其是mysql_query()返回什么数据类型? 
连接数据库操作的步骤: 
① 建立与MySQL服务器的连接 
② 设置字符集;mysql_query("set names 'gb2312'") 
③ 选择要操作的数据库 
④ 创建结果集 
⑤ 将结果集中的一行记录读入数组中
 ⑥ 在网页上输出数组元素的值  
$conn=mysql_connect("servername","username","passward");//打开连接 
mysql_select_db("guestbook",$conn);//连接到指定的数据库 
$result=mysql_query("Select * from guestbook",$conn);//创建结果集  
10、设计网站的过程和步骤是什么? 
①可行性分析 ②功能需求分析 ③数据库设计 ④页面设计 ⑤后台程序开发 ⑥测试  ⑦发布
11、解释什么是session(会话)?并说明如下函数的作用 
session在Web开发语境下的语义又有了新的扩展,其含义是指:一类用来在客户端和服务器之间保持状态的解决方案 。有时候session也用来指这种解决方案的存储结构,如“把xxx保存在session里”。
(1)session_start() 
session_start() 会创建新会话或者重用现有会话。
(2)sessioin_destroy() 
session_destroy() 销毁当前会话中的全部数据, 但是不会重置当前会话所关联的全局变量, 也不会重置会话 cookie。
如果需要再次使用会话变量, 必须重新调用 session_start() 函数。
(3)session_unset() 
session_unset() 会释放当前会话注册的所有会话变量。
12、简述以下函数的作用。
Mysql_affected_rows( ) 
返回前一次MySQL操作所影响的记录行数 
mysql_error( ) 
返回上一个MySQL操作产生的文本错误信息 
mysql_num_rows( ) 返回结果集中行的数目 file_exists( ) 
检查文件或目录是否存在 
unlink( ) 删除文件 
move_uploaded_file( ) 将目标文件移动到指定位置 die( ) 
输出一条消息,并退出当前脚本 
in_array( ) 
搜索数组中是否存在指定的值 
explode( ) 
把字符串打散为数组 
implode( ) 
数组元素组合成字符串 
var_dump( ) 
打印显示一个变量的内容与结构,以及类型的信息 
print_r( ) 
打印关于变量的易于理解的信息 
13、WampServer这个软件集成了哪些工具,分别介绍这些工具在网站开发中的作用,有端口号的请说明默认端口号 
集成了Apache,PHP,MySQL。
APache:web服务器软件,可通过简单的API扩充,将解释器编译到服务器中。默认端口号80 
PHP:是一种通用开源脚本语言,用于web开发。
MySQL:是一种关联数据库管理系统。默认端口号3306 
14、简述索引数组和关联数组的区别及遍历方法。
索引数组是以数字为下标的的数组。可以采用for 循环来遍历。
关联数组是键值对数组采用foreach循环来遍历。
15、简述include( )函数和require( )函数的区别。
include()与require()的功能也基本相同(包含),但在用法上也有一些不同,include()是有条件包含函数,而require()则是无条件包含函数。
PHP程序执行到require()时,只会读取一次档案,故常放在程序开头,档案引入后PHP会将网页档重新编译,让引入档成为原先网页的一部分;若文件不存在,会报错然后停止运行。
PHP程序执行到include()时,每次皆会读取档案,故常用于流程控制区域,如条件判断或者循环中;若文件不存在,则给出警告但是脚本继续运行。
推荐使用require_once()和include_once(),可以检测文件是否有重复包含。