PHP 面试的超级无敌总结

1php中字符串可以使用哪三种定义方法以及各自的区别是什么?

答:单引号、双引号、heredoc(等同于双引号)和newdoc(等同于单引号)定界符

单引号

单引号不解析变量,只解析单引号和反斜线本身

双引号

双引号可解析变量、

双引号可解析所有转义字符

使用“.”连接

最重要区别:单引号效率 > 双引号效率

如下为newdoc示例:

$a = <<< 'EOT'

  字符串

EOT;

echo $a;

如下为heredoc示例(无单引号):

$a = <<< EOT

  字符串

EOT;

echo $a;

2、直接赋值和引用赋值

 

举例

/**

 * 写出如下程序的输出结果

 * <?php

 *

 * $data = ['a', 'b', 'c'];

 *

 * foreach($data as $key => $val)

 * {

 *      $val = &$data[$key];

 * }

 * 程序运行时,每一次循环结束后变量$data的值是什么?请解释

 * 程序执行完成后,变量$data的值是什么?请解释

 */

3、预定义变量/超全局变量=======9

就是系统已经给你定义好的变量

$_GET获取表单以get方式提交过来的数据

$_POST获取表单以post方式提交过来的数据

$_REQUEST获取表单以get+post方式提交过来的数据

$_SESSION获取session信息

$_COOKIE获取cookie信息

$_ENV获取环境信息

$_SERVER获取服务器信息

$GLOBALS获取所有的全局变量信息

$_FILES获取文件上传信息

4、魔术常量(结果会根据位置的变化而变化)

__LINE__ 文件中的当前行号

__FILE__文件的完整路径和文件名

__DIR__文件所在的目录

__FUNCTION__函数名称

__CLASS__类的名称

__TRAIT__  trait的名称

__METHOD__类的方法名

__NAMESPACE__当前命名空间的名称(区分大小写)。

5、运算符优先级

