整理了一份招PHP高级工程师的面试题

王朝学院·作者佚名  2016-05-25
窄屏简体版  字體: 小  |  中  |  大  |  超大  

整理了一份招php高级工程师的面试题1. 基本知识点HTTP协议中几个状态码的含义:1xx(临时响应)Php代码表示临时响应并需要请求者继续执行操作的状态代码。代码说明100(继续)请求者应当继续提出请求。服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。101(切换协议)请求者已要求服务器切换协议,服务器已确认并准备切换。2xx(成功)表示成功处理了请求的状态代码。代码说明200(成功)服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。201(已创建)请求成功并且服务器创建了新的资源。202(已接受)服务器已接受请求,但尚未处理。203(非授权信息)服务器已成功处理了请求,但返回的信息可能来自另一来源。204(无内容)服务器成功处理了请求,但没有返回任何内容。205(重置内容)服务器成功处理了请求,但没有返回任何内容。206(部分内容)服务器成功处理了部分GET请求。3xx(重定向)表示要完成请求,需要进一步操作。通常,这些状态代码用来重定向。代码说明300(多种选择)针对请求,服务器可执行多种操作。服务器可根据请求者(useragent)选择一项操作,或提供操作列表供请求者选择。301(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。302(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。303(查看其他位置)请求者应当对不同的位置使用单独的GET请求来检索响应时,服务器返回此代码。304(未修改)自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。305(使用代理)请求者只能使用代理访问请求的网页。如果服务器返回此响应,还表示请求者应使用代理。307(临时重定向)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。4xx(请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。代码说明400(错误请求)服务器不理解请求的语法。401(未授权)请求要求身份验证。对于需要登录的网页,服务器可能返回此响应。403(禁止)服务器拒绝请求。404(未找到)服务器找不到请求的网页。405(方法禁用)禁用请求中指定的方法。406(不接受)无法使用请求的内容特性响应请求的网页。407(需要代理授权)此状态代码与401(未授权)类似,但指定请求者应当授权使用代理。408(请求超时)服务器等候请求时发生超时。409(冲突)服务器在完成请求时发生冲突。服务器必须在响应中包含有关冲突的信息。410(已删除)如果请求的资源已永久删除,服务器就会返回此响应。411(需要有效长度)服务器不接受不含有效内容长度标头字段的请求。412(未满足前提条件)服务器未满足请求者在请求中设置的其中一个前提条件。413(请求实体过大)服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。414(请求的URI过长)请求的URI(通常为网址)过长,服务器无法处理。415(不支持的媒体类型)请求的格式不受请求页面的支持。416(请求范围不符合要求)如果页面无法提供请求的范围,则服务器会返回此状态代码。417(未满足期望值)服务器未满足"期望"请求标头字段的要求。5xx(服务器错误)这些状态代码表示服务器在尝试处理请求时发生内部错误。这些错误可能是服务器本身的错误,而不是请求出错。代码说明500(服务器内部错误)服务器遇到错误,无法完成请求。501(尚未实施)服务器不具备完成请求的功能。例如,服务器无法识别请求方法时可能会返回此代码。502(错误网关)服务器作为网关或代理,从上游服务器收到无效响应。503(服务不可用)服务器目前无法使用(由于超载或停机维护)。通常,这只是暂时状态。504(网关超时)服务器作为网关或代理,但是没有及时从上游服务器收到请求。505(HTTP版本不受支持)服务器不支持请求中所用的HTTP协议版本。。。。Include require include_once require_once 的区别.PHP/MySQL中几个版本的进化史,比如mysql4.0到4.1,PHP 4.x到5.1的重大改进等等。Php代码MySQL:一、从4.0到4.1的主要变化如果在4.1.0到4.1.3版本的MySQL中创建了包含TIMESTAMP字段的InnoDB表。则在升级到4.1.4及更高时需要重建表,因为存储格式发生变化了。字符串根据标准SQL来比较:比较之前不删除末尾的空格,以前用末尾空格扩展了比较短的字符串。现在的结果是'a'>'a\t',以前则不这样。可以用mysqlcheck来检查一下数据表。TIMESTAMP返回'YYYY-MM-DDHH:MM:SS'格式的字符串。在MySQL4.0中,可以增加选项--new来获得ySQL4.1中这方面的特性。在MySQL4.1.1前,语句解析器不是那么严格,它在处理字符串转时间转换时会忽略第一个数字前的其他字符。在4.1.1之后,就比较严格了,返回结果是DATE,DATETIME,或TIME类型的函数的结果会被转换成时间型二、再看从4.1到5.0的主要变化◆InnoDB和MyISAM表中空格结尾的TEXT字段索引顺序改变了。因此需要运行"CHECKTABLE"语句修复数据表,如果出现错误,就运行"OPTIMIZETABLE"或"REPAIRTABLE"语句修复,甚至重新转储(用mysqldump)。◆MySQL5.0.15开始,如何处理BINARY字段中填充的值已经改变了。填充的值现在是0x00而非空格了,并且在取值的时候不会去除末尾的空格。◆从MySQL5.0.3开始,DECIMAL的实现方式已经改变了,5.0对DECIMAL的格式限制严格多了。在MySQL5.0.3到5.0.5之间版本的MyISAM和InnoDB表中创建的DECIMAL字段升级到5.0.6之后会发生崩溃。从5.0.3开始,DECIMAL用更有效的格式来存储。5.0.3开始,在计算DECIMAL值和舍入精确值的时候采用精确数学。◆在以前,等待超时的锁会导致InnoDB回滚当前全部事务,从5.0.13开始,就只回滚最近的SQL语句了。◆在4.1.13/5.0.8以前,DATETIME的加0后就转换成YYYYMMDDHHMMSS格式,现在变为YYYYMMDDHHMMSS.000000格式了◆4.1中,FLOAT或DOUBLE之间的比较碰巧没问题,但在5.0中可能就不行了◆从5.0.3开始,VARCHAR和VARBINARY字段中末尾的空格不再删除◆增加了一个新的启动选项innodb_table_locks,它导致LOCKTABLE时也可以请求InnoDB表锁。这个选项默认打开,不过可能在AUTOCOMMIT=1和LOCKTABLES应用中会导致死锁。看来,我只需主要关注时间(TIMESTAMP,DATETIME<DATE,TIME)和数值型(FLOAD,DOUBLE,DECIMAL)这两种类型的变化;另外,我升级过程中暂时还不需要涉及到字符集问题,因此相对轻松一些。升级步骤如下:执行FLUSHTABLESWITHREADLOCK;直接拷贝MyISAM表文件用mysqldump导出Innodb类型的表整个过程都很顺利,新系统启动之后,发现如下2个问题:新增了关键字INOUT,因此需要检查表结构中还有其他什么字段使用关键字了DATE_FORMAT函数要求严谨多了,DATE_FORMAT('2006/11/2409:14:00','%Y-%m-%d%T')和DATE_FORMAT('2006/11/2409:14:00','%Y-%m-%d%T')的结果完全不一样,在4.0中,能兼容这两种格式,而在5.0中,只能正确的使用前者了,后者则会有问题。这也应该是上面提到的时间类型发生的变化所致。PHP:Php代码PHP5以下几个改进值得关注:1、极大地提高了面向对象能力;2、支持try/catch异常处理;3、改进了字符串地处理;4、改经了xml和web服务支持;5、对SQlite内置支持。HEREDOC介绍Php代码Heredoc技术,在正规的PHP文档中和技术书籍中一般没有详细讲述,只是提到了这是一种Perl风格的字符串输出技术。但是现在的一些论坛程序,和部分文章系统,都巧妙的使用heredoc技术,来部分的实现了界面与代码的准分离,phpwind模板就是一个典型的例子。1.以<<<End开始标记开始,以End结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号。开始标记和开始标记相同,比如常用大写的EOT、EOD、EOF来表示,但是不只限于那几个,只要保证开始标记和结束标记不在正文中出现即可。2.位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。在heredoc中,变量不需要用连接符.或,来拼接,如下:$v=2;$a=<<<EOF"abc"$v"123"EOF;echo$a;//结果连同双引号一起输出:"abc"2"123"3.heredoc常用在输出包含大量HTML语法d文档的时候。比如:函数outputhtml()要输出HTML的主页。可以有两种写法。很明显第二种写法比较简单和易于阅读。functionoutputhtml(){echo"<html>";echo"<head><title>主页</title></head>";echo"<body>主页内容</body>";echo"</html>;}functionoutputhtml(){echo<<<EOT<html><head><title>主页</title></head><body>主页内容</body></html>EOT;}outputhtml();在heredoc中会自动替换其中的$变量,将命令和输入放在一块,方便写出一些php魔幻方法;Php代码php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。PHP中的魔术方法有:__construct,__destruct,__call,__callStatic,__get,__set,__isset,__unset,__sleep,__wakeup,__toString,__set_state,__clone,__autoload1、__get、__set这两个方法是为在类和他们的父类中没有声明的属性而设计的__get($PRoperty)当调用一个未定义的属性时,此方法会被触发,传递的参数是被访问的属性名__set($property,$value)给一个未定义的属性赋值时,此方法会被触发,传递的参数是被设置的属性名和值这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)。2、__isset、__unset__isset($property)当在一个未定义的属性上调用isset()函数时调用此方法__unset($property)当在一个未定义的属性上调用unset()函数时调用此方法与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)3、__call__call($method,$arg_array)当调用一个未定义的方法是调用此方法这里的未定义的方法包括没有权限访问的方法;如果方法不存在就去父类中找这个方法,如果父类中也不存在就去调用本类的__call()方​法,如果本类中不存在__call()方法就去找父类中的__call()方法4、__autoload__autoload函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在PHP出错失败前有了最后一个机会加载所需的类。如果要定义一个全局的自动加载类,则必须用spl_autoload_register()方法将处理类注册到PHP标准库:viewplaincopytoclipboardprint?<?phpclassLoader{staticfunctionautoload_class($class_name){//寻找正确的$class_name类,并引入,没有则抛出异常}}/***设置对象的自动载入*spl_autoload_register—Registergivenfunctionas__autoload()implementation*/spl_autoload_register(array('Loader','autoload_class'));$a=newTest();//Test没用require就实例化,实现自动加载,很多框架就用这种方法自动加载类?>注意:在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误,所以应该在函数本身做捕获。5、__construct、__destruct__construct构造方法,当一个对象创建时调用此方法,相对于PHP4使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称__destruct析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法。默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源,析构函数允许你在使用一个对象之后执行任意代码来清除内存。当PHP决定你的脚本不再与对象相关时,析构函数将被调用。在一个函数的命名空

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航