PHP面试题 - 基础

1、 用php打印出前一天的时间( 格式是2005-5-10 22:21:21 )

function getTime(){
    #	时区问题,从PHP5.1.0开始,php.ini里增加date.timezone选项,默认关闭!以格林威治标准时间为准    相差8个小时
    date_default_timezone_set('PRC');
    #	前一天的时间
    echo date('Y-m-d
H:i:s',mktime(date('H'),date('i'),date('s'),date('m'),date('d')-1,date('Y')));
    echo '<br />';
    echo date('Y-m-d H:i:s',strtotime('-1 day'));
    echo '<br />';
    #	前一星期的时间
    echo date('Y-m-d H:i:s',mktime(date('H'),date('i'),date('s'),date('m'),date('d')-7,date('Y')));
    echo '<br />';
    echo date('Y-m-d H:i:s',strtotime('-1 week'));
    echo '<br />';
    #	前一个月的时间
    echo date('Y-m-d H:i:s',mktime(date('H'),date('i'),date('s'),date('m')-1,date('d'),date('Y')));
    echo '<br />';
    echo date('Y-m-d H:i:s',strtotime('-1 month'));
    echo '<br />';
    #	前一年的时间	
    echo date('Y-m-d H:i:s',mktime(date('H'),date('i'),date('s'),date('m'),date('d'),date('Y')-1));
    echo '<br />';
    echo date('Y-m-d H:i:s',strtotime('-1 year'));
    #    注意strtotime参数   days跟day输出一样的结果
}

2、 简述session和cookie的区别

①存在的位置:

cookie 存在于客户端,临时文件夹中;  session存在于服务器的内存中,一个session域对象为一个用户浏览器服务

②安全性
cookie是以明文的方式存放在客户端的,安全性低,可以通过一个加密算法进行加密后存放;  session存放于服务器的内存中,所以安全性好

③网络传输量
cookie会传递消息给服务器;  session本身存放于服务器,不会有传送流量

④生命周期(以20分钟为例)
cookie的生命周期是累计的,从创建时,就开始计时,20分钟后,cookie生命周期结束;
session的生命周期是间隔的,从创建时,开始计时如在20分钟,没有访问session,那么session生命周期被销毁。但是,如果在20分钟内(如在第19分钟时)访问过session,那么,将重新计算session的生命周期。关机会造成session生命周期的结束,但是对cookie没有影响

⑤访问范围
cookie为多个用户浏览器共享;  session为一个用户浏览器独享

3、cookie和session原理及区别   

cookie采用的是客户端的会话状态的一种储存机制。它是服务器在本地机器上存储的小段文本或者是内存中的一段数据,并随每一个请求发送至同一个服务器。

session是一种服务器端的信息管理机制,它把这些文件信息以文件的形式存放在服务器的硬盘空间上(这是默认情况,可以用memcache把这种数据放到内存里面)当客户端向服务器发出请求时,要求服务器端产生一个session时,服务器端会先检查一下,客户端的cookie里面有没有session_id,是否过期。如果有这样的session_id的话,服务器端会根据cookie里的session_id把服务器的session检索出来。如果没有这样的session_id的话,服务器端会重新建立一个。PHPSESSID是一串加了密的字符串,它的生成按照一定的规则来执行。同一客户端启动二次session_start的话,session_id是不一样的。 

区别:Cookie保存在客户端浏览器中,而Session保存在服务器上。Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。

4、  session产生的session_id放在cookie里面,如果用户把cookie禁止掉,是不是session也不能用了呢?

禁止掉cookie后,session当然可以用,不过通过其他的方式来获得这个sessionid,比如,可以跟在url的后面,或者以表单的形势提交到服务器端。从而使服务器端了解客户端的状态。

5、  为什么说session 比cookie更安全?

真正的cookie存在于客户端硬盘上的一个文本文件,如果两者一样的话,只要cookie就好了,让客户端来分提服务器的负担,并且对于用户来说又是透明的。但实际上不是。

session的sessionID是放在cookie里,要想功破session的话,得分两步:

第一要得到sessionID。攻破cookie后,你要得到sessionID,sessionID是要有人登录,或者启动session_start才会有,你不知道什么时候会有人登录。

第二取有效sessionID。sessionID是加密的,第二次session_start的时候,前一次的sessionID就没有用了,session过期时sessionid也会失效,想在短时间内功破加了密的 sessionID很难。session是针对某一次通信而言,会话结束session也就随着消失了。

6、  使session失效的方法:
      ( 1 )  关闭tomcat  ( 2 )  重启web应用  ( 3 )   session时间到  ( 4 )   无效的session

————————————————
版权声明:2-6问题答案为为CSDN博主「筑梦悠然」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wuhuagu_wuhuaguo/article/details/78552633

7、 简述require_once(),require()和include(),include_once()之间的区别

( 1 ) 使用方法 : 

       require 通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部份。常用的函数,可以使用这个方法将它引入网页中。

      include 一般是放在流程控制的处理部分中。PHP 程序网页在读到 include 的文件时,才将它读进来。这种方式,可以把程序执行时的流程简单化。

( 2 ) 包含文件不存在或者执行错误时 : 

        require文件存在错误,程序就会中断执行,并显示致命错误 ! 在PHP引擎编译程序代码的时 , 会执行包含文件的程序如果文件错误则编译失败 , 产生致命错误 , 终止程序 .
        include文件存在错误,程序不会中断而是继续执行,并显示一个警告错误

( 3 )  include有返回值,而require没有

( 4 )  require是无条件包含也就是如果一个流程里加入require,无论条件成立与否都会先执行require ; include是程序运行到当前函数时执行

( 5 )  include_once()的作用和include()唯一的差别在于include_once()会先检查要导入的档案是不是已经在该程序中的其它地方被导入过了,如果有的话就不会再次重复导入 而include()会重复导入

( 6 )  require_once(),require() 同 ( 5 )

 

8、魔术方法

( 1 ) __get、__set  这两个方法是为在类和他们的父类中没有声明的属性而设计的
       __get( $property ) 当调用一个未定义的属性时访问此方法
       __set( $property, $value ) 给一个未定义的属性赋值时调用
      这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)

