PHP中级工程师面试题

1. 什么是MVC?

MVC由Model(模型), View(视图)和Controller(控制器)组成,PHP MVC可以更高效地管理好3个不同层的PHP代码。

  • Model:数据信息存取层。
  • View:view层负责将应用的数据以特定的方式展现在界面上。
  • Controller:通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

2. GD库是做什么用的?

GD库提供了一系列用来处理图片的功能,使用GD库可以处理图片,或者生成图片。在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。

3. session与cookie的区别?

  • session:储存用户访问的全局唯一变量,存储在服务器上的php指定的目录中的(session_dir)的位置进行的存放
  • cookie:用来存储连续訪問一个頁面时所使用,是存储在客户端,对于Cookie来说是存储在用户WIN的Temp目录中的。
  • 两者都可通过时间来设置时间长短。

4. 用PHP打印出前一天的时间格式是2010-7-3 12:28:21?

echo date(‘Y-m-d H:i:s’, strtotime(‘-1 days’));

5. 对于大流量的网站,您采用什么样的方法来解决访问量问题?

答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量。

6. PHP魔术方法都有哪些?

__construct() 类的构造函数
__destruct() 类的析构函数
__construct() 类的构造函数
__call() 在对象中调用一个不可访问方法时调用
__callStatic() 用静态方式中调用一个不可访问方法时调用
__get() 获得一个类的成员变量时调用
__set() 设置一个类的成员变量时调用
__isset() 当对不可访问属性调用isset()或empty()时调用
__unset() 当对不可访问属性调用unset()时被调用
__sleep() 执行serialize()时,先会调用这个函数
__wakeup() 执行unserialize()时,先会调用这个函数
__toString() 类被当成字符串时的回应方法
__invoke() 调用函数的方式调用一个对象时的回应方法
__set_state() 调用var_export()导出类时,此静态方法会被调用
__clone() 当对象复制完成时调用
__autoload() 尝试加载未定义的类
__debugInfo() 打印所需调试信息

7. 你怎么理解命名空间?

PHP 命名空间(namespace)是在PHP 5.3中加的.PHP 命名空间可以解决以下两类问题:
  • (a)用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
  • (b)为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

8. 你了解RESTFUL吗?

REST 指的是一组架构约束条件和原则。满足这些约束条件和原则的应用程序或设计就是 RESTful。
Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的。从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,这十分适合云计算之类的环境。客户端可以缓存数据以改进性能。
在服务器端,应用程序状态和功能可以分为各种资源。资源是一个有趣的概念实体,它向客户端公开。资源的例子有:应用程序对象、数据库记录、算法等等。每个资源都使用 URI (Universal Resource Identifier) 得到一个唯一的地址。所有资源都共享统一的接口,以便在客户端和服务器之间传输状态。使用的是标准的 HTTP 方法,比如 GET、PUT、POST 和 DELETE。Hypermedia 是应用程序状态的引擎,资源表示通过超链接互联。

9. 做过APP接口没?怎么做的?

用框架写接口,普通POST,GET接口,有时候用RESTFUL接口。写控制器从模型调用数据,返回XML或者JSON数据就行了。
APP接口主要解决两个问题,一个SESSION问题,一个是TOKEN问题。客户端第一次请求,服务端生成SESSION_ID,返回给客户端。之和的请求中,客户端把SESSION_ID传给服务端,服务端用SESSION_ID函数可以确保多次请求用的同一个SESSION。TOKEN需要加密和服务端验证。

10. PHP如何实现缓存?

1、数据缓存——普遍的一种缓存技术
非常直观的字面意思,就是把数据先存放好,减少对数据库的访问。第一次访问时,把要用到的数据保存到一个文件里,然后用户再次访问页面时,就先检测要查询的数据是否在缓存文件里,若存在,则直接取出,不需再次访问数据库。
一般这些数据以数组的形式保存。
2、页面缓存
和数据缓存差不多,每次访问页面时,就检测相应的页面缓存是否存在,若不存在,则查询数据库得到相应的数据,同时生成缓存页面,这样,在下次访问就可以直接取出缓存页面,不必再次查询数据库。
3、内存缓存
不作过多分析,一般熟借助第三方软件进行优化,比如Memcached、Redis。
以上方法能够解决频繁访问数据库的问题,但是缺乏时效性,在数据库改变后,他们默认的数据还是修改之前的。所以就要在规定时间内清除缓存,以更新数 据。比如在每次更新缓存后设定一个时间戳t1,当前的时间戳t2,规定缓存时间为T,那么,在t1与t2相差在T之内时,就不更新缓存,否则,超过了T, 就重新查询数据库,清除之前的缓存,又得到一个新的时间戳,依次循环下去。

