PHP基础

来源:互联网 发布:录入数据打字平台 编辑:程序博客网 时间:2024/05/21 10:09
-1.yii2框架和TP框架的区别
yii是纯面向对象的框架,tp有一系列单字母函数,yii相对来说可以避免项目冲突,对于配置文件,yii支持多配制文件,所以更灵活,yii封装了大量控件和类库,tp框架上手快,是国内的框架,在中国用的最多,中文文档比较多。但是框架只是一个工具,用熟悉了,开发起来都很强大。

0.数据库优化
1.分库、分表
2.数据库读写分离
3.设计适当字段类型
4.适当增加冗余字段,加快查询速度
5.适当建立索引,当用联合索引时,出现最频繁的索引字段出现在最左边
6.一般用表连接要比子查询快,但要测试后使用
7.适当用到事务
8.SQL优化

1.CDN和反向代理:
(1)CDN(内容分发网络)的本质依然是一个缓存,而且将数据缓存在离用户最近的地方,使用户以最快速度获取数据。CDN能够缓存的一般是静态资源,如图片、文件、CSS、JavaScript脚本、静态网页等。由于这些文件访问频率很高,将其缓存在CDN可极大改善网页的打开速度。

(2)反向代理的作用:1、保护网站服务器安全  2、加速Web请求响应速度。当用户第一次访问静态内容的时候,静态内容就被缓存在反向代理服务器上,这样当其他用户访问该静态内容的时候,就可以直接从反向代理服务器返回,加速Web请求响应速度,减轻Web服务器负载压力。3、实现负载均衡。

2.nginx与Apache:它们同是服务器
Nginx可以做反向代理服务器,Nginx支持负载均衡,Nginx更支持高并发,前端、静态资源适合用Nginx,后端动态请求适合用Apache,Apache相对更稳定、bug少。

3.负载均衡(nginx可以做负载均衡服务器):负载均衡就是将用户请求分摊到多个操作单元上进行执行,例如web服务器,FTP服务器。从而共同完成工作。

4.冗余技术:冗余技术就是增加多余的设备,以保证系统更加可靠、安全地工作。冗余技术就是为了避免单点故障.冗余技术就是你的备胎。

5.数据库读写分离:通过配置两台数据主从关系,可以将一台数据库服务的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库的读写分离,从而减轻数据库负载压力。主数据库负责写操作,从数据库负责查。

6.Web前端性能优化:主要优化手段有优化浏览器访问、使用反向代理、CDN等。

7.如何解决应用服务器压力过大的问题:服务器负载均衡,缓存,分布式(分布式数据库与文件系统),数据库优化。

8.数据库语句:
(1)where price not between 3000 and 5000    //不在3000与5000之间的值
(2)group by:一般情况下group需与统计函数(聚合函数,如max(),avg()求平均值 等)一起使用才有意义
求每个栏目的商品平均价格   select cat_id,avg(goods_price) from goods group by cat_id;
注意:如果group by前面没有使用聚合函数,所以默认就取每个分组的第一行数据
(3)having与where类似,可以筛选数据,where后的表达式怎么写,having后就怎么写
                where针对表中的列发挥作用,查询数据
                having对查询结果中的列发挥作用,筛选数据
            同时使用where与having
               select cat_id,goods_name,market_price - shop_price as s from goods where cat_id = 3 having s > 200;
             查询两门及两门以上科目不及格的学生的平均分
              select name,sum(score<60) as gk,avg(score) as pj from stu group by name having gk >1;
    (4)order by
    (1) order by price  //默认升序排列
                (2)order by price desc //降序排列
                (3)order by price asc //升序排列,与默认一样
                (4)order by rand() //随机排列,效率不高
                #按栏目号升序排列,每个栏目下的商品价格降序排列
                        select * from goods where cat_id !=2 order by cat_id,price desc;
    (5)limit
    limit [offset,] N
        offset 偏移量,可选,不写则相当于limit 0,N
        N     取出条目 
       取价格第4-6高的商品
           select good_id,goods_name,goods_price from goods order by good_price desc limit 3,3;
(6) 1.左连接: 以左表为准,去右表找数据,如果没有匹配的数据,则以null补空位,所以输出结果数>=左表原数据数
2.右连接:a left join b 等价于 b right join a。
3.内连接(inner join):查询结果是左右连接的交集
一般用左连接不用右连接。
查询商品的名称,所属分类,所属品牌
            select goods_id,goods_name,goods.cat_id,goods.brand_id,category.cat_name,brand.brand_name from goods left join category on goods.cat_id = category.cat_id left join brand on goods.brand_id = brand.brand_id limit 5;

