一.PHP基础知识相关面试题

一.文件操作

1.下面哪个函数可以打开一个文件,以对文件进行读和写操作(1分)
A.fget() B.file_open() C.fopen() D.open_file()
C

  1. 写一个函数,尽可能高效的,从一个标准url里取出文件的扩展名
    方法一:
function get_ext($url){  
    $data = parse_url($url);  
    return pathinfo($data['path'], PATHINFO_EXTENSION);  
} 

3.有一个网页地址,比如PHP主页:http://www.phpv.net/index.html,如何得到它的内容?

方法一: curl

<?php
$url = “http://www.phpv.net/index.html”;
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
//在需要用户检测的网页里需要增加下面两行
//curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
//curl_setopt($ch, CURLOPT_USERPWD, US_NAME.”:”.US_PWD);
$contents = curl_exec($ch);
curl_close($ch);
echo $contents;
?>

方法二:

<?php
$url = 'http://www.example.com/';
//1.
$content = file_get_contents($url);
echo $content;
//2.
//如果出现中文乱码使用下面代码
//$getcontent = iconv(“gb2312″, “utf-8″,file_get_contents($url));
//echo $getcontent;
?>

方法三:

<?php  
$handle = fopen ("http://www.example.com/","rb");  
$contents = "";  
do {  
$data = fread($handle, 8192);  
    if (strlen($data) == 0)  
    {break;}  
    $contents .= $data;  
} while(true);  
fclose ($handle);  
echo $contents;  
?>  

Ps1.使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置 allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。

Ps2.使用curl必须空间开启curl。方法:WIN下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展。

Ps3.建议打开URL时使用file_get_contents()方法,可优化打开速度

4.写一个函数,能够便利一个文件夹下的所有文件和子文件夹

<?php
     function  my_candir($dir){
       $files=array();
        if($handle=opendir($dir)){
           while(($file=readdir($handle))){
 
                if($file!='..'&&$file!='.'){
                    if(is_dir($dir.'/'.$file)){                                       $files[$file]=my_candir($dir.'/'.$file);
 
                    }else{
                       $files[]=$file;
 
                    }
                               }
                         }
                    closedir($handle);
                    return $files;
                   }
             }
               echo '<pre>';
               print_r(my_candir("F:\amp"));

5…php读取文件内容的几种方法和函数?

1.$fp = Fopen($file_path,’r’);
   Fread($fp,filesize($file_path));