11. 用过smarty没有?用过什么模板引擎?

Smarty是很老的技术了。常用的框架如ThinkPHP,Yii都自带模板引擎。最常用的方法是3个:assign赋值,display显示页面,fetch获取页面内容而非显示。

12. 如何合并数组?

操作符+,在前一个数的基础上插入后一个数组,如果有相同的抛弃,而array_merge 是在前一个参数基础上插入后一个参数,如果有相同用的key 用后一个覆盖。

13. 常用的设计模式有哪些?

单例模式
简单工厂模式
策略模式
观察者模式
注册(树)模式
迭代模式
单例模式,简单工厂模式,策略模式,观察者模式,注册(树)模式,迭代模式。

14. 怎么认识PHP的异常处理?

可以使用检测(try)、抛出(throw)和捕获(catch)异常。即使用try检测有没有抛出(throw)异常,若有异常抛出(throw),使用catch捕获异常。一个 try 至少要有一个与之对应的 catch。定义多个 catch 可以捕获不同的对象。PHP 会按这些 catch 被定义的顺序执行,直到完成最后一个为止。而在这些 catch 内,又可以抛出新的异常。

15. 解释下PHP的垃圾回收机制?

php 5.3之前使用的垃圾回收机制是单纯的“引用计数”,也就是每个内存对象都分配一个计数器,当内存对象被变量引用时,计数器 1;当变量引用撤掉后,计数器-1;当计数器=0时,表明内存对象没有被使用,该内存对象则进行销毁,垃圾回收完成。

“引用计数”存在问题,就是当两个或多个对象互相引用形成环状后,内存对象的计数器则不会消减为0;这时候,这一组内存对象已经没用了,但是不能回收,从而导致内存泄露;
php5.3开始,使用了新的垃圾回收机制,在引用计数基础上,实现了一种复杂的算法,来检测内存对象中引用环的存在,以避免内存泄露。

16. 打开php.ini中的safe_mode,会影响哪些函数?至少说出6个。(新浪)

safe_mode,PHP安全模式,它提供一个基本安全的共享环境,在一个有多个用户账户存在的php开发的web服务器上。当安全模式打开的时候,一些函数将被完全的禁止,而另一些函数的功能将会受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被弃用,在php5.4以上版本,则将此特性完全去除了。

17. 抓取远程图片到本地,你会用什么函数?(51.com笔试题)

file_get_contents或者curl

18. 请写一段PHP代码,确保多个进程同时写入同一个文件成功

核心思路:加锁


    $fp = fopen("lock.txt","w+");
    if (flock($fp,LOCK_EX)) {
        //获得写锁,写数据
        fwrite($fp, "write something");

        // 解除锁定
        flock($fp, LOCK_UN);
    } else {
        echo "file is locking...";
    }
    fclose($fp);
?>

19. 写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。


    function my_scandir($dir){
        $files = array();
        if(is_dir($dir)){
            if ($handle = opendir($dir)) {
                while (($flie = readdir($handle))!== false) {
                    if ($flie!="." && $file!="..") {
                        if (is_dir($dir."/".$file)) {
                            $files[$file] = my_scandir($dir."/".$file);
                        } else {
                            $files[] = $dir."/".$file;
                        }
                    }
                }
                closedir($handle);
                return $files;
            }
        }
    }
?>

20. PHP如何实现页面跳转

方法一:php函数跳转,
缺点:header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。

  • header(“Location:网址”);//直接跳转
  • header(“refresh:3;url=http://axgle.za.NET”);//三秒后跳转

方法二:利用meta

在这里插入图片描述

21. 写出一个正则表达式,过虑网页上的所有JS/VBS脚本(即把script标记及其内容都去掉):

过滤JavaScript脚本参考:


    header("content-type:text/html;charset=utf-8");

    $script = "以下内容不显示:";
    $pattern = '/]*?>.*?/si';

    echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容
?>

22. 请写一个函数验证电子邮件的格式是否正确(要求使用正则)

preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);