( 2 ) __isset、__unset
       __isset( $property ) 当在一个未定义的属性上调用isset()函数时调用此方法
       __unset( $property ) 当在一个未定义的属性上调用unset()函数时调用此方法
       与__get方法和__set方法相同,这里的没有声明包括当使用对象调用时,访问控制为proteced,private的属性(即没有权限访问的属性)

( 3 ) __call
       __call( $method, $arg_array ) 当调用一个未定义的方法是调用此访求
      这里的未定义的方法包括没有权限访问的方法

( 4 ) __autoload
       __autoload 函数,它会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP 出错失败前有了最后一个机会加载所需的类。
       注意: 在 __autoload 函数中抛出的异常不能被 catch 语句块捕获并导致致命错误。

( 5 ) __construct、__destruct
       __construct 构造方法,当一个对象创建时调用此方法,使用此方法的好处是:可以使构造方法有一个独一无二的名称,无论它所在的类的名称是什么.这样你在改变类的名称时,就不需要改变构造方法的名称
       __destruct 析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法
       默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.
       析构函数允许你在使用一个对象之后执行任意代码来清除内存.
       当PHP决定你的脚本不再与对象相关时,析构函数将被调用.
       在一个函数的命名空间内,这会发生在函数return的时候.
       对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset

( 6 ) __clone
       PHP5中的对象赋值是使用的引用赋值,如果想复制一个对象则需要使用clone方法,在调用此方法是对象会自动调用__clone魔术方法
       如果在对象复制需要执行某些初始化操作,可以在__clone方法实现

( 7 ) __toString
       __toString方法在将一个对象转化成字符串时自动调用,比如使用echo打印对象时
       如果类没有实现此方法,则无法通过echo打印对象,否则会显示:Catchable fatal error: Object of class test could not be converted to string in
       此方法必须返回一个字符串

       在PHP 5.2.0之前,__toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义__toString方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误。

( 8 ) __sleep、__wakeup
       __sleep 串行化的时候用
       __wakeup 反串行化的时候调用
       serialize() 检查类中是否有魔术名称 __sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。
       使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
       相反地,unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。
使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。

————————————————
版权声明:本文8题内容为CSDN博主「珞珞珞珞珞珞珞mm」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lingluo110700/article/details/85635257

9、用php编写函数,将驼峰命名的字符串转换为小写下划线形式 , 例如FootBar->foot_bar       OtherWise->other_wise

