1.什么是面向对象?主要特征是什么?
面向对象是程序的一种设计方式,利于提高程序的重用性,使程序结构清晰。
主要特征:封装、继承、多态。
2.SESSION和COOKIE的区别是什么,从协议、产生原因与作用说明
协议:http是一种无状态的协议
产生原因:不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
区别:
(1)session存储在服务器端,cookie存储在客户端,cookie可以被编辑改造,所以不安全。
(2)由于session存储在服务器端,每次读取都从服务器端读取,对服务器有资源损耗,并且过多的session会降低服务器的性能
(3)cookie存储的数据大小不能超过4k,session依赖cookie进行传递,禁用cookie后session不能正常工作。
3.HTTP状态码
1.信息,服务器收到请求,需要请求者继续执行操作。
100:继续,客户端继续请求
101:切换协议。服务器根据客户端的请求切换协议
2.成功,操作被成功接收并处理
200:请求成功。一般用于GET和POST请求
201:已创建,成功请求并创建了新的资源
202:已接受,已经接收请求,但未处理完成
203:非授权信息,请求成功,但是返回的meta信息不再原始的服务器,而是一个副本
204:无内容。服务器成功处理,但未返回内容
205:重置内容
206:部分内容
3.重定向,需要进一步的操作以完成请求
300:多种选择
301:永久移动
302:临时移动
303:查看其它地址
304:未修改
305:使用代理
4.客户端错误,请求包含语法错误或无法完成的请求
400:客户端请求语法错误,服务器无法理解
401:请求要求用户的身份认证
402:保留,将来使用
403:服务器理解请求客户端的请求,但拒绝执行
404:服务器无法根据客户端的请求找到资源
405:客户端请求中的方法被禁止
406:服务器无法根据客户端请求内容特性完成请求
407:请求要求代理的身份认证
408:服务器等待客户端发送请求时间过长,超时
5.服务器错误,服务器在处理请求的过程中发生了错误
500:服务器内部错误,无法完成请求
501:服务器不支持请求的功能,无法完成请求
502:充当网关或代理的服务器,从远端服务器接收到一个无效的请求
503:由于超载或系统维护,服务器暂时的无法处理客户端的请求
504:充当网关或代理的服务器,未及时从远端服务器获取请求
505:服务器不支持请求的HTTP协议的版本,无法完成处理
4.MyISAM和InnoDB的基本区别?索引结构如何实现
MyISAM:
缺点:不支持事务,表锁,易产生碎片,要经常优化
优点:读写速度较快
InnoDB:
优点:支持事务,行锁,有崩溃回复能力
缺点:读写速度比MyISAM慢
索引结构实现:创建索引:alert table tablename add index(‘字段名’)
5.常见的排序算法
冒泡排序,快速排序,选择排序,插入排序
冒牌排序算法:
function mysort($arr){
for ($i=0;$i<count($arr);$i++){
for ($j=0;$j<count($arr)-1-$i;$j++){
if ($arr[$j]>$arr[$j+1]){
$temp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$temp;
}
}
}
return $arr;
}
快速排序算法:
function quick_sort($arr)
{
if (count($arr) <= 1) { //判断是否要排序
return $arr;
}
$middle = $arr[0];//设置中间值
$left = array();//小于中间值得存放在左边数组
$right = array();//大于中间值得存放在右边数组
for ($i = 1; $i < count($arr); $i++) {
if ($middle > $arr[$i]) {
$left[] = $arr[$i];
} else {
$right[] = $arr[$i];
}
}
$left = quick_sort($left);
$right = quick_sort($right);//递归排序分好的两边
return array_merge($left, array($middle), $right);
}
选择排序算法:
function select_sort($arr){
for($i=0;$i<count($arr)-1;$i++){
$min=$i;
for ($j=$i+1;$j<count($arr);$j++){
if($arr[$min]>$arr[$j]){
$min=$j;
}
}
if($min!=$i){
$temp=$arr[$min];
$arr[$min]=$arr[$i];
$arr[$i]=$temp;
}
}
return $arr;
}
插入排序算法:
function insert_sort($arr){
for ($i=1;$i<count($arr);$i++){
$temp=$arr[$i];
for ($j=$i-1;$j>=0;$j--){
if($temp>$arr[$j]){
$arr[$j+1]=$arr[$j];
$arr[$j]=$temp;
}else{
break;
}
}
}
return $arr;
}
6.PHP中传值与传引用的区别。是么时候传值什么时候传引用
按值传递:函数范围内对值得任何改变在函数外部都会忽略。
按引用传递:函数范围内对值得任何改变在函数外部也能反映出这些修改。
优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
7.PHP中error_reporting这个函数有什么用。
设置PHP的报错级别并返回当前级别。
8.顺序查找和二分查找。
顺序查找算法:
function query_search($arr,$value){
foreach ($arr as $key=>$v){
if($v==$value){
return $key;
}
}
return -1;
}
二分查找算法:
function bin_search($arr,$start,$end,$key){//数组,起始,末尾,查找的值
if ($start<=$end){
$middle=floor(($start+$end)/2);
if($arr[$middle]==$key){
return $middle;
}else if ($arr[$middle]<$key){
return bin_search($arr,$middle+1,$end,$key);
}else{
return bin_search($arr,$start,$middle-1,$key);
}
}
return -1;
}
9.请以空格为间隔,拆分字符串“Apple Orange Banana Strawberry”,组成数组$fruit,数组中所有元素都用小写字母,并按照字母先后次序排序。
class sort{
private $str;
public function __construct($str)
{
$this->str=strtolower($str);//把字符串小写
}
private function explodes(){
if (empty($this->str)) return array();
$arr=explode(" ",$this->str);
return is_array($arr)?$arr:array($arr);
}
public function sort(){
$explode=$this->explodes();
sort($explode);
return $explode;
}
}
$str="Apple Orange Banana Strawberry";
$sortob=new sort($str);
var_dump($sortob->sort());
10windows平台,Apache HTTP Server启动失败,拍错思路是什么。
检查apache使用的80端口是否被占用,如果被占用,先停止占用80端口的服务,然后启动apache服务器。
11.php中常用的数组函数
array():创建数组
array_combine():合并两个数组来创建一个新数组
array_merge():把两个或多个数组合并成一个数组
array_search():在数组中搜索给定的值
array_key_exists():判断某数组中是否存在指定的key
array_reverse():将原数组中元素顺序翻转,创建新的数组并返回
array_unique():移除数组中重复的值
count():统计数组中元素的个数
array_pop():获取数组中最后一个元素
array_push():在数组末尾增加新的元素
数组,增加的值
12.php中常用的字符串操作方法
trim():去除字符串收尾空格和特殊字符:字符串,指定字符串
ltrim():去除字符串左边的空格和指定字符串
rtrim():去除字符串右边的空格和指定字符串
strlen():获取字符串长度
substr():截取字符串:字符串,起始位置,截取长度
Mb_substr():实现中文字符串截取无乱码的方法
strstr():获取一个指定字符串在另一个字符串中首次出现的位置到后者末尾的子字符串。
从哪个字符串中进行搜索,要搜索的对象
substr_count():检索子串出现的次数:指定字符串,指定的字符
str_ireplace():使用新的子字符串替换原始字符中被指定要替换的字符串。
被替换的字符串,替换的字符串,原字符串
substr_replace():对指定字符串中的部分字符串进行替换。
指定字符串,要替换的字符串,被替换的字符串位置,被替换字符串的长度
explode():将字符串按设置的分隔符进行分割,返回数组
分隔符,字符串
implode():将数组按指定分隔符合成字符串
分隔符,数组
13.php读取文件内容的几种方法和函数
打开文件,读取文件:fopen(),fread()
打开读取一次完成:file_get_contents()
14.对缓存技术的了解
(1)缓存技术是将动态内容缓存到文件中,在一定时间访问动态页面直接调用缓存文件,而不必重新访问数据库。
(2)使用memcache动态缓存技术
memcache动态缓存技术在一定的时间内将动态页面经过解析之后保存到文件,下次访问时动态网页就直接调用这个文件,而不必再重新访问数据库。使用memcache做缓存的好处是:提高网站的访问速度,减轻高并发时服务器的压力。memcache的优点:稳定、配置简单、多机分布式村粗、速度快。
15.设计模式:
工厂模式:工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。
<?php
interface IUser
{
function getName();
}
class User implements IUser
{
public function __construct($id) {
}
public function getName() {
return "Jack";
}
}
class UserFactory
{
public static function Create($id) {
return new User($id);
}
}
$uo = UserFactory::Create(1);
echo($uo->getName() . "");
?>
工厂方法模式:类中的这些公共静态方法构造该类型的对象。如果创建此类型的对象非常重要,此方法非常有用。例如,假设您需要先创建对象,然后设置许多属性。此版本的工厂模式会将该进程封装在单个位置中,这样,不用复制复杂的初始化代码,也不必将复制好的代码在在代码库中到处粘贴。
<?php
interface IUser
{
function getName();
}
class User implements IUser
{
public static function Load($id) {
return new User($id);
}
public static function Create() {
return new User(null);
}
public function __construct($id) {
}
public function getName() {
return "Jack";
}
}
$uo = User::Load(1);
echo($uo->getName() . "");
?>
策略模式:在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 —— 一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。
<?php
interface IStrategy
{
function filter($record);
}
class FindAfterStrategy implements IStrategy
{
private $_name;
public function __construct($name) {
$this->_name = $name;
}
public function filter($record) {
return strcmp($this->_name, $record) <= 0;
}
}
class RandomStrategy implements IStrategy
{
public function filter($record) {
return rand(0, 1) >= 0.5;
}
}
class UserList
{
private $_list = array();
public function __construct($names) {
if ($names != null) {
foreach($names as $name) {
$this->_list[]= $name;
}
}
}
public function add($name) {
$this->_list[] = $name;
}
public function find($filter) {
$recs = array();
foreach ($this->_list as $user) {
if ($filter->filter($user)) {
$recs []= $user;
}
}
return $recs;
}
}
$ul = new UserList(array("Andy", "Jack", "Lori", "Megan"));
$f1 = $ul->find(new FindAfterStrategy("J"));
print_r($f1);
$f2 = $ul->find(new RandomStrategy());
print_r($f2);
?>
单例模式:单例模式可以说是面向对象语言里最常用、也是最简单的一种模式。单例就是单个实例,单个对象的意思,就是说我们去实例化一个类的时候,不管调用多少次,都永远只有一个实例, 不会有多个,这样就节省了内存分配开支。
先简单说下单例模式的原理:将构造函数__construct设置为私有的private, 对外提供一个static静态方法比如:getInstance获得实例,在getInstance方法里来做统一判断是否有new一个实例,有的话直接返回,没有就new一个,这样就保证了不管外面调用多少次,只保证new了一次。
<?php
class Single {
static private $instance;
private function __construct(){
}
static public function getInstance(){
if (!isset(self::$instance)) {
self::$instance = new Single();
}
return self::$instance;
}
public function get(){
echo 'you get it!';
}
}
观察者模式:观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。
<?php
interface IObserver
{
function onChanged($sender, $args);
}
interface IObservable
{
function addObserver($observer);
}
class UserList implements IObservable
{
private $_observers = array();
public function addCustomer($name) {
foreach($this->_observers as $obs) {
$obs->onChanged($this, $name);
}
}
public function addObserver($observer ) {
$this->_observers[] = $observer;
}
}
class UserListLogger implements IObserver
{
public function onChanged($sender, $args) {
echo("'$args' added to user list");
}
}
$ul = new UserList();
$ul->addObserver(new UserListLogger());
$ul->addCustomer("Jack");
?>
16代码管理器,常使用那些代码版本控制软件。
通常一个项目是由一个团队去开发,每个人将自己写好的代码提交到版本控制器中,由项目负责人按照版本进行管理,方便版本的控制,提高开发效率,保证需要时可以回到就得版本。
常用的版本控制器:SVN和Git
SVN:
SVN是一种版本控制器,程序员开发的代码递交到版本服务器进行集中管理。
优点:代码进行集中管理,版本控制容易,操作比较简单,权限控制方便。
缺点:不能随意修改服务器项目文件夹
17.ajax的核心代码:
<script>
var xmlhttp;
if(window.XMLHttpRequest){
xmlhttp=new XMLHttpRequest();
}else if(window.ActiveXObject){
xmlhttp=new ActiveXObject(Microsoft.XMLHTTP);
}
var xmlhttp=new XMLHttpRequest();
xmlhttp.open(“GET”,”1.php?aa=name”);
xmlhttp.onreadystatechange=function(){
if(xmlhttp.readyState==4){
if(xmlhttp.status==200){
var text=xmlhttp.responseText;
}
}
}
xmlhttp.send(null);
</script>
18.面向对象中接口和抽象类的区别及应用场景。
区别:
(1)有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义。
(2)接口中全部是抽象方法,方法不用使用abstract定义。
应用场景:当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为借口。
19.对于大流量的网站,你采用什么样的方式来解决访问量的问题。
总体:优化程序,优化数据库,如果程序和数据库已经最优化,使用:
(1)确定当前服务器设备是否满足流量需求。
(2)使用Memcache缓存技术,将动态内容缓存到文件中,动态网页直接调用这些文件,而不必再去访问数据库。
(3)禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止外部盗链。
(4)控制大文件的下载,大文件下载对非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降
(5)使用不同的主机分流主要流量,是服务器均衡负载。
(6)使用流量统计软件,统计分析网站流量,可以知道哪些地方耗费了大量流量,哪些页面需要进行优化。
20.PHP获取客户端和服务器端信息
获取客户端IP:$_SERVER[“REMOTE_ADDR”]
获取服务器端IP:$_SERVER[“SERVER_ADDR”]
获取当前页面完整路径:$_SERVER[“SCRIPT_FILRNAME”]
获取当前页面URI:$_SERVER[“REQUEST_URI”]
获取当前执行脚本文件名:$_SERVER[“PHP_SELF”]
获取当前页面参数:$_SERVER[“QUERY_STRING”]
获取当前运行脚本所在的文档根目录:$_SERVER[“DOCUMENT_ROOT”]
21.数据库索引有几类,分别是什么?什么时候该用索引。
分类:普通索引、主键索引、唯一索引
索引用来快速的寻找那些具有特定值得记录
索引的目的是什么?
(1)快速访问数据表中的特定信息,提高检索速度
(2)创建唯一性索引,保证数据库表中每一行数据的唯一性
(3)加速表和表之间的链接
(4)使用分组和排序子句进行数据检索时,可以显著的减少查询中分组和排序的时间。
索引对数据库系统的负面影响是什么?
(1)创建索引和维护索引需要耗费时间,时间随着数据量的增加而增加
(2)索引需要占用物理空间
(3)当对表进行增删改的时候索引也要动态维护,这样就降低了数据的维护速度
为数据表建立索引的原则有哪些?
(1)在最频繁使用的、用以缩小查询范围的字段上建立索引
(2)在频繁使用的、需要排序的字段上建立索引
什么情况下不宜建立索引?
(1)对查询很少涉及的列或者重复值比较多的列
(2)对于一些特殊的数据类型,不宜建立索引,比如文本字段,值范围较少的等。
22.魔术方法
__set():当给未定义的或者不可见的成员变量赋值时,自动调用该方法。
__get():当获取未定义或者不可见的成员变量时,自动调用该方法。
__call():当调用不存在或不可见的成员方法时,自动调用该方法
__autoload():在实例化一个尚未被定义的类时自动调用该方法来加载类
__destroy():销毁对象时自动调用的方法
__clone():在克隆对象过程中,调用的方法,可以使克隆出来的对象保持自己的一些属性和方法。
__tostring():使用echo和print输出对象时,将对象转换成字符串
23.使用PHP开发的配置
Magic_qutoes_gpc是php配置文件中的,如果没设置为on,则会自动把POST、GET、COOKIE中的字符串进行转义,在=号之前加\
Magic_qutoes_runtime,设置为1则会在数据库中取出来的单引号、双引号、反斜线自动加上反斜杠进行转义;设置为0,则关闭自动转义。
session.gc_maxlifetime:设置session的生存空间
register_globals:默认值预设为off,当register_globals的设定为on时,程序可以接收来自服务器的各种环境变量,包括表单提交的变量,而且由于php不必事先初始化变量的值,从而导致很大的隐患。
safe_mode:安全模式,php用来先知文档的存取、先知环境变量的存取,控制外部程序的执行。启用安全模式必须设置safe_on=on
(1)限制文件存取:safe_mode_include_dir=”path1:/path2:/parh3”不同的文件夹用冒号隔开。
(2)限制环境变量的存取:safe_mode_allowed_env_vars=string,指定PHP程序可以改变的环境变量的前缀。
(3)限制外部程序的执行:safe_mode_exec_dir=string
24.include与require的区别
(1)require一般放在PHP脚本程序最前面,并且文件只执行一次;include一般放在流程控制的处理区域,PHP脚本程序读到include语句才执行。
(2)require中文件出错,则程序中断执行,并显示致命错误;include中文件出错,程序不中断,继续执行,并显示一个警告错误。
(3)include_once()与require_once(),在之中文件执行之前,都会事先检查目标文件是不是已经导入了。
25.SQL注入漏洞产生的原因?如何防止?
原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止:
(1)开启配置文件中的Magic_qutoes_gpc和Magic_qutoes_runtime设置
(2)执行sql语句时使用addslashes进行sql语句转换
(3)sql语句书写尽量不要省略小引号和单引号
(4)过滤掉sql语句中一些关键字:update、insert、delete、select、*
(5)提高数据库表和字段的命名技巧,对一些重要的字段根据程序特点命名,取不易被猜到的
(6)PHP配置文件中设置register_globals为off,关闭全局变量注册
(7)控制错误信息,不要在浏览器上输入错误信息,将错误信息写到日志文件中
26.MVC
模型(model)表示企业数据和业务规则
视图(view)用户看到并与之交互的界面
控制器(controller)接受用户的输入并调用模型和视图去完成用户的需求
mvc优点:低耦合性、高重用性和可适用性、较低的生命周期成本、快速部署、可维护性、可扩展性、有利于工程化管理
mvc缺点:没有明确的定义,完全理解mvc并不容易,不适合小型规模的应用程序。
27.如何提高php应用的性能
(1)将类的方法定义成static
(2)$row[‘id’]比$row[id]快
(3)echo比print快,使用echo多重参数,echo $str1,$str2;
(4)遍历使用foreach
(5)避免使用__get,__set,__autoload等魔术方法
(6)include文件使用绝对路径
(7)使用函数代替正则表达式完成相同功能
(8)数据库连接使用完毕时及时关闭数据库连接
(9)做缓存,减轻数据库负载
(10)用单引号替代双引号引用字符串
28.优化数据库的方法
(1)选取最适用的字段属性,尽可能减少定义字段长度,尽量把字段设置为NOT NULL
(2)使用连接(JOIN)来代替子查询
(3)使用联合(UNION)来代替手动创建的临时表
(4)事务处理
(5)锁定表,优化事务处理
(6)使用外键、优化锁定表
(7)建立索引
(8)优化查询语句