23. 请写出并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?(腾讯)

首先进入php安装目录
php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件
php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记

24. PHP中,如何获得一个数组的键值?(酷讯)

使用key()可以获得数组中当前元素的键名,使用current()则可以返回当前元素的值。
使用array_keys()则可以得到数组中所有的键名。使用foreach结构foreach($arr as key=>value)可以通过key和value分别获取键名和值。

25. 如果我的网站用的utf-8编码,为防止乱码出现,都需要注意哪些地方? 从以下几个方面考虑:

  • 数据库中库和表都用utf8编码 php连接mysql,指定数据库编码为utf8 mysql_query(“set names
    utf8”);
  • php文件指定头部编码为utf-8header(“content-type:text/html;charset=utf-8”);
  • 网站下所有文件的编码为utf8
  • html文件指定编码为utf-8

26. 在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?

urlencode

27. 写出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)

常用扩展名
mb_sring
iconv
curl
GD
XML
socket
MySQL
PDO

28. 请描述如下URL重写规则的用意。

<IfModulemod_rewrite.c>
RewriteEngineon
RewriteCond%{REQUEST_FILENAME}!-f
RewriteCond%{REQUEST_FILENAME}!-d
RewriteBase/
RewriteRule./index.php[L]
</IfModule>
如果REQUEST_FILENAME文件存在,就直接访问文件,不进行下面的rewrite规则,
如果REQUEST_FILENAME目录存在,就直接访问目录,不进行下面的rewrite规则,
RewriteRule./index.php[L]的意思是把所有的请求都给index.php处理。

29. Warning:Cannot modify header information-headers already sent by(output started at D:\src\init.php:7)in D:\src\init.php on line10通常什么情况下php会报该警告信息?

一般是在header、set_cookie以及session_start函数前面有输出(包括空格)的情况下,会报该警告信息

30. 什么是ORM?

