PHP工程师笔试题

1、列举几个你知道的块级元素和行内元素

块级元素写完后会自动换行,有宽高可以修改。

行内元素指的是书写完成后不会自动换行,并且元素没有宽和高。

块级元素有:body  from  select  textarea  h1-h6 html table  button  hr  p  ol  ul  dl  cnter  div

行内元素有:heda   meat   title  lable  span  br  a   style  em  b  i   strong

 

2、对行内元素设置margin-top 和margin-bottom是否起作用?

不起作用。(需要注意行内元素的替换元素img、input,他们是行内元素,但是可以为其设置宽高,并且margin属性也是对其起作用的,有着类似于Inline-block的行为)

 

3、解释一下css中px em rem ex cm单位是什么意思

px

相对长度单位。像素(Pixels)。

1in = 2.54cm = 25.4 mm = 101.6q = 72pt = 6pc = 96px

em

相对长度单位。相对于当前对象内文本的字体尺寸。

如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。

rem

相对长度单位。相对于根元素(即html元素)font-size计算值的倍数

ex

相对长度单位。相对于字符“x”的高度。通常为字体高度的一半。

如当前对行内文本的字体尺寸未被人为设置,则相对于浏览器的默认字体尺寸。

cm

厘米

 

4、在css中,选择器的优先级尤为重要,请你简述一下优先级“I-E-C”计算公式

这个计算叫做“I-C-E”计算公式,

  1. I——Id;
  2. C——Class;
  3. E——Element;

  即,针对一个css选择器表达式,行内元素就往特指度数值中加1000,遇到一个id就往特指度数值中加100,遇到一个class就往特指度数值中加10,遇到一个element就往特指度数值中加1。

 

5、描述一下css3实现动画的方式

一:创建动画:@keyframes规则。

from{属性:值;}  to{属性:值;}

二:将动画绑定到选择器:

在样式中,设置动画属性animation,自定义动画名称和时长。

animation:动画名  时长;

此时就可以完成一个简单的动画了,要进行更多设置还需要其他属性。

 

6、请描述一下cookies,sessionStorage和localStorage的区别

相同点:都存储在客户端

不同点:

1.存储大小

  • cookie数据大小不能超过4k。
  • sessionStorage和localStorage 虽然也有存储大小的限制,但比cookie大得多,可以达到5M或更大。

2.有效时间

  • localStorage    存储持久数据,浏览器关闭后数据不丢失除非主动删除数据;
  • sessionStorage  数据在当前浏览器窗口关闭后自动删除。
  • cookie          设置的cookie过期时间之前一直有效,即使窗口或浏览器关闭

3. 数据与服务器之间的交互方式

  • cookie的数据会自动的传递到服务器,服务器端也可以写cookie到客户端
  • sessionStorage和localStorage不会自动把数据发给服务器,仅在本地保存。

 

7、JavaScript的typeof返回哪些数据类型

undefined  string  boolean  number  symbol(ES6)  Object  Function

 

8、call和apply的区别

首先说明两个方法的含义:

apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。

call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法。

call 与 apply 的相同点:

方法的含义是一样的,即方法功能是一样的;

第一个参数的作用是一样的;

call 与 apply 的不同点:两者传入的列表形式不一样

call可以传入多个参数;

apply只能传入两个参数,所以其第二个参数往往是作为数组形式传入

 

9、ajax请求时,如何解释json数据

 

 

10、简述什么是冒泡事件,怎么阻止事件冒泡

事件冒泡:如果元素A嵌套在元素B中,那么A被点击不仅A的onclick事件会被触发,B的onclick事件也会被触发。触发的顺序是由内而外的。

怎么阻止事件冒泡:

function stopBubble(e){ //如果提供了事件对象,则这是一个非 ie 浏览器 if(e && e.stopPropagation){ e.stopPropagation(); }else{ window.event.cancelBubble = true; } return false; }

 

11、添加 删除 替换 插入到某个节点的方法

1、添加,主动添加 append

$('#shu').append('<li>关羽</li>');//往后添加

$('#shu').prepend('<li>黄忠</li>');//往前添加

//被动添加

$('<li>黄盖</li>').appendTo($('#wu'));

$('<li>陆逊</li>').prependTo($('#wu'));

 

2、插入,被动添加 insert

$('<li>黄月英</li>').insertAfter($('#liu'));

$('<li>孙尚香</li>').insertBefore($('#liu'));

 

3、替换节点.replaceAll .replaceWith

//replaceAll主动替换

$('#wu').replaceAll($('#shu'));

//replaceWith被动替换

$('#yu').replaceWith('<li>黄盖</li>');

 

4、删除节点.empty() .remove()

$('#wu').empty(); //清空对应的子节点

$('#wu').remove(); //删除对应的子节点

 

12、php编写一个b继承a的方法

class A { protected $a = 1; public function __construct() { echo "I'm $this->a.<br>"; } } class B extends A { public function __construct() { parent::__construct(); } }

 

13、let和var的区别是什么

通过var定义的变量,作用域是整个封闭函数,是全域的 。通过let定义的变量,作用域是在块级或是子块中。

 

14、请您书写一个验证邮箱地址的正则表达式

^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,4}$

 

