PHP Question
一.简述 局部变量,全局变量,静态变量,参数变量以及他们的作用域
局部变量:在函数内部中定义的变量,它的作用域为函数定义范围内。
全局变量:在函数外部定义的变量,它的作用域从定义处一直到文件结尾。global $a;
example--->
1.设全局变量的作用:增加了函数间数据联系的渠道.
2.建议不再必要的时候不要使用全局变量,因为
a.全局变量在程序的全部执行过程中都占用存储单元.
b.它使函数的通用性降低了c.使用全局变量过多,会降低程序的清晰性.
3.如果外部变量在文件开头定义,则在整个文件范围内都可以使用该外部变量,如果不再文件开头定义,按上面规定作用范围只限于定义点到文件终了.如果在定义点之前的函数想引用该外部变量,则应该在该函数中用关键字extern作外部变量说明.
4.如果在同一个源文件中,外部变量与局部变量同名,则在局部变量的作用范围内,外部变量不起作用.
超全局变量:$_SERVER
静态变量:通过static 定义一个静态变量。静态变量在第一次初始化后,该变量的值就一直存在内存中,不会随着函数而被注销。静态变量的作用范围要看静态变量的位置,如果在函数里,则作用范围就是这个函数.
参数变量:
注意:如果在函数中 unset() 一个静态变量,那么在函数内部此静态变量将被销毁。但是,当再次调用此函数时,此静态变量将被复原为上次被销毁之前的值。
二.isset()和empty()的区别是什么,对不同数据的判断结果,$a=0; $a=’0′; $a=”; $a=false; $a=null;
isset 检测变量是否设置,并且不是 NULL
empty 判断一个变量是否被认为是空的。当一个变量并不存在,或者它的值等同于FALSE
,那么它会被认为不存在。如果变量不存在的话,empty()并不会产生警告
1.$a=0 empty bool(true) isset bool(true)
2.$a='0' empty bool(true) isset bool(true)
3.$a='' empty bool(true) isset bool(true)
4.$a=false empty bool(true) isset bool(true)
5.$a=null empty bool(true) isset bool(false)
三、用PHP打印出前一天的时间,格式是 2016-10-1 22:21:21
date('Y-m-d H:i:s',strtotime('-1 day',time()));
四、写一个程序打印九九乘法表。
方法一:for 循环
方法二:while 循环
方法三:do while 循环
五、简述对 foreach 的理解(形式,作用,应用对象,原理)
形式:foreach (array_expression as $value) statement
foreach (array_expression as $key => $value) statement
作用:语法结构提供了遍历数组的简单方式
应用对象:foreach 仅能够应用于数组和对象
原理:
第一种格式遍历给定的 array_expression 数组。每次循环中,当前单元的值被赋给 $value 并且数组内部的指针向前移一步(因此下一次循环中将会得到下一个单元)。
第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key
注意:除非数组是被引用,foreach 所操作的是指定数组的一个拷贝,而不是该数组本身。foreach对数组指针有些副作用。除非对其重置,在 foreach 循环中或循环后都不要依赖数组指针的值。
六、简述类,对象以及面向对象变成的三个基本要素。
类:类是具有相同属性和服务的一组对象的集合。它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分。在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属性说明和服务说明两个主要部分。
使用关键字 class 来声明一个类,后面紧跟类的名字,主体用 {} 符号括起来。
语法:
class class_name{ ...... }
类里面包含了属性和方法。
类的应用:
使用 new 关键字来实例化一个对象。可以同时实例化多个对象。
语法:object = new class_name();
实例化一个对象后,使用 -> 操作符来访问对象的成员属性和方法。
语法:
object->var_name;
object->function_name;
如果要在定义的类里面访问成员的属性或者方法,可以使用伪变量 $this 。$this 用于表示 当前对象 或 对象本身。
对象:对象是系统中用来描述客观事物的一个实体,它是构成系统的一个基本单位。一个对象由一组属性和对这组属性进行操作的一组服务组成。
通过在类定义中声明函数,即创建了类的方法。
语法:
class class_name{ function function_name(arg1,arg2,……) { 函数功能代码 } }
面向对象:面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构。OOP 的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。OOP 达到了软件工程的三个目标:重用性、灵活性和扩展性。
七、简述命名空间以及作用
命名空间:namespace 命名空间将代码划分出不同的空间(区域),每个空间的常量、函数、类(为了偷懒,我下边都将它们称为元素)的名字互不影响, 这个有点类似我们常常提到的‘封装'的概念
作用:最明确的目的就是解决重名问题
八、请写出数据类型(int?char?varchar?datetime?text)的意思;请问?varchar?和?char有什么区别?
int 整形
char
varchar 字符型
datetime 日期时间型
text 文本型
char 和 varchar 区别:
char 变长
varchar 定长
九、已知表名,table那么 增加一个字段性别sex,写出修改语句
格式:ALTER TABLE 表名 ADD 字段 数据类型
ALTER TABLE table_name ADD column_name datatype
格式:alter table 表名 change 字段 字段 数据类型
alter table cms_article change cid1 cid1 smallint(6) unsigned NOT NULL DEFAULT '0' COMMENT '一级分类ID'
格式:update 表名 set 字段=新值,… where 条件;
UPDATE dnw_archives set pubdate='1376064000' where id=591199;
十、MyISAM?和?InnoDB?的基本区别?
MyISAM:非事务性存储引擎。
InnoDB:事务性存储引擎。提供了具有提交、回滚和崩溃恢复能力的事务安全。InnoDB写的处理效率差一些, 并且会占用更多的磁盘空间以保留数据和索引。
MyISAM: 默认的MySQL插件式存储引擎。如果应用是以读操作和插入操作为主, 只有很少的更新和删除操作, 并且对事务的完整性、并发性要求不是很高, 那么选择这个存储引擎是非常适合的。MyISAM是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。
InnoDB: 用于事务处理应用程序, 支持外键。如果应用对事务的完整性有比较高的要求, 在并发条件下要求数据的一致性, 数据操作除了插入和查询以外, 还包括很多的更新、删除操作, 那么InnoDB存储引擎应该是比较合适的选择。InnoDB存储引擎除了有效地降低由于删除和更新导致的锁定, 还可以确保事务的完整交(Commit) 和回滚(Rollback) , 对于类似计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB都是合适的选择。
十一、SESSION与 COOKIE的区别是什么,请从协议,产生的原因与作用说明? 当设置 cookie 之后 是否可以立即使用?
Cookie和session是目前使用的两种存储机制
SESSION
Session信息是存放在server端,但session id是存放在client cookie的,当然php的session存放方法是多样化的,这样就算禁用cookie一样可以跟踪
协议:以用来在多个页面共享一些信息,cookie是被HTTP协议支持的,浏览器在向服务器请求一个页面时,服务器返回HTTP报文+数据,浏览器会解析从服务器接收的HTTP报文,从而做相应的操作
产生原因:
作用说明:
配置与应用
session_start(); //初始化session.需在文件头部
$_SESSION[name]=value; //配置Seeeion
echo $_SESSION[name]; //使用session
isset($_SESSION[name]); // 判断
unset($_SESSION[name]); //删除
session_destroy(); //消耗所有session
COOKIE
Cookie是完全保持在客户端的如:IE firefox 当客户端禁止cookie时将不能再使用
协议:1.使用系统函数setcookie设置 2.使用header函数构架cookie报文
产生原因:
作用说明:限制是在客户端的。一个浏览器能创建的Cookie数量最多为30个,并且每个不能超过4KB,每个WEB站点能设置的Cookie总数不能超过20个
cookie可以用来存储 session_id
当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。
十二、TTP状态中200,302、404、500,502代码含义?
200 正常;请求已完成
302 已找到 — 请求的数据临时具有不同 URI
404 找不到 — 服务器找不到给定的资源;文档不存在
500 内部错误 — 因为意外情况,服务器不能完成请求
502 错误网关 — 服务器接收到来自上游服务器的无效响应
十三、相对路径(Relative Path)和绝对路径(Absolute Path)简述(可举例说明),以及什么表示当前路径,什么表示当前路径的上层路径?
相对路径:
绝对路径:
当前路径:
上层路径:
十四、分页原理以及起公式(数据库是Mysql)
Select * from table limit ($Page- 1) * $PageSize, $PageSize
十五、打开一个文件,读取文件中两行文字的内容,写入另一个文件。如读取文件名 file1.txt,写入文件名 file2.txt
define('SCRIPT_PATH', dirname(__FILE__).'/');
$fp=open(SCRIPT_PATH.'file1.txt','r');
$i=1;
while ($data=fgetcsv($fp)) {
if($i<=2) {
$arr[$i]=$data;
$i++;
} else {
break;
}
}
var_dump($arr);
file_put_contents('file2.txt',$arr);
十六、简述或者写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。
方法一:列出当前目录下所有的文件
function getfiles($path) {
foreach(glob($path) as $key) {
if(is_dir($key)) {
getfiles($key.'/*');
} else {
echo $key.'<br/>';
}
}
}
getfiles(__DIR__);
方法二:遍历一个文件夹下所有文件和子文件夹
function getfiles($path = '.') {
$current_dir = opendir($path); //opendir()返回一个目录句柄,失败返回false
while(($file = readdir($current_dir)) !== false) { //readdir()返回打开目录句柄中的一个条目
$sub_dir = $path . DIRECTORY_SEPARATOR . $file; //构建子目录路径
if($file == '.' || $file == '..') {
continue;
} else if(is_dir($sub_dir)) { //如果是目录,进行递归
echo 'Directory ' . $file . ':<br>';
getfiles($sub_dir);
} else {//如果是文件,直接输出
echo 'File in Directory ' . $path . ': ' . $file . '<br>';
}
}
}
getfiles('xxtt');
十七、写出匹配URL或者邮件地址的正则表达式(任选其中一个).
方法一:
$search = '~^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?~i';
$url = 'http://www.jb51.net/pub/ietf/uri/#Gonn';
$url = trim($url);
preg_match_all($search, $url ,$rr);
十八、有一个网址,比如飞华主页www.fh21.com.cn, 如何获取他的内容
curl https://www.fh21.com.cn
十九、使用冒泡排序排列以下数组(从大到小或者从小到大均可)
$arr=array(1,9,34,78,2,11,5);
二十、简述(条件,参数,方法)或者写一个二分查找算法程序
如何获取来源是https的referrer呢
如果想要正常获取referrer,可以在A页面加上<meta content="always" name="referrer"/>
当时还遇到一个问题,用这个两斜杠符合//给目标页加协议的时候,目标页生成的协议是根据当前页(来源的页面)的协议那判断的,
比如A页面的协议是https,用这个<a href="//
如果A页面的协议是http,用这个<a href="//
shell_exec('curl --connect-timeout 30 -m 20 '.$url.' --silent ');