对象关系映射(英语:Object Relation Mapping,简称ORM,或O/RM,或O/R mapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换。从效果上说,它其实是创建了一个可在编程语言里使用的--“虚拟对象数据库”。

31.什么是RBAC

基于角色的访问控制(Role-Based Access Control)作为传统访问控制(自主访问,强制访问)的有前景的代替受到广泛的关注。在RBAC中,权限与角色相关联,用户通过成为适当角色的成员而得到这些角色的权限。这就极大地简化了权限的管理。在一个组织中,角色是为了完成各种工作而创造,用户则依据它的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。角色可依新的需求和系统的合并而赋予新的权限,而权限也可根据需要而从某角色中回收。角色与角色的关系可以建立起来以囊括更广泛的客观情况。

32. 如何防止SQL注入?

addslashes() 是强行加\
mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求
mysql_escape_string 不考虑连接的当前字符集
转义引号。

33. 如何避免跨站攻击?

要完成一次CSRF攻击,受害者必须依次完成两个步骤:

1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。

服务端进行CSRF防御
1.Cookie Hashing(所有表单都包含同一个伪随机值)。因为攻击者不能获得第三方的Cookie(理论上),所以表单中的数据也就构造失败了
2.验证码。每次的用户提交都需要用户在表单中填写一个图片上的随机字符串。
3.One-Time Tokens(不同的表单包含一个不同的伪随机值)

34. 你都做过什么项目,做的那几个模块?担任的什么职责?

PHP中级工程师面试题_第1张图片

35. 如何认识PHP框架的路由机制?

主要是通过伪静态来实现单一入口,mvc框架都是这样。将所有请求通过apache伪静态解析转给某个指定文件,然后通过php的$_SERVER[]这个全局变量来去的请求的路径字符串,对其进行解析再分配给指定的类去处理,基本就是这样。
最简单的方法是建立一个.htaccess文件。文件内容贴给你

<IfModule !mod_rewrite.c>
    ErrorDocument 500 'mod_rewrite must be enabled'
</IfModule>
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php

将这个文件放在根目录下即可。文件作用很明显:将所有的请求路径转给index.php,然后在index.php里做请求字符串的判断即可打到路由解析功能。

36. PHP有几种运行方式?

1、CGI

CGI即通用网关接口(common gatewag interface),它是一段程序,通俗的讲CGI就象是一座桥,把网页和WEB服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执 行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。
2、FastCGI
fast-cgi 是cgi的升级版本,FastCGI像是一个常驻(long-live)型的CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一 次。PHP使用PHP-FPM(FastCGI Process Manager),全称PHP FastCGI进程管理器进行管理。
3、APACHE2HANDLER
PHP作为Apache模块,Apache服务器在系统启动后,预先生成多个进程副本驻留在内存中,一旦有请求出 现,就立即使用这些空余的子进程进行处理,这样就不存在生成子进程造成的延迟了。这些服务器副本在处理完一次HTTP请求之后并不立即退出,而是停留在计算机中等待下次请求。对于客户浏览器的请求反应更快,性能较高。
4、CLI
cli是php的命令行运行模式,大家经常会使用它,但是可能并没有注意到(例如:我们在linux下经常使用 “php -m”查找PHP安装了那些扩展就是PHP命令行运行模式;


MySQL数据库问题:

1.如何设计或配置Mysql,才能达到高效使用的目的。

  • (a)数据库设计方面,设计结构良好的数据库,允许部分数据冗余。 选取最适用的字段属性,尽可能把字段设置为NOTNULL,这样在查询的时候,数据库不用去比较NULL值。
  • (b)系统架构设计方面,表散列,把海量数据散列到几个不同的表里面,集群,数据库查询和写入分开。写高效sql语句,以提高效率。使用连接(join)来代替子查询使用联合(union)来代替手动创建的临时表所得皆必须,只从数据库取必须的数据。必要的时候用不同的存储引擎,比如Innodb可以减少死锁,HEAP可以提高一个数量级的查询速度。

2.请说出mysql常用存储引擎?memory存储引擎的特点?

  • (a)MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:
    -(b)MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。
  • ©MySQL支持数个存储引擎作为对不同表的类型的处理器。MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎:
  • (d)MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。MyISAM在所MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎。
  • (e)MEMORY存储引擎提供“内存中”表。MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表。就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引擎也都被默认包含在MySQL中。
  • (f)注释:MEMORY存储引擎正式地被确定为HEAP引擎。
  • (g)InnoDB和BDB存储引擎提供事务安全表。BDB被包含在为支持它的操作系统发布MySQL-Max二进制分发版里。InnoDB也默认被包括在所 有MySQL 5.1二进制分发版里,你可以按照喜好通过配置MySQL来允许或禁止任一引擎。
  • (h)EXAMPLE存储引擎是一个“存根”引擎,它不做什么。你可以用这个引擎创建表,但没有数据被存储于其中或从其中检索。这个引擎的目的是服务,在 MySQL源代码中的一个例子,它演示说明如何开始编写新存储引擎。同样,它的主要兴趣是对开发者。 i)NDB Cluster是被MySQL
    Cluster用来实现分割到多台计算机上的表的存储引擎。它在MySQL-Max 5.1二进制分发版里提供。这个存储引擎当前只被Linux, Solaris, 和Mac OS X 支持。在未来的MySQL分发版中,我们想要添加其它平台对这个引擎的支持,包括Windows。
  • (j)ARCHIVE存储引擎被用来无索引地,非常小地覆盖存储的大量数据。 k)CSV存储引擎把数据以逗号分隔的格式存储在文本文件中。
  • (l)BLACKHOLE存储引擎接受但不存储数据,并且检索总是返回一个空集。
  • ( m)FEDERATED存储引擎把数据存在远程数据库中。在MySQL 5.1中,它只和MySQL一起工作,使用MySQL C Client API。在未来的分发版中,我们想要让它使用其它驱动器或客户端连接方法连接到另外的数据源。
  • (n)比较常用的是MyISAM和InnoBD

3.MySQL LEFT JOIN联查问题,不再举例。

*4.如何设计一个商城?购物车,商品规格,商品属性,优惠券,代金券,团购怎么做?*之后文章会详细叙述下

5.如何MySQL性能优化?