方法一 : [ 笨的函数 ]

function getToString( $str='', $param='_' )
{
	
	if( empty($str) || strlen($str)<=0 ) return $str;
	if( strlen($str)==1 && ord($str)<90 ) return strtolower($str);
	if( strlen($str)==1 ) return $str;
	$tmp = '';
	$arr = str_split($str);
	for( $i=0;$i<count($arr);$i++ ){
		switch( true ){
			case ($i==0 || ( isset($arr[$i-1]) && ord($arr[$i-1])<91 && ord($arr[$i-1])>64) ) && ord($arr[$i])<91 && ord($arr[$i])>64:
				$tmp .= strtolower($arr[$i]);
				break;
			case $i>0 && ord($arr[$i])<91 && ord($arr[$i])>64:
				$tmp .= $param.strtolower($arr[$i]);
				break;
			default:
				$tmp .= $arr[$i];
				break;
		}
	}
	return $tmp;
}

方法二 : [ 正则 ]

function getToString($str,$param='_')
{
    return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $param . "$2", $str));
}

方法三 : [ 正则 ]

//驼峰命名转下划线命名
function getToString( $str='' )
{
    $dstr = preg_replace_callback('/([A-Z]+)/',function($matchs)
    {
        return '_'.strtolower($matchs[0]);
    },$str);
    return trim(preg_replace('/_{2,}/','_',$dstr),'_');
}

10、递归函数输出结果

<?php
function foo( $i ){
	while( $i>0 ){
		echo foo( --$i );
	}
	return $i;
}

foo(3); //结果 0000000

11、?? 与 ?:的区别

PHP7 中 ?? 与 ?: 的区别
?? 是PHP 7 版本的新特性

$a ?? 0 等同于 isset($a) ? $a : 0
$a ?: 0 等同于 $a ? $a : 0

<?php
$tmp = '0';
echo $tmp ?? 2; //相当于 isset($tmp) ? $tmp : 2; 结果是0
echo '<br />';
echo $tmp ?: 2; //相当于 !empty($tmp) ? $tmp : 2; 结果是2

12、php中异常与错误处理( 抛出方式,如何捕获,php7新增方案)

PHP7错误处理

PHP 7 改变了大多数错误的报告方式。不同于传统(PHP 5)的错误报告机制,现在大多数错误被作为 Error 异常抛出。

这种 Error 异常可以像 Exception 异常一样被第一个匹配的 try / catch 块所捕获。如果没有匹配的 catch 块,则调用异常处理函数(事先通过 set_exception_handler() 注册)进行处理。 如果尚未注册异常处理函数,则按照传统方式处理:被报告为一个致命错误(Fatal Error)。

Error 类并非继承自 Exception 类,所以不能用 catch (Exception e)...来捕获Error。你可以用catch(Errore) { … },或者通过注册异常处理函数( set_exception_handler())来捕获 Error。

Error 层次结构

<?php
try
{
 // Code that may throw an Exception or Error.
}
catch (Throwable $t)
{
 // 仅在PHP7中 , PHP5不匹配
}
catch (Exception $e)
{
 // 仅在PHP5中执行,在PHP7中无法访问
}

13、php中代码调试的方法

xdebug, xhprof:php性能调试工具。他们都是php的一种扩展,可以很方便的安装和配置。这两个工具主要是将你程序的内部运行状况,调用函数以一种简洁的 方式告诉你。让你对程序在什么地方占用过多的资源,那些地方需要进行优化一目了然。 顺便提一下,xdebug生成的profile文件一般借助winCacheGrid查看。

firephp, firbug: 前者主要是php的调试工具,而后者是web开发必不可少的工具, 它不仅能查看请求,还能调试js,css。

在ie下面可以使用HttpWatch。如果需要将数据做深入分析,可以使用抓包工具。

php中常使用的调试函数:error_report, var_dump, print_r, var_export

mysql,apache/nginx的常用的调试技巧:分析他们日志文件也是相当重要。在linux下查看日志文件的常用命令: cat, more, less, grep, awk, sed

14、composer用法

composer init

composer install
15、php 解决跨域问题

<?php
header('Access-Control-Allow-Origin:*');
header('Access-Control-Allow-Methods:POST,GET,OPTIONS');
header('Access-Control-Allow-Headers:x-requested-with,content-type,requesttype,token');

