整理了一份招PHP高级工程师的面试题
作者:佚名    php网站开发编辑:admin   更新时间:2022-07-23
整理了一份招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,__autoload
- 1、__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?
- <?php
- classLoader
- {
- 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决定你的脚本不再与对象相关时,析构函数将被调用。
- 在一个函数的命名空