PHP基础面试题

1.PHP的冒泡排序

<?php
//定一个数组
$arr = [10,1,5,4,7,9,3,6];
//控制轮次数
for($i = 0; $i < count($arr); $i++)
{
    //控制次数
    for($j = $i + 1; $j < count($arr); $j++)
    {
        //如果当前值大于后面的值
        if($arr[$i] > $arr[$j])
        {
            //位置交换
            $temp = $arr[$i];
            $arr[$i] = $arr[$j];
            $arr[$j] = $temp;
      }
    }
}
//输出
echo '<pre>';
print_r($arr);
echo '<pre/>';
?>

2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

1、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。

2、SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。

禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。

3.请写出数据类型(int char varchar datetime text)的意思;请问 varchar 和 char有什么区别?

Int 整数 char 定长字符 Varchar 变长字符 Datetime 日期时间型 Text 文本型 Varchar 与char的区别 char是固定长度的字符类型,分配多少空间,就占用多长空间。 Varchar是可变长度的字符类型,内容有多大就占用多大的空间,能有效节省空间。 由于varchar类型是可变的,所以在数据长度改变的时,服务器要进行额外的操作,所以效率比char类型低。

4. isset() 和 empty() 区别

Isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假,empty判断变量是否为空为假,只可传一个变量,如果为空为假则返回真。

5.请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?

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

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

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

6.PHP常用的字符操作函数

trim() 函数可以去除字符串的开始位置和结束位置的空格,并将结果字符串返回,默认情况下去除的字符是换行符和回车符(\n和\r),水平和垂直制表符(\t和X0B)
ltrim() 函数只从字符的开始处(左边)去除空格
rtrim() 函数只从函数的结束处(右边)去除空格
strtoupper 将字符串转为大写
strtolower 将字符串转为小写
ucfirst 如果字符串第一个字符是字母,将其转为大写
ucwords 将字符串的每个单词的首字母大写
strcmp() 比较两个字符串,如果相等,函数返回0
strlen() 函数测试字符串的长度
strpos($str,search,[int]) 查找search在$str中的第一次位置从int开
stripos($str,search,[int]) 函数返回字符串在另一个字符串中第一次出现的位置。该函数对大小写不敏感
strrpos($str,search,[int]) 查找search在$str中的最后一次出现的位置从int
submit($str,int start[,int length])从$str中strat位置开始提取[length长度的字符串]。
strstr($str1,$str2) 从$str1(第一个的位置)搜索$str2并从它开始截取到结束字符串;若没有则返回FALSE.

7.PHP 常用的数组操作函数

一、变量与数组的转换

compact() 将变量以变量名的方式组装成数组

<?php
$bianliang1 = '赵';
$bianliang2 = '锐';
$arr = compact('bianliang1','bianliang2');
//返回的结果为
['bianliang1'=>'赵','bianliang2'=>'锐'];
//应用场景1
在TP、Laravel中将查询出来的数据向末班引擎中添加的时候会用到..

extract()将数组解析成变量/ 和compact是反转的

<?php
$arr = ['bianliang1'=>'赵','bianliang2'=>'锐'];
extract($arr);
//使用-输出bianliang1(相当于你声明了一次变量,有点向ES6解构赋值的意思)
echo $bianliang1;

二、变量和字符串的转换

<?php
$str = '热爱,喜欢,兴奋';
$arr = explode(',',$str);//表示以字符串中的逗号分隔成数组
//结果为
['热爱','喜欢','兴奋'];

如果解析的字符串是个空字符串,结果是一个数组有一个索引为0的值,值为空;并不是个空数组;

<?php
$arr = ['热爱','喜欢','兴奋'];
//将数组解析成字符串
$str = implode(',',$arr);
//得到的结果为
'热爱,喜欢,兴奋'

三、数组和数组之间关系

array_merge()并集关系

<?php
$arr1 = ['赵','上','的'];
$arr2 = ['张','赵'];
//将2个数组合并
$arr_mer = array_merge($arr1,$arr2);
//结果为
['赵','上','的','张','赵']

array_diff() 差集关系

<?php
$arr1 = ['赵','上','的'];
$arr2 = ['张','赵'];
//获取第一个数组在第二个数组中的差集部分,就是没有的部分
$arr_dif = array_diff($arr1,$arr2);
//结果为
['上','的']

array_intersect()交集关系

$arr1 = ['赵','上','的'];
$arr2 = ['张','赵'];
//获取2个数组相交集的部分数组
$arr_inter = array_intersect($arr1,$arr2);
//结果为
['赵']

四、数组值的操作

array_pop()删除数组最后一个值

<?php
$arr = ['赵','上','的'];
array_pop($arr);//删除数组最后一个值
//结果为
['赵','上']

array_push()向数组中追加一个值

<?php
$arr = ['赵','上','的'];
array_push($arr,'王');//支持多个参数,比如第三个参数 仍然会被追加到数组中去
//得到结果为: (array_push不需要接收,直接引用操作原数组)
echo $arr;
['赵','上','的','王'];