9.数据库优化:
(1)分库:一个业务一个数据库。
(2)分表   
水平分表:将一个表数据分到多个表。优点:加快查询速度;缺点:代码维护难度增加。
垂直分表:将字段分到不同的表。
(3)分区:分区可以避免水平分表的弊端,成为解决海量数据存储的有力方法。
表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个表空间(物理文件上),这样查询数据时,不至于每次都扫描整张表。
(4)读写分离:从库负责读,主库负责写。一主多从。原因是项目都是读操作比较频繁。
原理:从库复制主库bin-log日志文件,bin-log存放的写操作, 从库重新执行主库bin-log文件。
主从配置优点
1. 减轻单个数据库的压力,加快查询、写速度
2. 从库是主库备份,并且从库之间也是互相备份
3. 主库挂掉了,可以迅速将从库切换成主库

缺点: 主从数据库数据可能有延迟。
实时性要求高的数据还是从主库里面读取。
(5) SQL优化。

1.选取最适用的字段属性
2、使用连接(JOIN)来代替子查询
3、使用索引
4、优化查询语句

10.MVC:MVC是一种设计模式,分层思想。
M(Model),模型。处理数据逻辑。
C(Controller),控制器。处理用户交互的部分。

V(View),视图。 将数据更好显示给用户看。

基于MVC的框架有:Thinkphp、Yii、Laravel

11.Smarty(一种模板引擎):用来将原本与HTML代码混杂在一起PHP代码逻辑分离,目的就是要使PHP程序员同前端人员分离。

12.如何处理高并发?
1.  通过增加服务器来增强你的处理能力
2.  web服务器可以考虑更换成Nginx
3.  搭建消息队列系统
4.  数据库主从搭建
5.  禁止大文件下载
6.  使用反向代理/CDN技术

14.缓存:页面静态化(文件)和数据缓存(memcache)
file_put_contents('文件名', '数据');
数据:html+数据库数据

如果你说我的项目用到缓存。别人问你的缓存如何做的?

商品模块   =》 找出热销商品  => 浏览量  =》 统计模块 =》 根据商品ID 
查询数据得到对应商品数据  =》  使用Memcache缓存起来

15.SQL防注入:PDO预处理

16.面向对象:
面向对象是一种编程思想,特点:灵活性、重用性好、扩展性好   特性:封装、继承、多态

17.索引:
索引分类: 主键索引
唯一索引
常规索引
全文索引(不支持中文,用Sphinx代替)
但是索引也是有成本的,也就是说索引也是占据空间的。

用不到索引的情况:
* 字段没有设置非空,将不能用到索引


* 字段使用函数,将不能用到索引

select createtime from aa where date(createtime) = curdate();
//where后面的字段(createtime)使用函数,将不会使用到索引。

* 用数字当字符类型,数字一定要加引号

select * from user where name = 123 //这SQL语句用不到name索引

select * from user where name = '123' //这样写才会用到name字段上的索引

* 在使用like关键字进行查询的语句中,如果匹配字符串的第一个字符为"%",索引不会起作用。

//用不到索引的
desc select *  from t where name like "%j%"\G;

//用到索引
desc select *  from t where name like "j%"\G;
* 查询语句的查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询中才使用索引。否则查询将不使用索引。
* order by 的字段混合使用asc和desc用不到索引
* 对不同关键字使用order by 排序
* where 子句使用的字段和order by 的字段不一致
select * from user where name = 'jack' order by id;
创建索引:
在表上创建一个简单的索引。允许使用重复的值:
CREATE INDEX index_name ON table_name (column_name)
在表上创建一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
CREATE UNIQUE INDEX index_name ON table_name (column_name)

联合索引:create index person_name on person (last_name, first_name)

联合索引的第一个字段一定要使用,否则无效.

18.字段类型: enum   枚举  
tinyint

19. int(11) vs int(21)
存储空间还是存储范围有区别?
int(11)与int(21)的存储空间与存储范围是一样的。

区别是:如果你选择是int(11),那么你存放了一个1,那么结果是1前面有10个0,int(21)前面有20个零,设置的是zerofill

20.char与varchar

char存储空间定长,容易造成空间的浪费。char数据类型存储大小最大为255字符。

