PHP 面试题 PHP部分

Posted north-south

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 面试题 PHP部分相关的知识,希望对你有一定的参考价值。

1、双引号和单引号的区别?

  • 双引号解释变量,单引号不解释变量;

  • 双引号里插入单引号,其中单引号里如果有变量的话,变量解释;

  • 双引号解释转义字符,单引号不解释转义字符,但是解释‘\和\\;

  • 单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断);

  • 双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误。

2、HTTP中POST、GET、PUT、DELETE方式的区别?

(1)表单中get和post提交方式的区别
  • get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中可以看到;post是通过HTTPPOST机制,将表单内各个字段与其内容放在html的head中一起传送到action属性所指的url地址,用户看不到这个过程
  • 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据
  • get传送的数据量较小(受浏览器限制,不同的浏览器限制长度不一样),post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k,get安全性非常低,post安全性较高
(2)post、get、put、delete方式的区别
  • GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。

  • PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。

  • POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。

  • DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。

(3)get和post的区别
  • get提交的参数在url中可见,相对于post安全性低;

  • get传输的数量小(受浏览器限制,不用浏览器最大长度不同),post传值大小可以在php.ini中进行设置;

  • get一般用于从服务器获取数据,post一般用于向服务器提交数据;

  • get的执行效率比post高。

3、echo、print_r()、print、var_dump()之间的区别

(1)echo与print区别

  • echo、print为结构语言,echo()、print()为函数;

  • echo 输出一个以上的字符串(中间以逗号隔开),print 只能输出一个字符串;

  • echo 没有返回值,print有返回值;

  • echo 效率比print高。

(2)echo、print、print_r()、var_dump()区别

  • echo 语言结构,输出一个或多个字符串,中间以逗号隔开,没有返回值,不能作为表达式的一部分使用;
  • print也是php的一个关键字,有返回值 只能打印出简单类型变量的值(如int,string),如果字符串显示成功则返回true,否则返回false;
  • print_r() 可以打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头,但print_r输出布尔值和NULL的结果没有意义,因为都是打印"\n",因此var_dump()函数更适合调试;
  • var_dump() 判断一个变量的类型和长度,并输出变量的数值。

语句include和require的区别是什么?为避免多次包含同一文件,可以用(?)语句代替他们

  • require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行

  • include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去

  • 包含文件不存在或者语法错误的时候,require是致命的,而include不是

  • require_once、include_once表示了只包含一次,避免了重复包含

4、谈谈mvc的认识

由模型、视图、控制器完成的应用程序,由模型发出要实现的功能到控制器,控制器接收组织功能传递给视

优点:①可以实现代码的重用性,避免产生代码冗余;②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式

5、HTTP状态码

常见的HTTP状态码:

  • 200 - 请求成功
  • 203 - 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本
  • 204 - 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档
  • 205 - 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域
  • 206 - 部分内容。服务器成功处理了部分GET请求
  • 301 - 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
  • 302 - 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI
  • 305 - 使用代理。所请求的资源必须通过代理访问
  • 401 - 请求要求用户的身份认证
  • 403 - 服务器理解请求客户端的请求,但是拒绝执行此请求
  • 404 - 请求的资源(网页等)不存在
  • 503 - 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中
  • 505 - 服务器不支持请求的HTTP协议的版本,无法完成处理

HTTP状态码分类:

  • 1** - 信息,服务器收到的请求,需要请求者继续执行操作
  • 2** - 成功,操作被成功接收并处理
  • 3** - 重定向,需要进一步的操作以完成请求
  • 4** - 客户端错误,请求包含语法错误或者无法完成请求
  • 5** - 服务器错误,服务器在处理请求的过程 中发生了错误

6、常用的超全局变量(8个)

  • $_GET ----->get传送方式
  • $_POST ----->post传送方式
  • $_REQUEST ----->可以接收到get和post两种方式的值
  • $_FILE ----->上传文件使用

  • $GLOBALS ----->所有的变量都放在里面
  • $_SERVER ----->系统环境变量

  • $_SESSION ----->会话控制的时候会用到
  • $_COOKIE ----->会话控制的时候会用到

————————————————————————————————————————————————————————————————————————————————

  • $_ENV ------->PHP解析所在服务器环境的有关信息

7、php5的魔术变量与魔术方法?

(1)魔术方法

1、__construct() :实例化对象时自动调用。

2、__destruct() :销毁对象或脚本执行结束时自动调用。

3、__call() :调用对象不存在得方法时执行此函数。

4、__get() :获取对象不存在的属性时执行此函数。

5、__set() :设置对象不存在的属性时执行此函数。

6、__isset() : 检测对象的某个属性是否存在时执行此函数。

7、__unset() :销毁对象的某个属性时执行此函数。

8、__toString() :将对象当作字符串输出时执行此函数。

9、__clone() :克隆对象时执行此函数。

10、__autoload() :实例化对象时,当类不存在时,执行此函数自动加载类。

11、__sleep() serialize之前被调用,可以指定要序列化的对象属性。

12、__wakeup unserialize之前被调用,可以执行对象的初始化工作。

13、__set_state() :调用var_export时,被调用。用__set_state的返回值做为var_export的返回值。

14、__invoke() :将对象当作函数来使用时执行此方法,通常不推荐这样做。

(2)魔术常量

1、__line__  :文件中的当前行号。

2、__file__ :文件的完整路径和文件名。

3、__dir__ :文件所在的目录。

4、 __function__ :函数名称(php 4.3.0新加)。自php5起本常量返回该函数被定义时的名字(区分大小写)。