递增/递减 > ! > 算术运算符 > 大小比较 > (不)相等比较 > 引用>位运算符(^> 位运算(|> 逻辑与>逻辑或>三目>赋值(=) >and > xor>or

/**

 * 下列程序中请写出打印输出的结果

 * <?php

 *

 * $a = 0;

 * $b = 0;

 *

 * if ($a = 3 > 0 || $b = 3 > 0)

 * {

 *      $a++;

 *      $b++;

 *      echo $a. "\n";

 *      echo $b. "\n";

 * }

 */ 1,1

6、请列出3php数组循环操作的语法,并注明各种循环的区别

使用for循环

使用foreach循环

使用whilelist()each()组合循环

For只可以遍历索引数组

后两个可以遍历索引和关联数组

Whilelist()each()组合不会reset()

Foreach 遍历会对数组进行reset()操作

另外,switch 和上面的不同是switch里面的控制表达式的数据类型只能是整形、浮点或者是字符串;switch case里面的continue相当于 break,跳出switch外面的循环可以使用continue2

7<?php

//引用

function &myFunc()

{

static $b = 10;

return $b;

}

echo myFunc();//10

$a = &myFunc();

$a = 100;

echo myFunc();//100

//函数没有调用就不要看

 

<?php

$var1 = 5;

$var2 = 10;

function foo(&$my_var)

{

global $var1;

$var1 += 2;

$var2 = 4;

$my_var += 3;

return $var2;

}

$my_var = 5;

echo foo($my_var). "\n";4

echo $my_var. "\n";  因为是引用传递,函数里面改变外面也会跟着改变8

echo $var1;7

echo $var2;10

$bar = 'foo';

$my_var = 10;

echo $bar($my_var). "\n";4

结果:

4

8

7104

/**

 * 写出如下程序的输出结果:

 * <?php

 *

 * $count = 5;

 * function get_count()

 * {

 *     static $count; null

 *     return $count++;

 * }

 * echo $count; 5

 * ++$count; 6

 *

 * echo get_count(); null

 * echo get_count(); 1

 *

 * ?>

 *

 */ 51

8、静态变量:仅在局部函数域中存在,但当程序离开此作用域时,其值不会消失。

特点:

1.仅初始化一次

2.初始化时需要赋值

3.每次执行函数的时候该值会保留

4.static修饰的变量是局部的,仅在函数内部有效

5.可以记录函数的调用次数,从而可以在某些条件下终止递归

9require 外部文件如果不存在,会报错,后面的代码不会执行

Include 外部文件如果不存在,会报错,后面的代码继续执行

 include_once()require_once()在加载之前要判断是否已经导入

10、函数的参数

默认情况下,函数参数通过值传递

如果希望允许函数修改它的值,必须通过引用传递参数

函数的返回值

1.值通过使用可选的返回语句(return)返回

2.可以返回包括数组在内的任意类型

3.返回语句会中止函数执行,将控制权交回函数调用出。

4.省略return 返回值为null,不可以有多个返回值

引用返回

从函数返回一个引用,必须在函数声明和指派返回值给一个变量时都使用引用运算符&

11、实参数目不确定时借助系统提供的三个函数

func_get_arg() 返回指定的实参

func_get_args() 数组方式返回所有的实参

func_num_args() 返回实参的数目

写一个函数,要求不使用array_merge完成多个数组的合并

<?php

 

// array_mer($arr1, $arr2, $arr3, ...... $arrn)

//

function array_mer()

{

    $res = [];

    $arrays = func_get_args();

//var_dump($arrays);

    foreach($arrays as $arr)

    {

        if (is_array($arr))

        {

            foreach($arr as $val)

            {

                $res[] = $val;

            }

        }

    }

    return $res;

}

var_dump(array_mer([1], [1,2], [3, 4]));

12正则的表达式的作用:分割、匹配、查找、替换字符串

13、不断在文件hello.txt头部写入一行"Hello World"字符串,要求代码完整

$str = file_get_contents(hello.txt);

$str = hello world.$str;

file_put_contents(hello.txt,$str);

14、数组---- 一种变量类型,复合类型

定义方式三种:$arr = array(); $arr = []; $arr[] = ‘’;

for只能遍历索引数组,不能遍历关联数组,并且遍历索引数组的时候for的效率最高。

foreach既可以遍历索引数组,又可以遍历关联数组。

15、输出方式的对比

echo  不是函数,没有返回值,可以使用逗号隔开,一次性输出多个标量只能打印标量,但是布尔的false不能打印;

Print(输出字符串)不是函数,返回值始终是1,只能输出标量,布尔false不能输出

Print_r() 是函数,有返回值,是bool可以打印标量,数组不能输出布尔的false

var_dump()是函数,没有返回值,可以打印所有的类型包括布尔的false

16、至少写出一种验证139开头的11位手机号码的正则表达式

$str = '13988888888';

$pattern = '/^139\d{8}$/';

preg_match($pattern, $str, $match);

var_dump($match);

17<?php

// 请匹配所有img标签中的src的值

$str = '<img alt="高清无码" id="av" src="av.jpg" />';

$pattern = '/<img.*?src="(.*?)".*?\/?>/i';

preg_match($pattern, $str, $match);

var_dump($match);

18cookiesession的区别:

1.cookie存在客户端,session存在服务器端

2.cookie不安全,session安全

3.cookie可以存的内容少session可以存的内容多

19method属性:提交方式:get(默认)post

get方式是URL地址栏可见,长度受限制,相对不安全.

post方式是URL地址不可见,长度不受限制,相对安全.

20r:只读,指针在文件头

r+:读写,指针在文件头

w:写,指针在文件头,清空写,创建写

w+:读写,指针在文件头,清空写,创建写

a:写,指针在文件尾,追加写,创建写

a+:读写,指针在文件尾,追加写,创建写

x:写,只能创建写

x+:读写,也是只能创建写

 

21、面向对象的三个目标:重用性、灵活性、扩展性

面向对象的三个特点:封装、继承、多态

class 类名

变量 –成员属性

函数 –成员方法

$对象 = null

(对象本身就是引用传递)

22、请写出php类权限修饰符

public protected private

Public 内,类外子类中都让用

Protected 内,子类中可以访问,类外不让用

Private 类内可以用,其他地方不让用

22、属性的重载:就是在当前环境下访问不存在或不可访问的属性的时候自动调用

①__set() 做赋值操作

格式:

public function __set($name, $value)

{

$this->$name = $value

}

外部调用方式:

$t->xx = zzz

②__get() 取值

格式:

public function __get($name)

{

return $this->$name;

}

外部调用方式

$xx = $t->xx 接收

echo $t->xx 打印

③__isset() 检测是否存在

格式:

public function __isset($name)

{

return isset($this->$name);

}

外部调用方式:

isset($t->xx)

④__unset() 做销毁

注意:没有返回值,所以不需要返回,直接销毁即可

格式:

public function __unset($name)

{

unset($this->$name);

}

外部调用方式为unset($t->xx)

23final最后

修饰的:类,方法,不能修饰属性

作用:防止继承,结束继承

特点:1.修饰类,类不能继承

2.修饰方法,方法不能重写

static函数中的静态变量,有什么效果?防止变量被销毁

范围:修饰方法,属性,不能修饰类

修饰了方法就是静态方法,修饰了属性就是静态属性,有什么用啊到底?可以不用实例化对象而直接调用

类常量:const 常量名 = 常量值

类外:类名::常量名 对象名::常量名

类内:self::常量名

24、方法的重载:当前环境不可见或者不存在的都会重载

注意:方法的重载和属性的重载不一样,方法肯定是有多个结果的,所以不论是不可见的还是不存在的,统一当做不存在处理,也就是说:回复统一的结果

25、魔术方法

__construct()构造方法new对象的时候,自动调用;

__destruct()析构方法 对象销毁的时候自动调用

属性的重载__set()赋值 __get()取值 __isset()检测__unset()销毁

对象的复制 __clone()克隆

方法重载__call()   __callStatic()

类的自动加载__autoload()

__sleep()  __wakeup()

__toString() 将对象作为字符串输出的时候自动调用

__invoke()将对象作为函数调用时自动调用

__debugInfo()把对象var_dump()打印的时候自动调用

26、对比接口和抽象类

1.抽象类中可以有普通方法,接口中必须都是抽象方法

2.抽象类中的方法可以是公共的和受保护的修饰,接口中的方法必须是公共的

3.抽象类中可以有成员属性,接口中不能有常规属性,接口可以有接口常量

4.抽象类和接口中的抽象方法必须都得实现,或者继续向下传递

5.抽象类只能单继承,接口可以多实现

27mysql_fetch_row() mysql_fetch_array之间有什么区别? (1)

mysql_fetch_row()返回索引数组

mysql_fetch_array()返回索引加关联的数组

 

28MySQL查询的安全方案

1、使用预处理语句防SQL注入

2、写入数据库的数据要进行特殊字符的转义

3、查询错误信息不要返回给用户,将错误记录到日志

其他

1、定期做数据备份

2、不给查询用户root权限,合理分配权限

3、关闭远程访问数据库权限

4、修改root口令,不用默认口令,使用较复杂的口令

5、删除多余的用户

6、改变root用户的名称

7、限制一般用户浏览其他库

8、限制用户对数据文件的访问权限

29、高并发解决方案案例

流量优化:防盗链处理

前端优化:减少HTTP请求,添加异步请求,启用浏览器缓存和文件压缩,CDN加速,建立独立图片服务器

服务端优化:页面静态化,并发处理,队列处理

数据库优化:数据库缓存,分库分表、分区操作,读写分离,负载均衡

Web服务器优化:负载均衡

30//n~m之间的随机数

// parseInt(Math.random()*100000000)%(m-n+1)+n;

31、请写出常见的排序算法(至少三种),并用PHP实现冒泡排序,将数组$a = array()按照从小到大的方式进行排序。

答:冒泡排序、直接插入排序、希尔排序、选择排序、快速排序、堆排序、归并排序、二分插入排序。

冒泡:

$a=array(1,9,34,78,2,11,5);

function maopao($arr){

$count=count($arr);

for($i=0;$i<$count;$i++)

{

for($j=$count-2;$j>=$i;$j--)

{

if($arr[$j]>$arr[$j+1])

{

$tmp=$arr[$j];

$arr[$j]=$arr[$j+1];

$arr[$j+1]=$tmp;

} } }

Return $arr;

}

Var_dump(maopao($a));

32、递归

// 打开目录

// 读取目录当中的文件

// 如果文件类型是目录,继续打开目录

// 读取子目录的文件

// 如果文件类型是文件,输出文件名称

// 关闭目录

$dir = './test';

function loopDir($dir)

{

$handle = opendir($dir);

while(false!==($file = readdir($handle)))

{

if ($file != '.' && $file != '..')

{

echo $file. "\n";

if (filetype($dir. '/'. $file) == 'dir')

{

loopDir($dir. '/'. $file);

}

}

}

 closedir($handle);

}

loopDir($dir);

33bool empty(mixed $var)

var存在,并且是一个非空非零的值时返回 FALSE否则返回 TRUE.

以下的东西被认为是空的:

"" (空字符串)

0 (作为整数的0)

0.0 (作为浮点数的0)

"0" (作为字符串的0)

NULL

FALSE

array() (一个空数组)

$var; (一个声明了,但是没有值的变量)

34ajax技术利用了什么协议?简述ajax的工作机制。

HTTP协议。简单来说,它就是调用了一个activeX发送了一个HTTP请求。

1)对象初始化

2)发送请求