最大255个字符的意思是最大只能存放255个字母或者255个汉子

varchar存储变长,节省存储空间,varchar需要一位来存储长度。varchar是使用多少,就使用多少空间。所以通常都是选择varchar。

varchar数据类型可以存储超过255个字符

注意:char和varchar存储单位为字符。字符与字节需要换算。现在基本都用varchar。如果是utf-8编码,则1个字符是3个字节。

21.InnoDB与MyISAM区别
1. 事务处理支持与否

InnoDB是支持事务,MyISAM不支持事务。
2. 查询速度不一样
在增、删、改和查方面,myisam要优于innodb表引擎,当数据量特别大时,他们的速度相差不大。
一般认为MyISAM查询速度快。

3. 锁机制不一样

InnoDB支持行锁、表锁,MyISAM只有表锁。

4. 文件存放方式不一样

MyISAM产生三个文件,.frm是存放表定义,.MYD存放数据,.MYI存放表的索引

InnoDb的数据与索引一般是在一起存放的。
5.数据安全性
InnoDB表比MyISAM表更安全,因为InnoDB具有崩溃恢复能力。

### 应该选择哪种表引擎
1. 如果你的mysql版本是5.6以后的都应该选择InnoDb
2. 如果你的mysql版本是5.6以前,如果这个表的查询频繁高,应该选择MyISAM.如果这个表的写操作频繁,应该选择InnoDb

myisam:表锁
读  =>  表锁  =》  读锁:不会阻塞其他的读,但是阻塞写
写  =》 表锁   =》 写锁: 阻塞读、写

innodb:
行锁:影响的是一行。

表锁特点
> MyISAM存储引擎只支持表锁,所以对MyISAM表进行操作,会存在以下情况:
* 对MyISAM表的读操作,不会阻塞其他进程对同一个表的读请求,但会阻塞对同一个表写请求。只有当读锁释放后,才会执行其他进程的写操作。
* 对MyISAM表的写操作,会阻塞其他进程对同一个表的读和写操作,只有当写锁释放后,才会执行其他进程的读写操作。

行锁的特点
InnoDB存储引擎是通过索引上的索引项加锁来实现的,这就意味着:只有通过索引条件检索数据,InnoDB才会使用行级锁。否则,InnoDB将使用表锁。

22.SESSION与COOKIE区别与联系

1. 存放位置不同
2. 存放大小不同
3. 安全不一样 

联系: session是基于cookie的。session会把PHPSESSID存放到COOKIE中。
session实际上就是存储在服务器的一个文本文件。
cookie如果设置为临时的,则cookie存在于服务器交互的HTTp头部,用户退出站点,包含在会话Cookie里的所有数据都会销毁;如果设置成永久的,则以文本方式放在客户机。

2. SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?
1) http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户

2) SESSION保存在服务器端,COOKIE保存在客户端,SESSION依赖COOKIE进行传输,如果COOKIE被禁用了,SESSION将不能继续使用

23.get与post的区别

(1)get一般是用来获取服务器的数据,post一般是用来往服务器提交数据;
(2)get传输数据要在URL中显示出来,post传输数据时不需要,Post是将数据放在form的数据体;
(3)get传输数据有大小限制,一般2kb,post传输大小相对较大;
(4)在传输数据时,post相对更安全。

24. echo, print,print_r的区别

echo,print是语言结构,print_r是函数  
echo可以一次输出多个变量,print,pring_r每次输出一个变量
print,echo只能打印简单类型( int 字符串 ) print_r打印复杂类型(array object)

25.魔术方法: a.__construct()构造方法,对象实例化的时候
b.__destruct()析构方法,对象销毁的时候
c.__set() 在用户为私有或受保护的属性设置值的时候自动调用
d.__get() 直接在对象外部获取私有或受保护的属性设置值时会自动调用
e.__isset() 在对象外部调用isset函数
f.__unset() 在对象外部调用unset函数
g.__call() 调用一个不存在的方法的时候会调用此魔术方法
h.__toString()直接输出对象时会自动调用
i.__autoload()尝试创建类的实例的时候会自动调用该函数
j.__sleep() 对象串行化的时候会自动调用
k.__wakeup() 对象反串行化的时候会自动调用
l.__clone() 对象克隆时会自动调用
m.__set__state() 和函数一样的效果
n.__invoke()    当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用。
o.__callStatie()   当调用的静态方法不存在或权限不足时,会自动调用__callStatic方法