通过Show命令,慢查询日志,profiling分析查询确定瓶颈。
使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的。这可以帮你分析你的查询语句或是表结构的性能瓶颈。
当只要一行数据时使用 LIMIT 1
为搜索字段建索引
在Join表的时候使用相当类型的例,并将其索引
尽可能的使用 NOT NULL
水平分表
垂直分表
选择正确的存储引擎
避免长连接

算法问题

1.使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组

//冒泡排序(数组排序)

function bubble_sort($array){
    $count = count($array);
    if ($count <= 0) return false;
    for($i=0; $i<$count; $i++){
        for($j=$i; $j<$count-1; $j++){
            if ($array[$i] > $array[$j]){
                $tmp = $array[$i];
                $array[$i] = $array[$j];
                $array[$j] = $tmp;
            }
        }
    }
    return $array;
}

//快速排序(数组排序)

function quick_sort($array) {
    if (count($array) <= 1) return $array;
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $i<count($array); $i++){
        if ($array[$i] <= $key)
            $left_arr[] = $array[$i];
        else
            $right_arr[] = $array[$i];
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}

2.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组

//二分查找(数组里查找某个元素)

function bin_sch($array, $low, $high, $k){
    if ($low <= $high){
    $mid = intval(($low+$high)/2);
    if ($array[$mid] == $k){
    return $mid;
    }elseif ($k < $array[$mid]){
    return bin_sch($array, $low, $mid-1, $k);
    }else{
    return bin_sch($array, $mid+1, $high, $k);
    }
    }
    return -1;
}

//顺序查找(数组里查找某个元素)

function seq_sch($array, $n, $k){
    $array[$n] = $k;
    for($i=0; $i<$n; $i++){
        if($array[$i]==$k){
            break;
        }
    }
    if ($i<$n){
        return $i;
    }else{
        return -1;
    }
}

3.写一个二维数组排序算法函数,能够具有通用性,可以调用php内置函数

//二维数组排序, a r r 是 数 据 , arr是数据, arrkeys是排序的健值,$order是排序规则,1是升序,0是降序

