面试题解答

不言
不言asal
2018-04-21 11:48:302045semak imbas

这篇文章介绍的内容是关于面试题解答,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下


1. ajax优势
    ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验

2. 现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?

        MVC三层分别指:业务模型、视图、控制器,
        由控制器层调用模型处理数据,然后将数据
        映射到视图层进行显示,
        优点是:
        1. 可以实现代码的重用性,避免产生代码冗余;
        2. M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式
3. echo(),print(),print_r()的区别

        答:echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值 
        print()只能打印出简单类型变量的值(如int,string) 
        print_r()可以打印出复杂类型变量的值(如数组,对象) 
        echo 输出一个或者多个字符串


4. 什么是事务,特性u


        答:事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
        
        事务特性:
        
        (1)原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
        (2)一致性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
        (3)隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
        (4) 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,
        事务的处理结果也会得到保存。
        
        或者这样理解:
        
        事务就是被绑定在一起作为一个逻辑工作单元的SQL语句分组,如果任何一个语句操作失败那么整个操作就被失败,
        以后操作就会回滚到操作前状态,或者是上有个节点。为了确保要么执行,要么不执行,就可以使用事务。要将有
        组语句作为事务考虑,就需要通过ACID测试,即原子性,一致性,隔离性和持久性。
5. 什么是锁?

        答:当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象
        有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
        
        基本锁类型:锁包括行级锁和表级锁
5. 索引的作用?和它的优点缺点是什么?

        答:索引是一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。
        索引可以是唯一的,创建索引允许指定单个列或者是多个列。
        缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
6. MyISAM类型InnoDB类型引擎区别:
    MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,而InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢。
7. PHP函数默认修饰词
    static public

8. 面向对象的特征有哪些方面?
        
        答:主要有封装,继承,多态。如果是4个方面则加上:抽象。
        下面的解释为理解:        
        封装:        
        封装是保证软件部件具有优良的模块性的基础,
        封装的目标就是要实现软件部件的高内聚,低耦合,防止程序相互依赖性而带来的变动影响.
        
                 
        继承:        
        在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在
        的类所定义的内容作为自己的内容,并可以加入若干新的内容,或修改原来的方法使之更适
        合特殊的需要,这就是继承。继承是子类自动共享父类数据和方法的机制,这是类之间的一
        种关系,提高了软件的可重用性和可扩展性。
        
        多态:        
        多态是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时
        并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引
        用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。
        
        抽象:        
        抽象就是找出一些事物的相似和共性之处,然后将这些事物归为一个类,这个类只考虑这些事
        物的相似和共性之处,并且会忽略与当前主题和目标无关的那些方面,将注意力集中在与当前
        目标有关的方面。例如,看到一只蚂蚁和大象,你能够想象出它们的相同之处,那就是抽象。
9. __autoload()方法的工作原理是什么?

        答:使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。
        当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。
        这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后
        就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。
        使用自动载入的魔术函数可以不必要写很多个include或者require函数。

10. tp3中behavor行为是什么?在动作之前执行的行为

        Behavior:行为,在系统核心之上,设置了很多标签扩展位,而每个标签位置可以依次执行各自的独立行为;通过内置的行为扩展完成系统功能,所有行为扩展都是可替换和增加的。

11. 如何开启调试模式?调试模式有什么好处?

        答:开启调试模式很简单,只需要在入口文件中增加一行常量定义代码:

        //开启调试模式    
        define('APP_DEBUG', true);
    
        在完成开发阶段部署到生产环境后,只需要删除调试模式定义代码即可切换到部署模式。
        开启调试模式后,系统会首先加载系统默认的调试配置文件,然后加载项目的调试配置文件,调试模式的优势在于:
        1. 开启日志记录,任何错误信息和调试信息都会详细记录,便于调试;
        2. 关闭模板缓存,模板修改可以即时生效;
        3. 记录SQL日志,方便分析SQL;
        4. 关闭字段缓存,数据表字段修改不受缓存影响;
        5. 严格检查文件大小写(即使是Windows平台),帮助你提前发现Linux部署问题;
        6. 可以方便用于开发过程的不同阶段,包括开发、测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。