26.Linux基本操作:
(1)touch 文件名     ——创建空文件
(2)rm -rf 文件名 ——删除文件
(3)cat 文件名 ——查看文件内容,从头到尾
(4)more 文件名 ——分屏显示文件内容
(5)cp 源文件 目标位置——复制
(6)mv 源文件 目标位置 ——剪切
(7)权限位(共十位)第一位:代表文件类型 (- 普通文件)(d 目录文件)(l 链接文件)
后九位 属主权限u    属组权限g     其他人权限o
r 4
w 2
x 执行1
(8)chmod 755 aa ——修改权限(给aa这个文件修改权限为755)
(9)chown 用户名 文件名——修改文件所属主
(10)useradd 用户名——添加用户
(11)passwd 用户名——设定用户密码
(12)find 查找位置 -name 文件名——按文件名查找
(13)netstat ——查看网络状态
(14)压缩和解压缩
tar  -zcvf  压缩文件名  源文件    ——压缩
tar  -zxvf  压缩文件名 ——解压缩
(15)ifconfig  ——查询本机网络信息
(16)top ——查看CPU
(17)free ——查看内存

27.基础语法:
类型
八大类型: 字符串、int  float  boolean  array  obejct 资源 null

复合类型:数组、对象

特殊类型: 资源、null

28.isset() 和 empty() 区别,对不同数据的判断结果
1)isset()是判断变量是否存在,是否定义
2)empty()是判断变量的值是否为空.

29.thinkPHP中,M()和D()两个方法的区别:
ThinkPHP 中M方法和D方法都用于实例化一个模型类,M方法实例化的参数是数据库的表名,而D方法 实例化的是自己在model文件夹下建立的模型文件。相对于来说,M效率更高。

30.数据库存储过程:存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
1.定义一个存储过程
create proc 存储过程名
  @参数1        数据类型 [=默认值] [output],
  @参数2        数据类型 [=默认值] [output],
  ...
  as
  SQL语句

2.例子:
定义存储过程:
  create proc usp_StudentByGenderAge
  @gender nvarchar(10) [='男'],
  @age int [=30]
  as
  select * from MyStudent where FGender=@gender and FAge=@age

执行存储过程:
调用默认的参数:
  exec usp_StudentByGenderAge
  调用自己指定的参数:
  exec usp_StudentByGenderAge '女',50
  或者指定变量名        
exec usp_StudentByGenderAge @age=50,@gender='女'

30.触发器
触发器是一种特殊的存储过程。一般的存储过程是通过存储过程名直接调用,而触发器主要是通过事件(增、删、改)进行触发而被执行的。其在表中数据发生变化时自动强制执行。
  常见的触发器有两种:after(for)、instead of,用于insert、update、delete事件。
  after(for)        表示执行代码后,执行触发器
  instead of        表示执行代码前,用已经写好的触发器代替你的操作

触发器语法:
  create trigger 触发器的名字   on 操作表
  for|after         instead of
  update|insert|delete
  as
  SQL语句

31.redis和memcache的区别:
(1)redis支持更多的数据结构的存储。
(2)redis可以将内存中的数据保存到磁盘中。
(3)redis支持数据备份。

32.有一个网页地址, 比如PHP开发资源网主页: http://www.phpres.com/index.html,如何得到它的内容?
echo file_get_contents("http://www.phpres.com/index.html");


33.获取一个文件的扩展名
function get_ext1($file_name){
    return strrchr($file_name, '.');
}