五、判断值是否存在数组中

array_in()判断值是否存在数组中

<?php
$arr = ['name'=>'赵锐庆','age'=>18,'class'=>'大班'];
$bol = in_array('赵锐庆',$arr);//如果存在返回true 否则返回false
//得到结果为true

array_key_exists()判断键是否存在数组中

<?php
$arr = ['name'=>'赵锐庆','age'=>18,'class'=>'大班'];
$bol = array_key_exists('name',$arr);//如果值存在返回true,否则返回false
//得到结果为true

六、数组去重

array_unique()数组去从

<?php
$arr = ['赵','赵','锐'];
$arr_uni = array_unique($arr);//数组去重
//得到的结果为
['赵','锐']

七、获取二维数组中值的集合

array_column()获取二维数组中值的集合

$arr = [
    ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'],
    ['name'=>'孙悟空','id'=>'two','school'=>'南理工'],
    ['name'=>'刘德华','id'=>'three','school'=>'南理工'],
    ['name'=>'朱德','id'=>'four','school'=>'南理工'],
];
//提取name为键的值构成一维数组
$arr_colu = array_column($arr,'name');
//得到结果
['赵锐庆','孙悟空','刘德华','朱德']
//提取那么为键的值切提取对应数组红的id值作为键构成一维键值数组
$arr_colu = array_column($arr,'name','id');
['one'=>'赵锐庆','two'=>'孙悟空','three'=>'刘德华','four'=>'朱德']

八、提取数组的键与值

array_values()获取数组的键

<?php
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$arr_val = array_values($arr);//提取数组中的值
//得到的结果为
['赵锐庆','one','南理工'];

array_keys()获取数组的值

<?php
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$arr_key = array_keys($arr);//提取数组中键的集合
//得到结果为
['name','id','school'];

九、返回数组中值的和

array_count()返回数组中值的和

$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$number = count($arr);
//返回的结果 
3

十、返回数组随机的键

array_rand()返回数组随机的键

$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$number = array_rand($arr);
//返回的结果 
'id'

十一、搜索值是否存在数组中

array_search()搜索值是否存在数组中

<?php
$arr = ['name'=>'赵锐庆','id'=>'one','school'=>'南理工'];
$is = array_search('赵锐庆'=>$arr);
//返回的结果
'name'

十二、多维数组进行排序

/*
上面讲的数组排序都是指的一个整体数组,索引数组升序降序等等或者关联数组根据键值对的升序或者排序;
而这里将的排序是一个数组收到其他数组的影响进行排序;其实这种方式就如同对数据库的数据进行升降排序的道理是一致的;
*/        
$guys = array(
            array('name'=>'jake', 'score'=>80, 'grade' =>'A'),
            array('name'=>'jina', 'score'=>70, 'grade'=>'A'),
            array('name'=>'john', 'score'=>30, 'grade' =>'A'),
            array('name'=>'sss', 'score'=>70, 'grade'=>'C'),
            array('name'=>'ben', 'score'=>20, 'grade'=>'B')
        );
       //如上有一个数组,要求根据score字段升序,相同的情况下根据name字段排序;
       $score = array_column($guys,”score”);
       $score = array_column($guys,”name”);
       Array_multisort($score,SORT_ASC,$name,SORT_DESC,$guys );

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

  1. 打开文件,然后读取。Fopen() fread()

  2. 打开读取一次完成 file_get_contents()

9.简述Cookie的设置及获取过程

设置COOKIE的值:
Setcookie(名称,值,保存时间,有效域);
获取值:$_COOKIE['名称'];

10.面向对象中接口和抽象类的区别及应用场景?

  1. 有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义。
  2. 接口中全部是抽象方法,方法不用使用abstract定义。
  3. 当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口。

11.对于大流量的网站,您采用什么样的方法来解决访问量问题?

优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:

  1. 确定当前服务器设备是否满足流量需求。
  2. 使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
  3. 禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
  4. 控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
  5. 使用不同的主机分流主要流量,使服务器均衡负载。
  6. 使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。

12.用PHP写出显示客户端IP与服务器IP的代码

获取客户端IP:$_SERVER(“REMOTE_ADDR”);
获取服务器端IP:$_SERVER["SERVER_ADDR"];

13.写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。

<?php
function my_scandir($dir){
     $files = array();
     if ( $handle = opendir($dir) ){
         while ( ($file = readdir($handle)) !== false ) {
             if ( $file != ".." && $file != "." ) {
             if ( is_dir($dir . "/" . $file) ) {
                     $files[$file] = scandir($dir . "/" . $file);
                 }else {
                     $files[] = $file;
                 }
             }
         }
         closedir($handle);
         return $files;
     }
}

14.数据库索引有几类,分别是什么?什么时候该用索引?

普通索引主键索引唯一索引
并非所有的数据库都以相同的方式使用索引,作为通用规则,只有当经常查询列中的数据时才需要在表上创建索引。

15.写几个魔术方法并说明作用?