2.File_get_contents($file_path)
3.if(file_exists($file_path)){
		$file_arr = file($file_path);
		for($i=0;$i<count($file_arr);$i++){//逐行读取文件内容
			echo $file_arr[$i]."<br />";}
4.   
$file_path = "test.txt";
if(file_exists($file_path)){
$fp = fopen($file_path,"r");
$str ="";
while(!feof($fp)){
$str .= fgets($fp);//逐行读取。如果fgets不写length参数,默认是读取1k。
}

二.全局变量

1.常用的超全局变量(3个)

$_SERVER
$_GET
$_POST
$_REQUEST
$_COOKIE
$_SESSION

2.如何用php的环境变量得到一个网页地址的url?ip地址又要怎样得到?

$_SERVER["REQUEST_URI"]
$_SERVER["SERVER_ADDR"]

3.PHP变量不能包含哪些字符?至少写出五个。PHP的超全局变量有哪些?至少写出五个。
只能包含数字字母下划线和$.

$GLOBALS $_SERVER $_SESSION $_COOKIE $_GET $_POST $_REQUEST

三. 内置函数

1.写出用PHP打印出前一天的时间格式:2006-5-10 22:21:21
date(‘Y-m-d H:i:s’,strtotime(’-1 day’))

2. a r r = a r r a y ( ‘ j a m e s ’ , ’ t o m ’ , ’ s y m f o n y ’ ) ; 将 数 组 的 值 用 “ , ” 号 分 隔 并 合 并 成 字 串 输 出 i m p l o d e ( " , " , arr = array(‘james’,’tom’,’symfony’);将数组的值用“,”号分隔并合并成字串输出 implode(",", arr=array(james,tom,symfony);,implode(",",arr)

3.检测一个变量是否有设置的函数是否?是否为空的函数是?
isset() empty()

4.实现中文字串截取无乱码的方法。给定字符串string,从start处截取长度为length的字符串。
echo mb_substr(‘这样一来我的字符串就不会有乱码_’, 0, 7, ‘utf-8’);

5.常用的处理对象,数组,字符串的方法有哪些

array_search()在数组中搜索给定的值,如果成功则返回相应的键名,否则返回 FALSE
in_array()检查数组中是否存在某个值,如果存在则返回 TRUE ,否则返回 FALSE
is_array()用于检测变量是否是数组

strpos()查找 “php” 在字符串中第一次出现的位置
strlen() 字符串长度

In_array()
Array_slice()
Array_splice()
Array_merge()
Array_combine()
Array_intersect()
Array_diff()

6.PHP判断一个字符串里( s t r 1 ) 是 否 有 某 个 字 符 ( str1)是否有某个字符( str1str2)

$str = 'chinawinxp';
if(strpos($str,'xp')===false){
    echo '不存在!';
}else{
    echo '存在!'
}

<?php echo (int)’我是php程序员’;?>显示什么?

8.用PHP最少的代码写一个求3值最大的函数

Function maxnum($a,$b,$c){
Return $a >$b?($a>$c?$a:$c):($b>$c?$b:$c)
}

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

10.使用list()函数需要注意什么
该函数只用于数字索引的数组,且假定数字索引从0开始。(这句话很重要,是从索引0开始为变量赋值,如果对应的数字索引不存在,则对应位的变量也为空值。)

11.请说明php.ini中的safe_mode开启之后影响了哪些函数
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以上版本,则将此特性完全去除了。

12.PHP怎样判断字符串“abcd”是否存在于数组$arrsy( )中
in_array()

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

 $arr = [
 	['id'=>1,'name'=>'zhangsan','score'=>80],
 	['id'=>2,'name'=>'lisi','score'=>60],
 	['id'=>3,'name'=>'wangwu','score'=>90],
 	['id'=>4,'name'=>'zhaoliu','score'=>70]
 ];
 function score_sort($a,$b){
 	if($a['score'] == $b['score']) return 0;
 	return ($a['score']<$b['score'])?-1:1;
 }
usort($arr,"score_sort")

14.请以空格作为间隔,拆分字符串‘Apple Orange BananaStrawberry’,组成数组$fruit。
f r u i t = E x p l o d e ( ‘ ’ , fruit = Explode(‘ ’, fruit=Explode(,str)

15.请解析PHP数组函数array_filter()、array_push()、in_array()的用法

array_filter() 函数用回调函数过滤数组中的元素。
该函数把输入数组中的每个键值传给回调函数。如果回调函数返回 true,则把输入数组中的当前键值返回给结果数组。数组键名保持不变。
<?php
function test_odd($var)
{
return($var & 1);
}
$a1=array("a","b",2,3,4);
print_r(array_filter($a1,"test_odd"));
?>

array_push() 函数向数组尾部插入一个或多个元素。
提示:您可以添加一个或者多个值。
<?php
$a=array("red","green");
array_push($a,"blue","yellow");
print_r($a);
?>

in_array() 函数搜索数组中是否存在指定的值。
in_array("Runoob", $sites)

15.利用PHP语言实现数组$arr和json数组的转化?
Json_encode json_decode

四. 版本控制

6.您是否用过版本控制软件?如果有您用的版本控制软件的名字是?
Git是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理.

Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。

五.变量相关考察点

1.现有如下代码:
$a = true;
$b = false;
$c = ab12;
d = a x b 12 ; e c h o " d = axb12; echo " d=axb12;echo"a has value:". a ; / / 1 h a s v a l u e : 1 e c h o " a;//1 has value :1 echo " a;//1hasvalue:1echo"a has value:". b ; / / 1 h a s v a l u e : e c h o " b; //1 has value: echo " b;//1hasvalue:echo"a has value:". c ; / / 1 h a s v a l u e : e c h o " c;//1 has value: echo " c;//1hasvalue:echo"a has value:".$d;//1 has value:请写出程序输出结果

2.下面脚本运行后,$array数组的值是什么?(B)

<?php
  $array = array('1','1');
  foreach ($array as $K => $V) {
  	$V = 2;
  }
?>
A.array(‘2’,’2’)			B.array(‘1’,’1’)		C.array(2,2)
D.array(Null,Null)		E.array(1,1)

3.下面脚本运行后,屏幕显示什么样的信息(E)

<?php error_reporting(E_ALL); $array = array('abc'=>'def'); echo $array['abc'].$array['def']; ?>

A.abcdef B.def C.abc
E.def\nNotice:Undefined index:def in /xx/yy/zz.php on line 4

4.以下代码输出结果为(B)

<?php
	$s = '12345';
	$s[$s[1]] = '2';
	echo $s;
?>
A.12345   B.12245    C.22345    D.11345     E.array

5.PHP中,单引号和双引号所包围的字符串有什么区别?(AD)【选两项】
A.单引号速度快,双引号速度慢
B.双引号速度快,单引号速度慢
C.两者没有速度差别
D.双引号解析其中以$开头的变量,而单引号不解析
E.单引号解析其中\r\t等转义字符,而双引号不解析

6.字符串"0"在PHP和js中转换为布尔值是false还是true?
PHP是false.js是true

7.写出下面代码运行结果:

	$x = 1;
	++$x;
	$y =$x++;
	echo $y;

答案: 2

8.补全横线处应该使用的函数为?

	$email = ‘www@campusapp.com.cn’;    
	$str =         ($email,‘@’);
	$info =         (‘.’,$str);
	          ($info);
	输出结果为:Array ([0] => @ campusapp [1]=>com[2]=>cn

strstr explode var_dump

9.输出下面代码运行结果

	$A="Hello ";                 
	function print_A()              
	{
		$A = "php!";
		global $A;        
		echo $A;
	}
	echo $A;
	print_A();

答案: Hello Hello

10.写出下面代码运行结果:
print $a,“hello”;

Parse error: syntax error, unexpected ‘,’ in C:\phpStudy\PHPTutorial\WWW\lesson\1\test.php on line 2

11.写出下面代码运行结果:

	$type = 2;
	echo $type == 1 ? "一" : $type == 2 ? "二"  : $type == 3 ? "三" : "四";
答案  三

12.写出下面代码运行结果:(1分)

	$a = '1';
	$b = &$a;
	$b = "2$b";
	echo $a,$b;

21 21

13.以下脚本输出什么?<? $s = ‘12345’;$s[$s[1]] = ‘2’; echo $s ?>
12245

14.以下脚本输出什么?
<? $x = 'apple';echo substr_replace($x,'x',1,2); ?>
Axle 从apple字符串的第二个字符开始,将x替换字符串中的两个字符

15.请说明PHP中传值与引用的区别。什么时候传值什么时候引用?
传值这是把变量的值传递给另一个变量,引用是将变量的地址传递给另一个变量。
传值当改变其中一个变量的值,另一个变量不受影响,引用赋值时,当改变其中一个变量的值,另一个变量也是改变

16.PHP程序使用utf-8编码,以下程序输出结果是什么?C

<?php
$str = ‘hello 你好世界’;
Echo strlen($str);
?>

A)9 B)13(gbk) C)18 D)17(utf8)

17.写出下列代码输出结果: 6

<?Php
$a = 1+2+“3+4+5”;
Echo $a;
?>

18.POST和GET的区别?
(1)GET 从指定的资源请求数据,POST 向指定的资源提交要被处理的数据
(2) GET 请求可被缓存,POST 请求不会被缓存
(3)GET 请求保留在浏览器历史记录中,POST 请求不会保留在浏览器历史记录中
(4)GET 请求可被收藏为书签,POST 不能被收藏为书签
(5)GET 请求有长度限制,POST 请求对数据长度没有要求
(6)GET 请求不应在处理敏感数据时使用
(7)GET携带的参数存放在请求包的请求行中,而POST携带的参数存放在请求包的请求体部分

19.你用到过PHP中var_dump,print_r,empty,exit函数吗,说说你平时是怎样调试PHP程序的
print_r:打印关于变量的易于理解的信息,如果给出的是 string、integer 或 float,将打印变量值本身。如果给出的是 array,将会按照一定格式显示键和元素。object 与数组类似。 记住,print_r() 将把数组的指针移到最后边。使用 reset() 可让指针回到开始处。
var_export:跟print_r和var_dump类似,但是很少用。
var_dump:此函数显示关于一个或多个表达式的结构信息,包括表达式的类型与值。数组将递归展开值,通过缩进显示其结构。
var_dump和print_r的区别:var_dump返回表达式的类型与值而print_r仅返回结果,相比调试代码使用var_dump更便于阅读

20.写出以下程序的输出结果

$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;

4

21.写出以下程序的输出结果

   $str=”cd”;
   $$str=”wdmcake”;
   $$str=”ok”;
   echo $cd;

ok

六. 会话控制

1.下面哪个写法能够设置用户端的cookie的有效期是一个小时?A
A.time()+3600 B.time(3600) C.gmtime()+3600 D.gmtime(3600)

2.Session与cookie的区别和联系?
区别:
(1)session存储在服务器端,会占用服务器资源,cookie保存在客户端。
(2)Session过多的时候会消耗服务器资源,所以大型网站会有专门的Session服务器,而Cookie存在客户端所以没什么问题。
(3)单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
(4)cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

联系:
session是通过cookie来工作的
session和cookie之间是通过$_COOKIE['PHPSESSID']来联系的,通过$_COOKIE['PHPSESSID']可以知道session的id,从而获取到其他的信息。
在购物网站中通常将用户加入购物车的商品联通session_id记录到数据库中,当用户再次访问是,通过sessionid就可以查找到用户上次加入购物车的商品。因为sessionid是唯一的,记录到数据库中就可以根据这个查找了。

3.PHP session扩展默认将session数据存储在哪里?D
A)SQLite Database
B)MySQL Database
C)Shared Memory
D)File System
E)Session Server