16、线程和进程

(1)什么是进程

进程是程序执行是的一个实例,进程能够分配给cpu和内存等资源。进程一般包括指令集和系统资源,其中指令集就是你的代码,系统资源就是指cpu、内存以及I/O等。

进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为“正在执行的程序”,它是CPU资源分配和调度的独立单位。

进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。

进程的局限是创建、撤销和切换的开销比较大。

(2)什么是线程

线程是进程的一个执行流,线程不能分配系统资源,它是进程的一部分,比进程更小的独立运行的单位。

解释一下:进程有两个特性:一是资源的所有权,一个是调度执行(指令集),线程是调度执行中的一部分,是指进程执行过程的路径,也叫程序执行流。线程有时候也叫轻量级进程。

线程是在进程之后发展出来的概念。 线程也叫轻量级进程,它是一个基本的CPU执行单元,也是程序执行过程中的最小单元,由线程ID、程序计数器、寄存器集合和堆栈共同组成。一个进程可以包含多个线程。

线程的优点是减小了程序并发执行时的开销,提高了操作系统的并发性能,缺点是线程没有自己的系统资源,只拥有在运行时必不可少的资源,但同一进程的各线程可以共享进程所拥有的系统资源,如果把进程比作一个车间,那么线程就好比是车间里面的工人。不过对于某些独占性资源存在锁机制,处理不当可能会产生“死锁”。

(3)进程与线程的区别

1 > 进程是资源的分配和调度的一个独立单元,而线程是CPU调度的基本单元

2 > 同一个进程中可以包括多个线程,并且线程共享整个进程的资源(寄存器、堆栈、上下文)。一个线程只能属于一个进程,而一个进程可以有多个线程,一个进程至少包括一个线程

3 > 进程的创建调用fork或者vfork,而线程的创建调用pthread_create,进程结束后它拥有的所有线程都将销毁,而线程的结束不会影响同个进程中的其他线程的结束

4 > 线程是轻量级的进程,它的创建和销毁所需要的时间比进程小很多,CPU分给线程,即真正在CPU上运行的是线程。

5 > 线程中执行时一般都要进行同步和互斥,因为他们共享同一进程的所有资源

6 > 线程有自己的私有属性TCB,线程id,寄存器、硬件上下文,而进程也有自己的私有属性进程控制块PCB,这些私有属性是不被共享的,用来标示一个进程或一个线程的标志

 

17、运算符优先级

<?php
$a=0;
$b=0;
if( $a=3>0 || $b=3>0 ){
	$a++;
	$b++;
}
var_dump($a);//(bool) true
var_dump($b);//(int) 1
echo $a,$b;//1,1

18、浮点数精度问题

<?php
$a=0.1;
$b=0.7;

if( ($a+$b)==0.8 ){
	echo true;
}else{
	echo false;
}
die;//true

19、引用传值

<?php
$tmp_1 = '123';
$tmp_2 = &$tmp_1;
unset($tmp_1);
echo $tmp_2;//123
<?php
$tmp = ['a','b','c','d'];
foreach( $tmp as $k=>$v ){
	$v = &$tmp[$k];
}
echo '<pre />';
print_r( $tmp );//['b','c','d','d']

20、自加

<?php

#	数字
#	
$tmp='2';
$tmp++;
echo $tmp;//3

$tmp='9';
$tmp++;
echo $tmp;//10

#	以上可看出数字为+1
#	
#	字符串
$tmp='a';
$tmp++;
echo $tmp;//b

$tmp='z';
$tmp++;
echo $tmp;//aa

$tmp='Z';
$tmp++;
echo $tmp;//AA

$tmp='ab';
$tmp++;
echo $tmp;//ac

$tmp='az';
$tmp++;
echo $tmp;//ba
$tmp='aZ';
$tmp++;
echo $tmp;//bA


$tmp='aazzbb';
$tmp++;
echo $tmp;//aazzbc

$tmp='a9';
$tmp++;
echo $tmp;//b0


$tmp='c12';
$tmp++;
echo $tmp;//c13

$tmp='c1';
$tmp++;
echo $tmp;//c2

$tmp='cz99';
$tmp++;
echo $tmp;//da00

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值