12. TP中的URL模式有哪几种?默认是哪种?

        答:ThinkPHP支持四种URL模式,可以通过设置URL_MODEL参数来定义,包括普通模式、PATHINFO、REWRITE和兼容模式。
        
        默认模式为:PATHINFO模式,设置URL_MODEL 为1
13. Smarty中编译和缓存有什么区别

        smarty的编译过程就是把模板拿过来,把里面的标签替换成相应php代码, 其实就是php和html混合的过程
        smarty的缓存需要手动开启,smarty的缓存就是把编译好的文件执行后,同时生成一份静态的html页面,
        再次访问的时候,你访问的就是是html文件了,所以就效率来说,要高一些
13. Smarty缓存机制是什么?

        如果开启了缓存,smarty同时生成一份静态的html页面,如果在设定的时间没有过期,
        再次访问的时候,你访问的就是是html文件了,减少了读取数据库,所以就效率来说,要高一些。
14. 在程序的开发中,如何提高程序的运行效率?
        
            1. 优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;
            2. 少用子查询可用表连接代替;
            3. 少用模糊查询;
            4. 数据表中创建索引;
            5. 对程序中经常用到的数据生成缓存;
15. JSon数据格式的理解:

        JSON(JavaScript Object Notation)
        是一种轻量级的数据交换格式,
        json数据格式固定,
        可以被多种语言用作数据的传递
        
        PHP中处理json格式的函数为
        json_decode( string $json [, bool $assoc ] ), 
        接受一个 JSON格式的字符串并且把它转换为PHP变量,
        参数json待解码的json string格式的字符串。
        assoc当该参数为TRUE时,将返回array而非object;

        Json_encode:将PHP变量转换成json格式

16. 会话控制的原理:
    

        http是一个无状态的协议,此协议无法来维护两个事务之间的联系。当一个用户在请求一个页面后在请求另外一个页面时,http将无法告诉我们这两个请求是来自同一个变量。会话控制思想就是能够在网站中跟踪一个变量,我们可以跟踪变量,就可以做到对用户的支持,并根据授权和用户身份显示不同内容,不同页面。


17. php上传文件move_upload_file与is_uploaded_file都是干什么的?

    move_upload_file将上传的文件移动到新位置
    is_uploaded_file判断文件是否是通过 HTTP POST 上传的

18. 数据库Mysql 的存储引擎,myisam和innodb的区别。

        第一种:
        MyISAM 是非事务的存储引擎;适合用于频繁查询的应用;表锁,不会出现死锁;适合小数据,小并发
        innodb是支持事务的存储引擎;合于插入和更新操作比较多的应用;设计合理的话是行锁(最大区别就在锁的级别上);适合大数据,大并发。
        第二种:
        MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,而InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢。
19. char与varchar区别

        答:char是固定长度的字符类型,分配多少空间,就占用多长空间。
        Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。
        由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。  
20. MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?

        a. 设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
        b. 选择合适的表字段数据类型和存储引擎,适当的添加索引。
        c. mysql库主从读写分离。
        d. 找规律分表,减少单表中的数据量提高查询速度。
        e. 添加缓存机制,比如memcached,apc等。
        f. 不经常改动的页面,生成静态页面。
        g. 书写高效率的SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1, field_2, field_3 FROM TABLE.

21. 面向对象的理解  
  
        面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP;
        通俗的解释就是“万物皆对象”,把所有的事物都看作一个个可以独立的对象(单元),
        它们可以自己完成自己的功能,而不是像C那样分成一个个函数。
         现在纯正的OO语言主要是Java和C#,PHP、C++也支持OO,C是面向过程的。
        第二种:
        面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。     
