什么是面向对象,有什么特征?
举个最简单点的例子来区分 面向过程和面向对象
有一天你想吃鱼香肉丝了,怎么办呢?你有两个选择
1、自己买材料,肉,鱼香肉丝调料,蒜苔,胡萝卜等等然后切菜切肉,开炒,盛到盘子里。
2、去饭店,张开嘴:老板!来一份鱼香肉丝!
看出来区别了吗?这就是1是面向过程,2是面向对象。
面向对象有什么优势呢?首先你不需要知道鱼香肉丝是怎么做的,降低了耦合性。
如果你突然不想吃鱼香肉丝了,想吃洛阳白菜,对于1你可能不太容易了,还需要重新买菜,买调料什么的。
对于2,太容易了,大喊:老板!那个鱼香肉丝换成洛阳白菜吧,提高了可维护性。总的来说就是降低耦合,提高维护性!
面向过程是具体化的,流程化的,解决一个问题,你需要一步一步的分析,一步一步的实现。
面向对象是模型化的,你只需抽象出一个类,这是一个封闭的盒子,在这里你拥有数据也拥有解决问题的方法。
需要什么功能直接使用就可以了,不必去一步一步的实现,至于这个功能是如何实现的,管我们什么事?我们会用就可以了。
面向对象的底层其实还是面向过程,把面向过程抽象成类,然后封装,方便我们我们使用的就是面向对象了。
session与cookie的区别,从协议,产生,方面解释
产生的背景和原理:
HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,
再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。
于是需要引入一种机制,COOKIE于是就顺应而生。
Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上
。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。
区别:(位置,大小,安全)
1、cookie 是存放在浏览器端,不同的浏览器存储的cookie数量和数据的大小都不一致。
大多数情况下单个域名限制最多保存20个cookie,每个cookie保存的数据不能超过4K。
2、session存储在服务端,默认是以文件的形式存储,也可以存储在数据库和redis、memcache等缓存内存中。
3、session是占用的服务器内存,所以内存越大,能存的值就越大,原则上讲无上限,一般用于存储对安全要求较高的重要数据
error-reporting函数的作用
<?php
// 关闭错误报告
error_reporting(0);
// 报告 runtime 错误
error_reporting(E_ERROR | E_WARNING | E_PARSE);
// 报告所有错误
error_reporting(E_ALL);
// 等同 error_reporting(E_ALL);
ini_set("error_reporting", E_ALL);
// 报告 E_NOTICE 之外的所有错误
error_reporting(E_ALL & ~E_NOTICE);
?>
php垃圾回收机制
使用的是“引用计数”方式进行回收。简单地理解的话,就是每个分配的内存区域都有一个计数器,
记录有多少个变量指针指向这片内存。当指向该片内存的指针数量为0,那么该片内存区域就可以被回收。
smarty的特点
简单来说smarty可以使php程序和前台模板文件相分离并将它们相关联,使php后台运行的结果可以在前台页面文件显示,
在使用时只要在php程序文件中引入smarty类,并对其进行合适的设置,就可以使用smarty了。
简述一个缓存系统
变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,
这意味着:
当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量
php也提供了另外一种方式给变量赋值:
引用赋值。这意味着新的变量简单的__引用__(换言之,成为了其别名或者指向)了原始变量。
改动的新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)
对象默认是传引用 对于较大的数据,传引用比较好,这样可以节省内存的开销
php如何实现跳转
1.header('location:****.php');
2.延迟跳转 heafer('Refersh:3;url=****.php');
JS实现跳转的方式:
1.window.location.href='*.php';
2.windows.location.assign('*.php');
3.windows.location.replace('*.php');
4.windows.open('*.php',_blank,width=300px);
HTML跳转:
<meta http-equiv='refresh' content="3;url='*.php'">
http 403 302 500 错误
403(禁止)
服务器拒绝请求。如果您在 Googlebot 尝试抓取您网站上的有效网页时看到此状态码
(您可以在 Google 网站管理员工具诊断下的网络抓取页面上看到此信息),
可能是您的服务器或主机拒绝了 Googlebot 访问。
302(临时移动)
服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来响应以后的请求。
此代码与响应 GET 和 HEAD 请求的 301 代码类似,会自动将请求者转到不同的位置,
但您不应使用此代码来告诉 Googlebot 某个网页或网站已经移动,
因为 Googlebot 会继续抓取原有位置并编制索引。
500(服务器内部错误)
服务器遇到错误,无法完成请求。
ajax的优点,原理,json在ajax中起什么作用
优点:
1.异步请求,不妨碍用户浏览页面或者其他操作。
2.局部刷新,无需重新刷新页面。
3.界面与应用分离。有利于分工合作、减少非技术人员对页面的修改造成的WEB应用程序错误、提高效率、也更加适用于现在的发布系统。
4.基于标准被广泛支持。
5.前端和后端负载平衡。最大程度的减少冗余请求和响应对服务器造成的负担,提升站点性能。
缺点:
1.back和History,对浏览器机制的破坏。
2.安全问题。易受到黑客攻击。
3.对搜索引擎支持较弱。
4.不能很好支持移动设备。
5.违背URL和资源定位的初衷。
........................................................................................
1.什么是同步,什么是异步
同步现象:客户端发送请求到服务器端,当服务器返回响应之前,客户端都处于等待 卡死状态
异步现象:客户端发送请求到服务器端,无论服务器是否返回响应,客户端都可以随 意做其他事情,不会被卡死
2.Ajax的运行原理
页面发起请求,会将请求发送给浏览器内核中的Ajax引擎,
Ajax引擎会提交请求到 服务器端,在这段时间里,客户端可以任意进行任意操作,直到服务器端将数据返回 给Ajax引擎后,会触发你设置的事件,从而执行自定义的js逻辑代码完成某种页面1 功能。
json是一种数据格式
在ajax中可以采用json格式的数据进行传输
如何防止form表单重复提交
1 通过JavaScript屏蔽提交按钮(不推荐)
通过js代码,当用户点击提交按钮后,屏蔽提交按钮使用户无法点击提交按钮或点击无效,从而实现防止表单重复提交。
ps:js代码很容易被绕过。比如用户通过刷新页面方式,或使用postman等工具绕过前段页面仍能重复提交表单。因此不推荐此方法。
2 给数据库增加唯一键约束(简单粗暴)
在数据库建表的时候在ID字段添加主键约束,用户名、邮箱、电话等字段加唯一性约束。确保数据库只可以添加一条数据。
3 利用Session防止表单重复提交(推荐)
实现原理:
服务器返回表单页面时,会先生成一个subToken保存于session,并把该subToen传给表单页面。
当表单提交时会带上subToken,服务器拦截器Interceptor会拦截该请求,拦截器判断session保存的subToken和表单提交subToken是否一致。
若不一致或session的subToken为空或表单未携带subToken则不通过。首次提交表单时session的subToken与表单携带的subToken一致走正常流程,然后拦截器内会删除session保存的subToken。
当再次提交表单时由于session的subToken为空则不通过。从而实现了防止表单重复提交。
4.使用AOP自定义切入实现
实现原理:
自定义防止重复提交标记(@AvoidRepeatableCommit)。
对需要防止重复提交的Congtroller里的mapping方法加上该注解。
新增Aspect切入点,为@AvoidRepeatableCommit加入切入点。
每次提交表单时,Aspect都会保存当前key到reids(须设置过期时间)。
重复提交时Aspect会判断当前redis是否有该key,若有则拦截。
大流量网站怎么解决访问量问题
第一,确认服务器硬件是否足够支持当前的流量。
第二,优化数据库访问。
第三,禁止外部的盗链。
第四,控制大文件的下载。
第五,使用不同主机分流主要流量
第六,使用流量分析统计软件。
如何优化查询语句
1、在表中建立索引,优先考虑where、group by使用到的字段。
2、尽量避免使用select *,返回无用的字段会降低查询效率
3、尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。
4、尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描。
5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。
6、尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。
7、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。
8、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。
什么是mysql事务,有哪些特征
:事务是由一步或几步数据库操作序列组成逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。
1、原子性:
是不可分割的最小的操作单位,要么同时成功,要么同时失败。
2. 持久性
当事务提交或回滚后,数据库会持久化的保存数据。
3、隔离性
多个事务之间。相互独立。
4、一致性
事务操作前后,数据总量不变。
如何获取客户端的ip(int) 和服务的的ip
$_SERVER['REMOTE_ADDR']
$_SERVER['SERVER_ADDR']
php字符串处理函数
$str = 'hello-world! ';
echo strlen($str)."<br>";//返回字符串长度
echo str_word_count($str)."<br>";//计算单词个数
echo strrev($str)."<br>";//反转字符串
echo strpos($str,'w')."<br>";//返回查询字符串的位置从0开始
echo str_replace('world','china',$str)."<br>";//字符串替换,
echo substr($str,6,6)."<br>";//字符串截取
echo json_encode($str)."<br>";//转为json格式
echo trim($str,' ');//去除两侧字符
print_r(explode('-',$str)) ;//按指定分隔符分割字符串成为数组
php数组处理函数
echo "<pre>";
$arr =[
0 => 'b',
1 => 'c',
2 => 'a',
3 => 'c'
];
print_r(array_values($arr));//重新生成顺序的索引键名
print_r(array_keys($arr,'a'));//返回搜索值的键名
print_r(in_array('a',$arr));//判断是否在数组中,返回布尔值
print_r(array_search('v',$arr));//搜索值并返回键名,不存在返回false
print_r(array_reverse($arr,true));//将顺序数组反转,重置键名,第二个参数设置为true则不重置
print_r(count($arr));//返回数组长度
print_r(array_unique($arr));//去除数组中重复的元素,保留最先出现的键名
var_dump(sort($arr));//数组排序,重置键名,返回布尔值
var_dump($arr);
var_dump(ksort($arr));//根据键名对数组排序,返回布尔值
var_dump($arr);
var_dump(asort($arr));//根据值排序,保留键名,返回布尔值
var_dump($arr);
var_dump(array_splice($arr,2,1));//数组切片,(arr,start,length)
var_dump(array_count_values($arr));//统计数组中所有值出现的次数
var_dump(implode(',',$arr));//将数组用符号链接成字符串
求两个日期间的相差的小时数
$a = '2019-07-15 17:00:00';
$b = '2019-07-15 18:00:00';
echo $hour = (strtotime($b) - strtotime($a))/(60*60);//strtotime将格式化时间转为时间戳 --秒数--
抓取远程图片到本地,用什么函数
file_get_contents()
写一个函数,遍历文件夹下的所有文件
<?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"));
写一个函数从一个标准的url中获取到文件后缀
$url = "http://www.ibaiqiu.com.cn/abc/de/fg.php?id=1";
//var_dump($res = pathinfo($url));
$info = pathinfo($url)['extension'];
$arr = explode('?',$info);
$ext = $arr[0];
echo $ext;
正则 *的意义
匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。
php打印出前一天的当前时间
echo date('Y-m-d H:i:s',strtotime('-1day'));
MySQL取得当前时间
select now();
检测变量是否存在的函数,是否为空的函数,二者的区别
isset(),empty()
empty还会检测变量是否为空、为零。当一个变量值为0 or '',empty() 认为这个变量同等于空,即相当于没有设置。
如果变量为0,则empty()会返回TRUE,isset()会返回TRUE;
如果变量为空字符串,则empty()会返回TRUE,isset()会返回TRUE;
如果变量未定义,则empty()会返回TRUE,isset()会返回FLASE;
mysql的慢查询的处理方法
与优化sql语句相同,开启慢查询,使用explain打印sql语句的执行情况,模拟sql优化器
apache与nginx的优缺点比较
1、nginx相对于apache的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 ,抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能,高度模块化的设计,编写模块相对简单 ,社区活跃,各种高性能模块出品迅速
2.apache 相对于nginx 的优点: rewrite ,比nginx 的rewrite 强大 ,模块超多,基本想到的都可以找到 少bug ,nginx 的bug 相对较多
3.nginx的负载能力比apache高很多
4.一般动态请求要apache去做,nginx只适合静态和反向
如何解决javascript跨域问题
跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript 施加的安全限制。
解决方法:
①、response 添加 header
  我们在 Servlet 请求返回时添加如下代码:
1 //*表示支持所有网站访问,也可以额外配置相应网站
2 resp.setHeader("Access-Control-Allow-Origin", "*");
②、JSONP 方式
③、HttpClient 请求转发
④、nginx 转发