5、__class__ :类的名字(php 4.3.0新加)。自 PHP 5 起本常量返回该类被定义时的名字(区分大小写)。

6、__namespace__ :当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP 5.3.0 新增)。

7、__trait__ :Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4 起此常量返回 trait 被定义时的名字(区分大小写)。Trait 名包括其被声明的作用区域(例如 Foo\Bar)。

8、__method__ :类的方法名(PHP 5.0.0 新加)。返回该方法被定义时的名字(区分大小写)。

 

8、如何获取客户端的ip(要求取得一个int)和服务器ip的代码

客户端:$_SERVER["REMOTE_ADDR"];或者getenv(‘REMOTE_ADDR‘) ip2long进行转换

服务器端:$_SERVER["SERVER_ADDR"];或者gethostbyname(‘www.baidu.com‘)

 

9、<?php echo count(strlen(“http://php.net”));?>的执行结果

输出 1

讲解:count(var)是用来统计数组或对象的元素个数的。当varnull或者空数组时,结果为0。如果var是普通变量,则返回1。正常情况下返回var中的元素或属性个数。

 

10、使用list()函数需要注意什么?

list()是一个语法结构。List($array)是用来快速把数组中的元素赋给一些变量。使用时要注意,$array必须为一个索引数组,并且索引值从0开始。

 用法:

 $arr = array(‘23‘,‘1‘,‘30‘,‘12‘,‘5‘);
 list($a,,$b) = $arr;
 echo ‘$a:‘.$a.‘;$b:‘.$b;

输出结果:$a:23;$b:30

 

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

   传值
   是把实参的值赋值给行参
   那么对行参的修改,不会影响实参的值

   传地址
   是传值的一种特殊方式,只是他传递的是地址,不是普通的如int
   那么传地址以后,实参和行参都指向同一个对象

   传引用
   真正的以地址的方式传递参数
   传递以后,行参和实参都是同一个对象,只是他们名字不同而已
   对行参的修改将影响实参的值  

  $a = "123";
  $b = &$a;//引用赋值(在源变量前加&符号)
  echo $a."-".$b; // 输出:123-123
  echo "<br/>";
  $b = "456465"; // 输出:456465-456465
  echo $a."-".$b;

  // 结论 :
  // PHP 传引用时 形参 发声改变的时候 实参也发生改变;

传值,就是仅将对象的值传递给目标对象,就相当于copy;系统将为目标对象重新开辟一个完全相同的内存空间。
传引用,就是将对象在内存中的地址传递给目标对象,就相当于使目标对象和原始对象对应同一个内存存储空间。此时,如果对目标对象进行修改,内存中的数据也会改变。

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

 

12、如何命令下运行PHP脚本(两种方式),如何向PHP脚本传递参数?

(1)运行PHP脚本

方法一:先进入php安装目录,执行 php 路径/文件名.php

例:php my_script.php     php -f  "my_script.php"

方法二:php -r “php脚本”;(不需要加php的开始符和结束符)

例:php -r "print_r(get_defined_constants());"

(2)向php脚本传递参数:

方法一:使用$argv or $argc参数接收

php脚本:

<?php
echo "接收到{$argc}个参数";
print_r($argv);

 

执行:

[[email protected] lee]# /usr/local/php/bin/php test.php
接收到1个参数Array
(
    [0] => test.php
)
[[email protected] lee]# /usr/local/php/bin/php test.php a b c d
接收到5个参数Array
(
    [0] => test.php
    [1] => a
    [2] => b
    [3] => c
    [4] => d
)

 

方法二:使用getopt函数

php脚本:

<?php
$param_arr = getopt(‘a:b:‘);
print_r($param_arr);

执行:

[[email protected] lee]# /usr/local/php/bin/php test.php -a 345
Array
(
    [a] => 345
)
[[email protected] lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3
Array
(
    [a] => 345
    [b] => 12q3
)
[[email protected] lee]# /usr/local/php/bin/php test.php -a 345 -b 12q3 -e 3322ff
Array
(
    [a] => 345
    [b] => 12q3
)

 

 

 

什么是魔术引号

waring:本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除

魔术引号是一个将自动将进入PHP脚本的数据进行转义的过程,最好在编码时不要转义而在运行时根据需要而转义

当打开时,所有的 (单引号),"(双引号),\(反斜线)和 NULL 字符都会被自动加上一个反斜线进行转义。这和 addslashes() 作用完全相同。

一共有三个魔术引号指令:

  • magic_quotes_gpc 影响到 HTTP 请求数据(GET,POST 和 COOKIE)。不能在运行时改变。在 PHP 中默认值为 on 参见 get_magic_quotes_gpc()
  • magic_quotes_runtime 如果打开的话,大部份从外部来源取得数据并返回的函数,包括从数据库和文本文件,所返回的数据都会被反斜线转义。该选项可在运行的时改变,在 PHP 中的默认值为 off 参见 set_magic_quotes_runtime()get_magic_quotes_runtime()
  • magic_quotes_sybase 如果打开的话,将会使用单引号对单引号进行转义而非反斜线。此选项会完全覆盖 magic_quotes_gpc。如果同时打开两个选项的话,单引号将会被转义成 ‘‘。而双引号、反斜线 和 NULL 字符将不会进行转义。 如何取得其值参见 ini_get()

 
























































以上是关于PHP 面试题 PHP部分的主要内容,如果未能解决你的问题,请参考以下文章

php面试题之一——PHP核心技术(高级部分)

PHP 面试题 PHP部分

php面试题之五——PHP综合应用(高级部分)

php面试题之二——数据结构和算法(高级部分)

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

2021高频PHP面试题(值得收藏)