22. 简述 private、 protected、 public修饰符的访问权限。  
        
        答:private : 私有成员, 在类的内部才可以访问。  
        protected : 保护成员,该类内部和继承类中可以访问。
        public : 公共成员,完全公开,没有访问限制。
23. 抽象类和接口的概念以及区别?

        答:
        抽象类:
        它是一种特殊的,不能被实例化的类,只能作为其他类的父类使用。使用abstract关键字声明。
        接口:
        它是一种特殊的抽象类,也是一个特殊的类,使用interface声明。
        (1)抽象类的操作通过继承关键字extends实现,而接口的使用是通过implements关键字来实现。
        (2)抽象类中有数据成员,可以实现数据的封装,但是接口没有数据成员。
        (3)抽象类中可以有构造方法,但是接口没有构造方法。
        (4)抽象类的方法可以通过private、protected、public关键字修饰(抽象方法不能是private),而接口中的方法只能使用public关键字修饰。
        (5)一个类只能继承于一个抽象类,而一个类可以同时实现多个接口。
        (6)抽象类中可以有成员方法的实现代码,而接口中不可以有成员方法的实现代码。
        区别第二种:
        1、有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义。
        
        2、接口中全部是抽象方法,方法不用使用abstract定义。
23. 什么时候使用构造函数,什么时候使用析构函数

        构造函数(方法)是对象创建完成后第一个被对象自动调用的方法。
        它存在于每个声明的类中,是一个特殊的成员方法。
        作用是执行一些初始化的任务。Php中使用__construct()声明构造方法,并且只能声明一个。

        析构函数(方法)作用和构造方法正好相反,是对象被销毁之前最后一个被对象自动调用的方法。
        作用是用于实现在销毁一个对象之前执行一些特定的操作,诸如关闭文件和释放内存等。
24. 什么是Smarty,优点,缺点

         Smarty是一个使用PHP写出来的PHP模板引擎,目的是要使用PHP程序同美工分离,
        使的程序员改变程序的逻辑内容时不会影响到美工的页面设计,美工重新修改页面时
        不会影响到程序的程序逻辑,这在多人合作的项目中显的尤为重要。(也易于程序的多样式开发)
        
        Smarty优点
        
        1. 速度快:相对其他模板引擎。
        
        2. 编译型:采用smarty编写的程序在运行时要编译成一个非模板技术的PHP文件
        
        3 缓存技术:它可以将用户最终看到的HTML文件缓存成一个静态的HTML页
        
        4. 插件技术:smarty可以自定义插件。
        
        不适合使用smarty的地方
        
        1. 需要实时更新的内容。例如像股票显示,它需要经常对数据进行更新 
        2. 小项目。小项目因为项目简单而美工与程序员兼于一人的项目

25. 常见的HTTP状态码:

        200 - 请求成功
        301 - 资源(网页等)被永久转义到其他URL
        302 - 临时转移成功,请求的内容已转移到新位置
        401 - 代表未授权。
        403 - 禁止访问。 
        404 - 请求的资源(网页等)不存在
        500 - 服务器内部错误 
        505 - 内部服务器错误