function array_sort($arr, $keys, $order=0) {
    if (!is_array($arr)) {
        return false;
    }
    $keysvalue = array();
    foreach($arr as $key => $val) {
        $keysvalue[$key] = $val[$keys];
    }
    if($order == 0){
        asort($keysvalue);
    }else {
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach($keysvalue as $key => $vals) {
        $keysort[$key] = $key;
    }
    $new_array = array();
    foreach($keysort as $key => $val) {
        $new_array[$key] = $arr[$val];
    }
    return $new_array;
}

PHP周边问题

1.说出你常用的版本控制器?

SVN
GIT

2.Linux常用的命令,知道哪些?

ls
pwd
cd
cat
vi
service
chmod
chown
tar
su

3.Linux的定时任务如何执行?

使用crontab执行。
在Linux中你应该先输入crontab -e,然后就会有个vi编辑界面,再输入0 3 * * 1 /clearigame2内容到里面 :wq 保存退出。
在crontab文件中如何输入需要执行的命令和时间。该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。
每个域之间使用空格或者制表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
合法值 00-59 00-23 01-31 01-12 0-6 (0 is sunday) commands(代表要执行的脚本)
除了数字还有几个个特殊的符号就是"*"、"/“和”-"、",",*代表所有的取值范围内的数字,"/“代表每的意思,”/5"表示每5个单位,"-“代表从某个数字到某个数字,”,"分开几个离散的数字。
每天早上6点
0 6 * * * echo “Good morning.” >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo “Have a break now.” >> /tmp/test.txt

4.Linux如何安装Apache,PHP,MySQL,Nginx?

用的CentOS,Yum安装。生产环境有专门的运维工程师负责。
之前写的文章详细以参考一下
https://blog.csdn.net/github_37553763/article/details/105990241


前端问题

1.都用过哪些JavaScript框架?

jQuery和扩展等

2.JavaScript的this指向问题?

javascript 中的 this 有 五种情况:

全局范围 它 会指向 全局对象( 浏览器下指window)
全局函数调用 还是指向全局对象
.对象函数调用 调用某个对象的函数, 它指向 当前对象。
使用 new 实例化对象时 它指向 新创建的 对象
调用某些方法时 如: Function.prototype 上的 call 或者 apply 方法 以及 with等;它指向 传入的对象。

3.谈谈你对prototype的理解?

每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性,也就是说将函数用作构造函数调用(使用new操作符调用)的时候,新创建的对象会从原型对象上继承属性和方法。
prototype 属性使您有能力向对象添加属性和方法。

4.谈谈你对Bootstrap的理解。

第一:预处理脚本:
Bootstrap的源码是基于最流行的CSS预处理脚本-Less和Sass开发的。你可以采用预编译的CSS文件快速开发,也可以从源码定制自己需要的样式。例如。如果你页面上有很多同样的效果。只需要写一个效果类。然后让用到的地方去继承他。就不需要再写了。
第二:一个框架,多种设备
你的网站和应用能在Bootstrap的帮助下通过同一个代码快速,有效设配手机,平板、PC设备,这都是CSS媒体查询的功劳。
第三:特效齐全
Bootstrap提供了全面、美观的文档、可以找到关于HTML元素,HTML和CSS组件、jQuery插件方面的所有详细文档。
Bootstrap组件: Bootstrap中包含了丰富的Web组件,根据这些组件,可以快速的搭建一个漂亮、功能完备的网站。比如:下拉菜单、按钮组、按钮下拉菜单、导航、导航条、路径导航、分页、排版、缩略图、警告对话框、进度条、媒体对象等。
JavaScript插件Bootstrap自带了13个jQuery插件,这些插件为Bootstrap中的组件赋予了“生命”。其中包括:模式对话框、标签页、滚动条、弹出框等。 还有更重要的一点是,Bootstrap是完全开源的。它的代码托管,开发,维护都依赖GITHub平台。
其次:
我们看下使用Bootstrap的利弊:
优点:
a) 提高开发效率。
b) 规范名称定义,便于维护。
c) 规范项目开发流程 d)css代码更清晰、简单。html代码更合理。
e) 大规模项目中可以减少用户下载
缺点:
a) 学习成本提高。你需要了解整个框架,需要阅读框架的文档。
b)css框架对于一个小项目等页面来说很臃肿。框架中可能有大部分你用不到的代码。
c)可能会无法帮助你的技术提高。太依赖框架,以至于很难排除bug。包括框架中本身就带的bug。
d) 选择自己需要的框架与开发框架都很痛苦。写到后面发现越来越不灵活,越来越臃肿。
1、页面外部引用样式过多。譬如关于ul的margin定义,在格式化的css中会声明为0,而在基本样式的css中又可能会声明margin:5px 10px;所以在Yslow中会出现多次定义。
2、组件复用性的考量。譬如表单定义的css中定义了所有表单的修饰,而假定在注册这个页面中只是需要这个css的百分之三十。那是否应切割出去那不要的百分之七十?综合以上的二个问题,个人认为解决的方式便是封装,让该有的有,不该有的没有。尽量减少http连接数和css的大小。但如果彻底是这样做的话,css的复用性又会变得很差,后期手工的封装会很痛苦。
3、到底该不该支持em?可见如要支持em,最大的目的是为了在浏览器中可以根据用户的分辨率大小自由缩放,对于拥有超大显示器的用户与小显示器的用户是非常有用的。可是在采集我们用户的浏览器数据后,发现分辨处于这二端的用户非常少,可想而知,为这部分的用户多花比正常开发一倍以上的时间显然是件不划算的事情,当然这是个建议,我们也希望能使用em带给用户最好的感受。
PS:博主认为,如果有前端技术的博友们,应该都不是问题。初学者是有点难度的。
基于Bootstrap版本的使用:
目前使用较广的是版本2和3,其中2的最新版本是2.3.2,3的最新版本3.3.5。
版本4最主要变化是:
1.从Less迁移到Sass
(为什么?因为那么Sass和LESS是一样的,只是CSS预处理器中的一种而以。但是Less相对来说,语法太过严格,所以使用的人也就少了。)
2.改进网格系统
3.缺省弹性框
4.支持 Dropped wells,thumbnails,and panels for cards
5.合并所有HTML resets到一个新的模块中:Reboot 全新自定义选项
6.不再支持IE8
7.重写所有的JavaScript插件
8.改进工具提示和popovers的自动定位
9.改进文档
10.其他大量改进

你可能感兴趣的:(php面试题)