__call()当调用不存在的方法时会自动调用的方法
__autoload()在实例化一个尚未被定义的类是会自动调用次方法来加载类文件
__set()当给未定义的变量赋值时会自动调用的方法
__get()当获取未定义变量的值时会自动调用的方法
__construct()构造方法,实例化类时自动调用的方法
__destroy()销毁对象时自动调用的方法
__unset()当对一个未定义变量调用unset()时自动调用的方法
__isset()当对一个未定义变量调用isset()方法时自动调用的方法
__clone()克隆一个对象
__tostring()当输出一个对象时自动调用的方法

16.++i 和 i++哪一个效率高,为什么?

++i效率比i++的效率更高,因为++i少了一个返回i的过程。

17.magic_quotes_gpc()、magic_quotes_runtime()的意思是什么?

Magic_quotes_gpc()是php配置文件中的,如果设置为on则会自动POST,GET,COOKIE中的字符串进行转义,在‘之前加\

Magic_quotes_runtime()是php中的函数,如果参数为true则会数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义。

18. 框架中什么是单一入口和多入口,单一入口的优缺点?

  1. 多入口就是通过访问不同的文件来完成用户请求。

单一入口指web程序所有的请求都指向一个脚本文件的。

  1. 单一入口更容易控制权限,方便对http请求可以进行安全性检查。

缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好。

19. 对关系型数据库而言,索引是相当重要的概念,请回答有关索引几个问题:

索引的目的是什么?

  1. 快速访问数据表中的特定信息,提高检索速度
  2. 创建唯一性索引,保证数据库表中每一行数据的唯一性
  3. 加速表和表之间的连接
  4. 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

索引对数据库系统的负面影响是什么?

负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。

为数据表建立索引的原则有哪些?

  1. 在最频繁使用的、用以缩小查询范围的字段上建立索引

  2. 在平频繁使用的、需要排序的字段上建立索引

什么情况下不宜建立索引?

  1. 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引
  2. 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。

20.web应用中,数据库的读取频率远高于写入频率, 如何优化MySQL而应对此种情景?

  • 使用memcache缓存技术,将动态数据缓存到文件,访问动态页面时直接调用缓存文件,而不必重新访问数据库,这样就减少了查询数据库的次数。

  • 如果网站的访问量很大,可以把数据库读写服务器分开,使用多台服务器去处理数据库查询,使用较少的服务器去处理数据库的写入和修改。

21. include与require的区别?

1.include()在执行文件时每次都要进行读取和评估
require()文件只处理一次(实际上文件内容替换了require()语句)
2.require()通常放在PHP脚本程序的最前面
include()的使用和require()一样,一般放在流程控制的处理区段中,PHP脚本文件读到include()语句时,才将它包含的文件读进来,这种方式,可以把程序执行时的流程简单化
3,require()include()语句是语言结构,不是真正的函数,可以像PHP的其他语言结构一样
4,include_once()require_once()语句也是在脚本执行期间包括并运行指定文件,与include() require()唯一的区别是如果文件中的代码已经被包括了,则不会再次包括.
5,require() 包含文件失败,停止执行,给出错误(致命的)
include() 常用于动态包含.
通常是自动加载的文件,即使加载出错,整个程序还是继续执行
一个页面声明,另一个页面调用
包函文件失败,继续向下执行,返回一条警告

22. PHP字符串中单引号与双引号的区别?

单引号不能解释变量,而双引号可以解释变量。

单引号不能转义字符,在双引号中可以转义字符。

23.了解XSS攻击吗? 如何防止 ?

  • XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。
  • 使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。
    SQL注入漏洞产生的原因 ? 如何防止?

SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。

24. 防止SQL注入:

  1. 开启配置文件中的magic_quotes_gpc和magic_quotes_runtime设置
  2. 执行sql语句时使用addslashes进行sql语句转换
  3. Sql语句书写尽量不要省略小引号和单引号
  4. 过滤掉sql语句中的一些关键字:update、insert、delete、select、*
  5. 提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。
  6. Php配置文件中设置register_globals为off,关闭全局变量注册
  7. 控制错误信息,不要再浏览器上输出错误信息,将错误信息写到日志文件中。

25.、如何处理负载,高并发?

  1. HTML静态化
    效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。
  2. 图片服务器分离
    把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如七牛等
  3. 数据库集群和库表散列及缓存
    数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。
  4. 镜像:
    尽量减少下载,可以把不同的请求分发到多个镜像端。
  5. 负载均衡:
    Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。

26.PHP的基本变量类型

四种标量类型:boolean (布尔型)、integer (整型)、float (浮点型, 也称作 double)、string (字符串)
两种复合类型:array (数组)、object (对象)
最后是两种特殊类型:resource(资源)、NULL(NULL

26. 什么是面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

封装:封装就是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别,将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。
封装的目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。

继承:继承是面向对象的基本特征之一,继承机制允许创建分等级层次的类。继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

多态:多态同一个行为具有多个不同表现形式或形态的能力。是指一个类实例(对象)的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容