4.禁用COOKIE后SEESION还能用吗?原因?
可以,通过URL传参的方式,传递session_id

七. 正则

1.php正则表达式验证ip地址

((1[0-9][0-9].)|(2[0-4][0-9].)|(25[0-5].)|([1-9][0-9].)|([0-9].)){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))

2.请对POSIX风格和兼容Prel风格两种正则表达式的主要函数进行类比说明
Perl 兼容正则表达式语法 preg_match() preg_replace()
POSIX风格 ereg ereg_replace

3.写一个验证邮箱的正则表达式。
$pattern = ‘/^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+$/’;

4.对于用户输入一串字符串 s t r i n g , 要 求 string,要求 stringstring中只能包含大于0的数字和英文逗号,请用正则表达式验证,对于不符合要求的$string返回出错信息。

$preg = '/^[1-9,]+$/';
$str = '20121';
preg_match($preg,$str,$arr);
var_dump($arr);

5.写出一个图片的正则表达式,并获取url?

$url='<img class="trans" src="http://s0.ifengimg.com/2016/05/24/1_2988ea16.jpg" alt="" title="" />';

$content=preg_match_all('/\<img.*?src=[\"|\']?([^\"]+)[\"|\']?\s*.*?>/i', $url, $matches);
var_dump($matches);