15、body中的onload()函数和jQuery中的$(document).ready()有什么区别

1.执行时间 

        window.onload必须等到页面内包括图片的所有元素加载完毕后才能执行。 

        $(document).ready()是DOM结构绘制完毕后就执行,不必等到加载完毕。 

2.编写个数不同 

         window.onload不能同时编写多个,如果有多个window.onload方法,只会执行一个 

         $(document).ready()可以同时编写多个,并且都可以得到执行

3.简化写法 

        window.onload没有简化写法 

         $(document).ready(function(){})可以简写成$(function(){});

 

16、请使用jQuery将页面上的所有元素边框设置为2px宽的虚线

<script type="text/javascript" src="jquery-1.8.0.min.js"></script>

<script type="text/javascript">

    jQuery (function ($)

    {

        $ ("*").css ("border", "2px dashed");

    })

</script>

 

17、哪种方式更高效:document.getElementById(“myId”)还是$(“#myId”)

第一种,因为它直接调用了 JavaScript 引擎。

 

18、简述一下你所知道的加快页面加载速度的方法

一、使用良好的结构

可扩展 HTML (XHTML) 具有许多优势,但是其缺点也很明显。XHTML 可能使您的页面更加符合标准,但是它大量使用标记(强制性的 <start> 和 <end> 标记),这意味着浏览器要下载更多代码。所以,事情都有两面性,尝试在您的网页中使用较少的 XHTML 代码,以减小页面大小。如果您确实不得不使用 XHTML,试着尽可能对它进行优化。

 

二、不要使布局超载

坚持简约原则:少即是多。页面中充斥着各种类型的图像、视频、广告等,这大大违背实用性原则。

 

三、不要使用图像来表示文本

使用图像表示文本的最常见示例就是在导航栏中。美观的按钮更加具有吸引力,但是它们的加载速度 很慢。此外,图像仍然不能由搜索引擎直接索引,因此,使用图像进行导航不利于搜索引擎优化(search engine optimization,SEO)。当无需图像就可以通过大量 CSS 技巧创建漂亮的按钮时,绝不使用图像来表示文本。

 

四、检查cookie使用情况

设置一个较早的 expire 日期或者根本不设置 expire 日期,会缩短响应时间。要在 PHP 语言中设置 cookie 的 expire 日期,使用以下代码:

<?php 

 $expire = 2592000 + time(); 

 // Add 30 day’s to the current time 

 setcookie(userid, “123rrw3”, $expire);

?>

这段代码设置 cookie userid,并将 expire 日期设置为自当前日期之后 30 天。

 

五、不要包含不必要的 JavaScript 代码,尽可能将其外部化

应该明智地使用 JavaScript(仅在真正必要时才使用)并优化脚本的大小和速度。缩短 JavaScript 下载时间的另一种方式是使用外部文件,而不是包含脚本内联。这种方法也适用于 CSS,因为浏览器会缓存外部化的文本,而(在 HTML 页面自身中)以内联方式编码的 CSS 或 JavaScript 每次都会随 HTML 一起加载。

 

六、尽可能避免使用表格

表格被用作网页的主要构建块,但是作为页面布局元素,使用表格现在被认为是糟糕的做法。有时 候,您必须使用表格(并且它们被认为是显示表格数据的出色实践)。如果是这样,明确地指定表格单元格、行和列的宽度和高度,否则,浏览器必须执行许多操作来计算如何显示它们,这会降低页面加载速度。

 

七、删除任何不必要的元素

可能这是所有技巧中最显而易见的一个,但是它也是最容易忘记的一个技巧。如果您真正需要在网页 上放置许多内容,考虑将网页分为 2 个、3 个或更多的独立页面。

 

八、一些优化网页的技巧

可以使用许多方法来优化您的网页,包括压缩 JavaScript 文件,使用超文本传输协议(Hypertext Transfer Protocol,HTTP)压缩,以及设置图像大小。

 

九、压缩和缩小 JavaScript 文件

您可以使用 GNU zip (gzip) 来完成此任务,因为许多浏览器都支持这种压缩算法。另一种替代方法是缩小文件。这种方法删除代码中所有不必要的字符,比如制表符(tab)、新行和空格。它删除代码中的注释和空白,进一步缩小文件大小。外部和内部样式表都可以缩小。两种最流行的缩小工具是 JSMin 和 YUI Compressor。

 

十、使用 HTTP 压缩,并始终使用小写的 div 和类名

可以使用 HTTP 压缩来减少服务器与浏览器之间的通信量。可以在 Apache 中配置 HTTP 压缩(.htaccess 文件),或者可以将其包含到页面中(对于 PHP,可以使用一个 HTTP_ACCEPT_ENCODING 选项)。但是请注意:不是所有浏览器都支持压缩。即使是支持压缩的浏览器,压缩和解压缩都会加重处理器的负载。要在 Apache 中启用地毯式(blanket)压缩(即压缩所有文本和 HTML),使用以下命令:

AddOutputFilterByType DEFLATE text/html text/plain text/xml

另外,考虑一下您想要压缩的内容。图像、音乐和视频在创建时已经进行了压缩,因此您可以将压缩对象限制为 HTML、CSS 和 JavaScript 文件。另一种减少压缩工作的技巧是使用小写形式的 <div> 元素和类名。由于大小写敏感性,并且使用的是无损压缩,<header> 与 <Header> 不同,它们被压缩为两个不同的标记。

 

十一、设置图像大小

与表格单元格、行和列一样,当您未明确设置图像大小时,浏览器需要执行计算来显示图像,这会降低处理速度。

 

十二、将 CSS 图像映射用于装饰功能

使用图像映射代替多个图像,这是另一种缩短加载时间的方式,因为同时下载图像的各个独立部分能够加快整个页面的下载进度。或者,您可以使用某种名为 CSS sprites 的工具。CSS sprites 可帮助减少 HTTP 请求的数量。一个图像可以包含装饰或布置页面所需的所有图像元素。您使用 CSS 来选择(通过调用某些位置和维度)用于特定元素的映射。

 

十三、尽可能延迟脚本加载

一种提升页面下载速度的潜在方式是将脚本放在页面的底部,使页面加载更迅速。通常,浏览器只能(从同一个域)下载不超过两个并行对象,如果一个对象是一段 JavaScript 代码,那么在该脚本下载完之前,其他页面组件的下载将会暂停。如果将 JavaScript 代码放在页面底部,(在大多数情况下)它将在最后下载,这时所有其他组件都已下载完。

 

十四、按需加载 JavaScript 文件

要按需加载 JavaScript,使用 import() 函数。

import() 函数:    

function $import(src){

  var scriptElem = document.createElement('script');

  scriptElem.setAttribute('src',src);

  scriptElem.setAttribute('type','text/javascript');

  document.getElementsByTagName('head')[0].appendChild(scriptElem);

}

// import with a random query parameter to avoid caching

function $importNoCache(src){

  var ms = new Date().getTime().toString();

  var seed = "?" + ms; 

  $import(src + seed);

}

 

十五、验证函数加载

也可以验证一个函数是否被加载,如果没有,加载 JavaScript 文件。 

验证函数是否被加载:    

if (myfunction){

  // The function has been loaded

}

else{ // Function has not been loaded yet, so load the javascript.

  $import('http://www.yourfastsite.com/myfile.js');

}

注意:可以使用 defer 属性,但不是所有浏览器(包括 Firefox)都支持它。

 

十六、优化 CSS 文件

如果经过适当优化和维护,CSS 文件不一定很大。例如,具有很多独立类的 CSS 文件会影响下载速度。与 JavaScript 文件一样,您需要优化 CSS 文件,使其包含所需的所有内容,同时保持合理的大小。另外,使用外部文件代替内联定义来适应浏览器的缓存机制。

 

十七、使用内容分布网络

内容分布网络(Content-distribution network,CDN)是另一种缩短下载时间的好方法。当您将静态图像放在 Internet 上的许多服务器上时,用户能够从离他们最近的服务器下载这些图像。此外,大多数 CDN 都在快速服务器上运行,因此无论服务器的加载速度如何,其响应速度都比小型的超载服务器快。

 

十八、对资产使用多个域来增加连接

CDN 的另一个优势是它们是独立的域。因为您的浏览器将并发连接的数量限制到一个单一的域,因此无论何时加载一个页面,都很容易占满所有线程。因此,到其他资产的连接被延迟了。然而,您的浏览器能够打开新线程或到其他域的连接,这样,从另一个域加载的任何资产都可以与其他所有资产同时加载。

 

十九、在合适的时候使用 Google Gears

使用 Google Gears(参见 参考资料)是避免用户反复下载同一内容的另一种好方法。Gears 允许用户离线访问 Web 应用程序,但是也允许将页面元素持久化到用户的计算机上。因此,频繁加载但未进行更新的内容可以存储在 Gears 数据库中,该数据库是一个 SQLite3 关系数据库管理系统。对同一内容的所有 next 请求都可以从数据库(而不是服务器)直接加载。

 

二十、使用 PNG 格式的图像

Graphic Interchange Format (GIF) 和 Joint Photographic Experts Group (JPEG) 图像格式都已过时了:Portable Network Graphic (PNG) 是未来流行的格式。当然,您可以说 GIF 和 JPEG 已经消亡,或者 PNG 没有任何缺陷,但是所有事物都有各自的优缺点,PNG 以最佳的文件大小提供了出色的质量。因此,如果进行选择的话,应该尽可能使用 PNG 图像。

 

二十一、保持 Ajax 调用简短、准确

当统称为 Asynchronous JavaScript + XML (Ajax) 的技术在两年前出现时,这些技术为处理页面请求和响应提供了一种革命性方法。然而,拨号用户可能从来没机会体验其真正的优势,因为在许多情形下,Ajax 需要在浏览器与服务器之间大量通信。因此,如果您能够保持 Ajax 调用简短和准确,可以避免用户花费无止尽的时间来等待元素刷新或响应。

 

二十二、进行一次较大的 Ajax 调用并在本地处理客户机数据

如果不能进行简短的 Ajax 调用,或者如果这些调用不能提供期望的结果,可以考虑一种替代方法:进行一次大的 Ajax 调用来获取所需的一切内容,然后让客户机在本地处理数据。通过这种方式,客户机只需等待一次(获取传入的数据),但是在此之后(当浏览器与服务器之间没有必要通信时),处理速度将更快。当然,还有大量 Ajax 优化技术,本教程无法一一列出。

 

二十三、在沙箱中测试代码

还有一个经常被遗忘的常用技巧。尽管清醒的 Web 开发人员通常会在启动应用程序之前对其进行测试,但是有时候测试会使他们不那么重视维护任务,或者新功能添加得太快,并且未经过充分考虑或测试。结果,余下的脚本减缓了应用程序的速度。如果您添加一项新功能,可以首先在沙箱里(完全脱离了应用程序的其余部分)进行测试,查看它作为单个函数的行为。通过这种方式,您可以反复检查,并分析性能和响应时间,无需考虑 Web 应用程序的其余部分。然后,当新功能的行为符合预期时,可以将其引入到应用程序的其余部分中,运行其他测试,保证功能本身的行为符合预期。

 

二十四、分析站点代码

在许多场景中,自我反省是一个不错的建议。幸运的是,在开发过程中,我们可以使用工具来帮助反省,并尽可能客观地进行实践。像 JSLint(参见 参考资源)这样的工具的价值是无法衡量的,尽管其站点宣称它 “可能令您备受挫折”,因为它向您提供了所有的潜在代码缺陷,这些缺陷不但使调试更加困难,而且可能导致更长的响应时间。

 

二十五、检查孤立的文件和丢失的图像

检查孤立的文件和丢失的图像是一种明智之举。大部分 Web 开发人员都会检查错误的文件引用,但是这里仍然需要说明一下。丢失的文件容易引起各种问题,因为它们会导致 “The image/page cannot be displayed” 之类的错误消息。但是在网页速度优化方面,它们具有更大的缺陷:当浏览器寻找丢失的或孤立的文件时,它会消耗资源,这不可避免地会导致页面处理速度变慢。因此,请检查孤立或丢失的文件,包括拼写错误的文件名。

 

19、简述在mysql中drop,delete与truncate的区别

一、不同点

1.truncate table 和 delete只删除记录不删除表的结构,drop语句将删除表的结构依赖的约束(constrain),触发器(trigger),索引(index);

语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表的存储过程/函数将保留,但是变为invalid状态 

2.truncate之后的自增字段从头开始计数了,而delete的仍保留原来的最在数值。

 

二、总结:

1.在速度上,一般来说,drop> truncate > delete。

2.在使用drop和truncate时一定要注意,虽然可以恢复,但为了减少麻烦,还是要慎重。

3.如果想删除部分数据用delete,注意带上where子句,回滚段要足够大;

如果想删除表,当然用drop;

如果想保留表而将所有数据删除,如果和事务无关,用truncate即可;

如果和事务有关,或者想触发trigger,还是用delete

如果是整理表内部的碎片,可以用truncate跟上reuse stroage,再重新导入/插入数据

 

20、在MySQL中,你认为怎么存储全国的省市县信息最合理,说明你的理由,并用一条sql语句显示出XXX省XXX市XXX县

 

 

21、表连接join和left join有什么区别

t1表内容如下:

t2表内容如下:

下面来简述join和left join的区别:

inner join

select * from t1 inner join t2 on t1.id = t2.id;

公共部分的数据才会被查询出来;

left join

select * from t1 left join t2 on t1.id = t2.id;

查询出来的结果和前表记录数一样多;

 

22、MySQL中varchar与char的区别以及varchar(50)中的50代表什么含义,哪个效率

更高

区别: 1.CHAR的长度是固定的,而VARCHAR的长度是可以变化的, 比如,存储字符串“abc",对于CHAR (10),表示你存储的字符将占10个字节(包括7个空字符),而同样的VARCHAR (10)则只占用3个字节的长度,10只是最大值,当你存储的字符小于10时,按实际长度存储。 2.CHAR的效率比VARCHAR的效率稍高。

 

 

23、简述数据库建表的三范式原则,在工作中你是怎么运用的

第一范式:确保每列的原子性.

第二范式(确保表中的每列都和主键相关)

第三范式(确保每列都和主键列直接相关,而不是间接相关)

 

24、在php中,双引号和单引号的区别

单引号内 内容会强制解析,不解析变量

双引号内 内容不会强制解析,能解析变量

 

25、如何获取客户端的ip和服务器ip的代码

1.$_SERVER['REMOTE_ADDR'] 客户端IP,有可能是用户的IP,也可能是代理的IP。

2.$_SERVER['HTTP_CLIENT_IP'] 代理端的IP,可能存在可伪造。

3.$_SERVER['HTTP_X_FORWARDER_FOR'] 用户是在哪个IP使用的代理,可能存在,可以伪造。

4.$_SERVER['SERVER_ADDR'] 获取服务器端IP

 

26、你使用过哪些工具进行版本控制

比较常用的主要有:CVS、SVN、Git 和 Mercurial 

 

27、说明php中传值与传引用的区别,并说明传值什么时候传引用

变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量。

php也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的__引用__(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)

对象默认是传引用 对于较大是的数据,传引用比较好,这样可以节省内存的开销

 

28、常用的魔术方法有哪些?举例说明

  1. __construct()
  2. __destruct()
  3. __call()
  4. __callStatic()
  5. __get()
  6. __set()
  7. __isset()
  8. __unset()
  9. __sleep()
  10. __wakeup()
  11. __toString()
  12. __invoke()
  13. __set_state()
  14. __clone()
  15. __debugInfo()

 

29、$this和self、parent这三个关键词分别代表什么?在哪些场合下使用

$this:当前对象

self: 当前类

parent: 当前类的父类

$this在当前类中使用,使用->调用属性和方法。

self也在当前类中使用,不过需要使用::调用。

静态属性,不能在类里使用$this访问,应该使用self后跟范围解析操作符(::),后面是带着美元符号的变量名。

 

30、TP中的URL模式有哪几种?默认是哪种?

1.PATHINFO 模式 --重点 在后面使用非常多,如果想传多个参数可以使用键1/值1/键2/值2方法

代码如下: http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2

 

2.普通模式也称为重写模式

代码如下: http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2

 

3.REWRITE重写模式,去掉入口文件便于SEO优化

代码如下: http://域名/项目名/模块名/方法名/键1/值1/键2/值2

 

4.兼容模式

代码如下: http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2

 

31、ThinkPHP3.2框架中D函数与M函数的区别是什么?

区别在于:

M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会自动调用M方法。

通俗一点说:

1.M实例化参数是数据库的表名,D实例化的是你自己在Model模型层文件夹下面建立的模型文件;

      2.M则是通过直接实例化Model方法(ThinkPHP基类)来动态的实例化一个Model对象,即使这个对应的Model文件不存在,D就是实例化一个基于Model文件的Model;

 

32、Var arr = new Aaary(1,2,3,4,5,6,7,7,8,8,9);编写一个算法,去除重复

Var arr = new Aaary(1,2,3,4,5,6,7,7,8,8,9);

var newArr = [];

for(var i =0;i<arr.length-1;i++){

   if(newArr.indexOf(arr[i]) == -1){

    newArr.push(arr[i]);

  }

}

 

33、Var arr = new Array("小明","小红","小看"......);编写一个算法,抽奖程序,每一个只能中一次

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值