3)服务器接收请求并进行处理

4)服务器返回响应数据

5)客户端接收

6)依据响应数据修改客户端页面内容

35、写出5个以上你所知道的常用的Linux命令和它的功能

ls 显示目录文件

cd 切换所在目录

mkdir 目录名 建立目录

touch  文件名 建立空文件

more  文件名 分屏显示文件内容

cp  源文件  目标位置 复制文件

mv 剪切或改名

Chmod修改文件权限

chown   修改属主/属组

man  命令名帮助命令

whereis  命令名查找命令的命令,同时看到帮助文档位置

find  查找位置   -name  文件名 按文件名查找

grep “字符串”  文件名查找符合条件的字串行。

tar  -zcvf  压缩文件/目录名  源文件

tar  -jcvf    shop.tar.bz2     shop  压缩

shutdown  -h  now关机

reboot 重启

mount    /dev/sr0  /media挂载

ifconfig  查询本机网络信息

ping测试网络连通性

route  -n 查看网关

pwd显示工作路径

36、写出一个函数 求两个日期的差数,例如2007-2-5~2007-3-6的日期差数

function getDays($d1,$d2) {

$nd1 = strtotime($d1);

$nd2 = strtotime($d2);

$days = ceil(abs($nd2-$nd1) / (60*60*24));

echo $days;

}