八. 错误报告

1.PHP错误类型及屏蔽方法
E_ERROR
E_WARNING
E_NOTICE
E_PARSE

error_reporting(0)
ini_set(‘display_errors’,‘off’);

2.Windows平台,Apache Http Server启动失败,排错思路是什么?
1 端口占用情况
2.路径及文件名文件。安装路径的文件夹名称中不能出现中文或空格
3.配置文件问题

3.怎样找到php.ini的路径?
phpinfo();
找到Loaded Configuration File这一行

4.PHP加速模式/扩展?PHP调试模式/工具?
1、eAccelerator
eAccelerator是一个自由开放源码PHP加速器,优化和动态内容缓存,提高了PHP脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。 它还有对脚本起优化作用,以加快其执行效率。使PHP程序代码执效率能提高1-10倍。从文字上可以理解为:eAccelerator是PHP加速器扩展。
2、memcached
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态、数据库驱动网站的速度。从文字上可以理解为:内存缓存扩展,并且针对于集群服务器使用较多,主要用于分布式缓存,算是数据库缓存。

PHP Debug Bar 是另一个非常棒的 PHP 调试工具,可以显示 web 应用的 pst 数据。
Whoops 是个更高效的 PHP 调试库,帮助开发者构建和维护他们的项目,使其做得更好。Whoops 也是个开源软件,有着许多杰出的特性。
Xdebug 是提供给 PHP 用户的一个扩展,有着许多高级的特性,每一时刻都有不同类型的更新。