34.冒泡排序
$arr=array(23,5,26,4);
$n =count($arr);
for($i=0;$i<$n-1;$i++){
//外层循环n-1 
for($j=0;$j<$n-$i-1;$j++){  
if($arr[$j]>$arr[$j+1]){
//判断数组大小,颠倒位置
  $kong=$arr[$j+1];  
$arr[$j+1]=$arr[$j]; 
  $arr[$j]=$kong; 

}
}
    
35.PHP中获取图像尺寸大小的方法是什么?
getimagesize() 获取图片的尺寸
Imagesx() 获取图片的宽度
Imagesy() 获取图片的高度

36.用PHP打印出前一天的时间,打印格式是2007年5月10日22:21:21
echo date('Y年m月d日 H:i:s',strtotime('-1 day'));
或者
echo date('Y年m月d日 H:i:s',time()-3600*24);

37.假设a.html和b.html在同一个文件夹下面,用javascript实现当打开a.html五秒钟后,自动跳转到b.html。

function go2b(){
window.location = “b.html”;
window.close();
}
setTimeout( “go2b()”,5000 ); //5秒钟后自动执行go2b()

38.用PHP写出显示客户端IP与服务器IP的代码
打印客户端IP:echo $_SERVER[‘REMOTE_ADDR’]; 或者: getenv(‘REMOTE_ADDR’);
打印服务器IP:echo gethostbyname(“www.bolaiwu.com”);

39.用最少的代码写一个求3值最大值的函数
function($a,$b,$c){
    return $a>$b? ($a>$c? $a : $c) : ($b>$c? $b : $c );
  }

40.求两个日期的差数,例如2007-2-5 ~ 2007-3-6 的日期差数
  $begin=strtotime('2007-2-5');
  $end=strtotime('2007-3-6');
  echo ($end-$begin)/(24*3600);
41.数据表设计合理,符合3NF 及3范式

1NF :就是具有原子性,不可分割.(只要使用的是关系性数据库,就自动符合)
2NF: 在满足1NF 的基础上,我们考虑是否满足2NF: 只要表的记录满足唯一性,也是说,你的同一张表,不可能出现完全相同的记录, 一般说我们在 表中设计一个主键即可.
3NF: 在满足2NF 的基础上,我们考虑是否满足3NF:即我们的字段信息可以通过关联的关系,派生即可.(通常我们通过外键来处理)

42.http和https的区别
不同的连接方式:http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,HTTPS比http协议安全。
用的端口也不一样:http是80,后者是443。

43.单例模式和工厂模式
单例模式:创建一个单一功能访问点,只能实例化一次。
工厂模式:实例化一个类,但是由它不同的子类决定具体是什么,不同的子类创建不同的产品。

44.命名空间
解决重名的问题。PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误,相当于加了不同的前缀。

45.lamp流程
1. 用户发送http请求到达httpd服务器
2. httpd解析url获取需要的资源的路径,通过内核空间读取硬盘资源,如是静态资源,则构建响应报文,发回给用户
3.如果是动态资源,将资源地址发给php解析器,解析php程序文件,解析完毕将内容发回给httpd,httpd构建响应报文,发回给用户
4. 如果涉及到数据库操作,则利用php-mysql驱动,获取数据库数据,返回给PHP解析器。
注明:httpd是Apache超文本传输协议(HTTP)服务器的主程序,在Linux系统中运行。

46.主键和索引
主键:是表行数据的唯一标识,具有唯一性和非空属性。
索引:主要作用是用于查询,提供查询速度的。

47.处理跨域请求
(1).使用jsonp,如果在JQ里ajax中,则把数据类型改成jsonp
$.ajax({
          type : "get",
          url :xhrurl,
          dataType : "jsonp",
          data : {id : 10},
          jsonp: "callbackparam",//传递给请求处理程序或页面的,用以获得jsonp回调函数名的参数名(默认为:callback)
          jsonpCallback:"jsonpCallback1",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名.如果这里自定了jsonp的回调函数,则success函数则不起作用;否则success将起作用
          success : function(json){
              alert(json[0].name);
          },
          error:function(e){
              alert("error");
          }
      });


      这两个参数最终会拼接在请求的url后面,变成 http://www.xxx.com/ajax/xxx.ashx?callbackparam=jsonCallback1

(2).只需要在服务器端头部加上下面两句代码:
  header( "Access-Control-Allow-Origin:*" );
  header( "Access-Control-Allow-Methods:POST,GET" );


48.   @ 错误控制运算符
当将其放置在一个PHP表达式之前,该表达式可能产生的任何错误信息都被忽略掉。

49.js网页前进、后退
<a href="javascript:history.go(-1);">后退</a>
<a href="javascript:history.go(1);">前进</a>

50.php部分函数
count() 计算数组中的单元数目或对象中的属性个数
array_keys() 返回数组所有的键,组成一个数组
array_values()返回数组中所有值,组成一个数组
array_combine()生成一个数组,用一个数组的值作为键名,另一个数组值作为值


trim() 删除字符串两端的空格或其他预定义字符
strtolower() 字符串转为小写
strtoupper() 字符串转为大写
substr() 截取字符串
str_replace() 字符串替换操作,区分大小写


51.include()与require()的区别
include一个文件存在错误的话,那么程序不会中断,而是继续执行,并显示一个警告错误。
require一个文件存在错误的话,那么程序就会中断执行了,并显示致命错误。
require是在程序执行之前就执行了。
include_once()和require_once()

52.HTTP状态码
200请求成功、302请求的页面移动到新的位置、400语法错误、403服务器拒绝访问、404服务器找不到请求页面、500服务器内部错误

1字头:消息
2字头:成功
3字头:重定向
4字头:请求错误
5、6字头:服务器错误

53.线程与进程的区别与联系
(1)一个程序至少有一个进程,一个进程至少有一个线程。
(2)通常都是把进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。
(3)进程间相互独立,同一进程的各线程间共享。某进程内的线程在其它进程不可见。

54.opcache
OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销。

55.php遍历目录(4月20)
代码:
$path = './php5';// 相对路径
// 1.打开目录
$resource = opendir($path);
// 2. 由于目录有几个并不知道,所以使用while
while($filename = readdir($resource))
{
// 遍历目录必须跳过 . .. (这是系统里固定存在的两个)特别是删除时
if($filename == '.' || $filename == '..') continue;
echo $path . '/' .$filename . '<br>';
}
// 3. 关闭目录
closedir($resource);


56.APP接口
传输数据类型有xml和json
xml和json区别:
(1)可读性,xml好;(2)生成数据是否方便:json好;(3)传输速度方面:json好;
json转换:
把数组转换成json数据:json_encode()
json解析函数:json_decode()


57.定义常量const与define的区别
const  FOO = 'BAR';  
define('BIT', 5); 
(1)const用于类成员变量的定义,一经定义,不可修改。define不可用于类成员变量的定义,可用于全局常量。
(2)const可在类中使用,define不能。
(3)const不能在条件语句中定义常量。
(4)const定义常量时大小写敏感,而define可通过第三个参数(为true表示大小写不敏感)来指定大小写是否敏感。。 


58.两个int变量不使用第三变量换值
$a = 2;$b = 12;
$a = $b - $a; // $a = 10,$b = 12;
$b = $b - $a; // $a = 10,$b = 2;
$a = $b + $a; // $a = 12,$b = 2;达到转换的目的


59.查看sql详细执行时间
show profiles ;


60.php抽象类与接口的区别
1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用private,protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。


61.PSR规范
PSR-1 基础编码标准
PSR-2 编码风格标准
PSR-3 日志接口规范
PSR-4 自动加载规范


62.使用过 Memcache 缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?
Memcahce 是把所有的数据保存在内存当中,采用 hash 表的方式,每条数据由 key 和 value 组成,每个 key 是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。


63.使用索引负面影响
索引占用物理空间,对数据进行增加、删除、修改时,索引也要动态维护,降低了效率。


64.超全局数组
1.$_GET
2.$_POST
3.$_SESSION
4.$_COOKIE
5.$_SERVER
6.$_REQUEST
7.$GLOBALS


65.请写一个单例模式。
class Test{
//定义静态属性 用于存放对象
private static $ob = null;
//构造方法设置私有,外部不能直接进行实例化
private function __construct(){
echo "我还是!!"; 
}
//静态方法 实例化对象
public static function getObject(){
if(self::$ob === null){
self::$ob = new Test();
}
return self::$ob;
}
}
66.PHP获取拓展名
$name = substr($filename,strrpos($filename,'.'));


67.获取当前URL
$url = 'HTTP://'.$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];


68.防止攻击函数
strip_tags()  过滤HTML标签
htmlspecialchars()  把预定义的字符转换为HTML实体
htmlentities() 把字符串转换为HTML实体


69.数据库语句
1.建表
CREATE TABLE IF NOT EXISTS `think_friendly_link`( 
   `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   `pic` VARCHAR(255) NOT NULL COMMENT '友情链接地址',
   `contents` VARCHAR(255) NOT NULL COMMENT '描述',
   `url` VARCHAR(255) NOT NULL COMMENT '链接地址',
   `state` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '开关,0:禁用;1:开启;'
)ENGINE = INNODB DEFAULT CHARSET=UTF8;
2.增
插入到 user1 表 ,插入的字段有 column1,column2 ,插入的值有 (127,1)
insert into `user1`(`column1`,`column2`) values(127,1);
3.删
delete from `user` where id = 15;
4.改
update user set `sex` = '1' where id <= 4;
5.查

select * from `user`;


原创粉丝点击