getDays($d1,$d2);

37、写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名

   例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php .php

   function getExt($url){

   $arr = parse_url($url);   

   $file = basename($arr['path']);

   $ext = explode(".",$file);

   return $ext[1];

}

38、HTTP协议中几种状态码最少写出五个来(并标明注释)

200请求成功

501服务器不支持客户端请求的功能

202请求已接受,服务器正在处理。

403服务器拒绝执行客户端的请求

404客户端所请求的资源未找到。

39、说说PHP中传值与传引用的区别

传值的话,如果是非对象,会传一个值的拷贝,对这个变量做任何改动都不影响原值。

传引用或者传对象,是传真实的内存地址,对这个变量做的改动会影响原值。

40、简单阐述以下redis的特点

a.单线程,利用redis队列技术并将访问变为串行访问,消除了传统数据库串行控制的开销

b.redis具有快速和持久化的特征,速度快,因为数据存在内存中。

c.分布式 读写分离模式

d.支持丰富数据类型

e.支持事务操作都是原子性,所谓原子性就是对数据的更改要么全部执行,要不全部不执行。

41、写出$.ajax参数对象中常用属性。(例:url:请求地址)

url:'7.php',//请求地址

async:true,//是否异步

data:{upid:0},//发送的数据

type:'post',//请求方式