5.语句include和require的区别是什么?为避免多次包含同一文件,可用(?)语句代替他们?
require:require("########");这个函数一般放在PHP文件的最前面,程序在执行前就会先导入要引用的文件。
include:include("############");这个函数一般放在程序的流程控制里边。只有程序在执行碰到才会引用。可以简化程序的执行流程。
最根本的区别在于遇到错误的处理方式还有require没有返回值而include有返回值。
require:一个文件存在错误时,执行就会中断。并返回一个致命错误。
include:一个文件存在错误,程序不会中断执行。会弹出一个警告。

Require_once
Include_once

6.简述phptry catch finally关键字分别有什么作用
try内部正常执行try的内部逻辑,异常则执行catch的内部逻辑结构,但是不管执行的哪个都会执行完try catch的内部逻辑(非return)后执行finally的内部逻辑。
      如果try catch都有return,按照正常执行,然后执行finally的逻辑,再返回对应的try 或者catch里执行return。
      如果try catch finally都有return,执行完finally的逻辑后,会调用finally的return。

九. 面向对象

1.如果你想要自动加载类,下面哪种函数声明是正确的 C

A)function autoload($class_name)
B)function__autoload($class_name,$file)
C)function__autoload($class_name)
D)function_autoload($class_name)
E)function autoload($class_name,$file)

2.写出php5的构造函数和析构函数?
__construct() __destruct()

3.Interface和abstract class有哪些异同?
1.相同点
(1)两者都是抽象类,都不能实例化。
(2)Interface实现类及abstract class的子类都必须要实现已经声明的抽象方法。
2.不同点
(1)接口需要实现,要用implements,而抽象类需要继承,要用extends
(2)一个类可以实现多个interface,而一个类只能继承一个abstract class
(3)Interface强调特定功能的实现,而abstract class强调所属关系。
(4)尽管 interface 实现类及 abstract class 的子类都必须要实现相应的抽象方法,但实现的形式不同。 interface 中的每一个方法都是抽象方法,都只是声明的 (declaration, 没有方法体 ) ,实现类必须要实现。而 abstract class 的子类可以有选择地实现。这个选择有两点含义: a) abstract class 中并非所有的方法都是抽象的,只有那些冠有 abstract 的方法才是抽象的,子类必须实现。那些没有 abstract 的方法,在 abstract class 中必须定义方法体; b) abstract class 的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
(5)abstract class 是 interface 与 class 的中介。 abstract class 在 interface 及 class 中起到了承上启下的作用。一方面, abstract class 是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。
(6)接口中的抽象方法前不用也不能加 abstract 关键字,默认隐式就是抽象方法,也不能加 final 关键字来防止抽象方法的继承。而抽象类中抽象方法前则必须加上 abstract 表示显示声明为抽象方法。
接口中的抽象方法默认是 public 的,也只能是 public 的,不能用 private , protected 修饰符修饰。而抽象类中的抽象方法则可以用 public , protected 来修饰,但不能用 private

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

叫我峰兄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值