27. php值传值,传引用有什么区别,什么时候使用?
    
        变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,
        整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变
        量时,改变其中一个变量的值,将不会影响到另外一个变量
        
        php也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的
        __引用__(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影
        响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的
        变量前(源变量)
        
        对象默认是传引用 对于较大是的数据,传引用比较好,这样可以节省内存的开销

        第二种:
        按值传递:函数范围内对值的任何改变在函数外部都会被忽略

        按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改

        优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,
        这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。

28. 双引号,单引号区别

        1. 双引号解释变量,单引号不解释变量
        2. 双引号里插入单引号,其中单引号里如果有变量的话,变量解释
        3. 双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,
        或者将变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
        4. 双引号解释转义字符,单引号不解释转义字符,但是解释'\和\\
        5. 能使单引号字符尽量使用单引号,单引号的效率比双引号要高(
        因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)

29. 用户行为日志缓存放在哪?MongoDB

1. 常用的超全局变量 

        $_GET ----->get传送方式
        $_POST ----->post传送方式
        $_REQUEST ----->可以接收到get和post两种方式的值
    
        $GLOBALS ----->所有的变量都放在里面
        $_FILE ----->上传文件使用
        $_SERVER ----->系统环境变量
    
        $_SESSION ----->会话控制的时候会用到
        $_COOKIE ----->会话控制的时候会用到

        $_ENV -------->环境变量

2. 版本控制工具SVN与Git区别

        1. git是分布式的,svn是集中式的     . 
        2. svn必须有一台中央服务器,git不用         . 
        3. git使用可以不联网,svn使用必须联网         . 
        4. git方便分支之间的切换         . 
        5. git的完整性要优于svn
        
3.  isset() 和 empty() 区别

         Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。
4. explode与implode 分割字符串   连接数组
5. file_get_contents经历了哪些过程  将文件的内容读入到一个字符串中
6. Linux下make与make install有什么区别? 编译 安装
7. 面向对象中,接口可以继承接口吗? 可以,但接口不可以继承类
8. Memcache与Redis区别  

        1. 数据类型
        Redis数据类型丰富,支持set list等类型
        memcache支持简单数据类型,需要客户端自己处理复杂对象
        2. 持久性
        redis支持数据落地持久化存储
        memcache不支持数据持久存储
        3. 分布式存储
        redis支持master-slave复制模式
        memcache可以使用一致性hash做分布式
        4. value大小不同
        memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
        5. 数据一致性不同
        redis使用的是单线程模型,保证了数据按顺序提交。
        memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作
        6. cpu利用
        redis单线程模型只能使用一个cpu,可以开启多个redis进程
9. 什么是序列化?函数是?
        格式化字符串并转换成数组或对象
        serialize() 序列化
1. TP,Lavarel,Yii区别 [TP YII CI框架对比 - CSDN博客](http://blog.csdn.net/pangchengyong0724/article/details/49246847)
2. CI的构子原理?用的是什么版本(3.1.7稳定版)
    
    在程序执行前,框架会加载Hooks,主要是判断config是否开启hooks,
    如果开启,则加载config/hoos.php配置文件、钩子配置信息;
    然后框架通过调用hooks->call方法调用hoosk,hook类通过call_hook解析配置,通过hook类中run_hook调用函数;
4. 解释php是什么?

    是英文超级文本预处理语言PHP: Hypertext Preprocessor的缩写。
    PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,
    语言的风格有类似于C语言,被广泛的运用。

5. include与require区别  
     include如果引入的文件不存在,试图继续往下执行,报一个warning
    而require如果引入的文件不存在,报fatal error,不再继续执行.
6. mysql_fetch_assoc与mysql_fetch_array区别  

        //mysql_fetch_array从结果集中取得一行作为关联数组,或数字数组,或二者兼有 
        //mysql_fetch_assoc — 从结果集中取得一行作为关联数组 

        这两个函数,返回的都是一个数组,区别就是第一个函数返回的数组是只包含值,我们只能$row[0],$row[1],这样以数组下标来读取数据,
        而MySQL_fetch_array()返回的数组既包含第一种,也包含键值对的形式,我们可以这样读取数据,(假如数据库的字段是 username,passwd):$row['username']$row['passwd'] 
7. session能保存到数据库吗?
        
        能

8. 序列化是哪个函数?是什么格式?用来转换什么的?

        serialize() 序列化 数组变成key-value结构的用花括号包起来的字符串

        //unserialize() 反序列化 变成数组
11. 返回上一页  go(-1)
12. js能操作cookie吗?能,设置cookie:setcookie;获取cookie: getcookie
13. jQ中封装dollar$函数  在jQ中代表jquery

相关推荐:

php的面试总结


Atas ialah kandungan terperinci 面试题解答. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:php面试的总结Artikel seterusnya:3年PHP程序员的面试总结