dataType:'json',//响应回来的数据类型

42、JS的数据类型

Undefined、boolean、number、string、object、function

 

43PHP: Hypertext Preprocessor超文本预处理器PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHPHTML生成网站主页

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

:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,

   程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量

谈谈对mvc的认识(1)

:由模型(model),视图(view),控制器(controller)完成的应用程序

   由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;

44JS表单弹出对话框函数是?获得输入焦点函数是? (2)

:弹出对话框: alert(),prompt(),confirm()

   获得输入焦点 focus()

45、使用PHP语言自定义一个函数,此函数作用是将一个句子按单词反序。例如“One World One Dream”,反序后变为 “Dream One World One”。(5

$str = 'One World One Dream';

$arr = explode(' ', $str);

$num = count($arr);

for($i=0;$i<$num/2;$i++){

$tmp = $arr[$i];

$arr[$i]=$arr[$num-$i-1];

$arr[$num-$i-1] = $tmp;

}

echo implode(' ', $arr);

注:先调换第一个和最后一个,再调换第二个和第三个

一个套路的题:

实现字符串中"open_door"转换成"OpenDoor"

$str = open_door;

$arr = explode(_, $str);

foreach($arr as $key=>$value){

$tmp = ucfirst($value);

$arr1[] = $tmp;

}

echo implode( , $arr1);

46、请用简单的语言描述一下HTTP协议

HTTP协议就是客户机与服务器的请求与响应。

首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作就开始了。

2建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。   

3服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。   

客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。

 

47、什么是面向对象?主要特征是什么?

1) 面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰

2) 主要特征:封装、继承、多态

48用正则表达式判断$str是否是一个以半角逗号分隔的多个手机号码组成的字符串,是输出yes

<?php

$match="/((\d){11},)+/";

$str="12345678901,12345678901";

if(preg_match($match,$str)){

echo 'yes';

}

49、写出你知道的几种设计模式,并用php代码实现其中一种。

答案:单态模式、工厂模式、单例模式、生成器模式、代理模式、迭代模式

单态模式举例:

class Dantai{

private static $ob = null;

private function __construct(){}

public static function makeOb(){

if (self::$ob == null) {

self::$ob = new Dantai();

}

return self::$ob;

}

public function fun(){}

 

}

$a = Dantai::makeOb();

var_dump($a);

50、mysql中varchar的最大长度是多少?用什么类型的字段存储大文本?date和datetime和timestamp什么区别?怎么看数据库中有哪些sql正在执行?

答案:65535、text、

date只保留日期,不保留时分秒。

datetime保留日期和时分秒,MySQL检索且以‘YYYY-MM-DD HH:MM:SS’格式显示datetime值,支持的范围是‘1000-01-01 00:00:00’到‘9999-12-31 23:59:59’。

timestamp的格式与datetime相同,但其取值范围小于datetime,使用timestamp可以自动地用当前的日期和时间标记INSERT或UPDATE的操作,如果有多个timestamp列,只有第一个自动更新。

show processlist;

51、写出发帖数最多的十个人名字的SQL,利用下表:

members(id,username,posts,pass,email)

答案:如果posts为发帖数量怎SQL语句如下:

Select id,username form members order by posts desc limit by 10;

变形=>>写出发帖数量最多的5~15个人名字的SQL语句,利用下表;

Members(id,username,posts,pass,email);

select usernam from Members order by posts desc limit 4,10;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

phpstory

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

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

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

打赏作者

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

抵扣说明:

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

余额充值