1、php中字符串可以使用哪三种定义方法以及各自的区别是什么?
答:单引号、双引号、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、请列出3种php数组循环操作的语法,并注明各种循环的区别
使用for循环
使用foreach循环
使用while、list()、each()组合循环
For只可以遍历索引数组
后两个可以遍历索引和关联数组
While、list()、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.可以记录函数的调用次数,从而可以在某些条件下终止递归
9、require 外部文件如果不存在,会报错,后面的代码不会执行
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);
18、cookie和session的区别:
1.cookie存在客户端,session存在服务器端
2.cookie相对不安全,session安全
3.cookie可以存的内容少,session可以存的内容多
19、method属性:提交方式:get(默认)和post
get方式是URL地址栏可见,长度受限制,相对不安全.
post方式是URL地址不可见,长度不受限制,相对安全.
20、r:只读,指针在文件头
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)
23、final最后
修饰的:类,方法,不能修饰属性
作用:防止继承,结束继承
特点: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.抽象类只能单继承,接口可以多实现
27、mysql_fetch_row() 和mysql_fetch_array之间有什么区别? (1分)
mysql_fetch_row()返回索引数组
mysql_fetch_array()返回索引加关联的数组
28、MySQL查询的安全方案
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);
33、bool empty(mixed $var)
当var存在,并且是一个非空非零的值时返回 FALSE否则返回 TRUE.
以下的东西被认为是空的:
"" (空字符串)
0 (作为整数的0)
0.0 (作为浮点数的0)
"0" (作为字符串的0)
NULL
FALSE
array() (一个空数组)
$var; (一个声明了,但是没有值的变量)
34、ajax技术利用了什么协议?简述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
43、PHP: Hypertext Preprocessor超文本预处理器,PHP是一个基于服务端来创建动态网站的脚本语言,您可以用PHP和HTML生成网站主页
对于大流量的网站,您采用什么样的方法来解决访问量问题?
答:确认服务器硬件是否足够支持当前的流量,数据库读写分离,优化数据表,
程序功能规则,禁止外部的盗链,控制大文件的下载,使用不同主机分流主要流量
谈谈对mvc的认识(1分)
答:由模型(model),视图(view),控制器(controller)完成的应用程序
由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图;
44、JS表单弹出对话框函数是?获得输入焦点函数是? (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;