基础知识总结
1、变量如何定义?如何检查变量是否定义?如何删除一个变量?怎样检测变量是否设置?
$定义变量
isset() //检测变量是否设置
defined() //检测常亮是否设置
unset() //销毁指定的变量
empty() //检测变量是否为空
2、什么是可变变量?
一个变量的变量可以动态的设置和使用
3、变量赋值方式有哪几种?
1)直接赋值 $a = 'a';
2)变量间赋值 $b = $a;
3)引用赋值 $c = &$a;
4、引用和拷贝有什么区别?
拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自内存,互不干扰。
引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。如下:
<?php
$a = 'abc';
$b = &$a;
echo $a ; //输出abc
echo $b; //输出abc
$b = 'def';
echo $a; //输出def
echo $b; //输出def
?>
5、php中变量有哪些基本数据类型
php支持8种原始数据类型包括:
四种标量类型(布尔型boolean,整形interger,浮点型float/double,字符串string)
两种符合类型(数组array,对象object)
两种特殊类型(资源resource,null)
6、其他类型转换boolean类型是,那些被认为是false?
布尔值false,整型值0,浮点型值0.0,空白字符串,字符串‘0’,空数组,特殊数据类型null,没有设定的变量。
7、empty()函数在那些情况下返回true?
布尔值false,整型值0,浮点型值0.0,空白字符串,字符串‘0’,array()空数组,特殊数据类型null,没有任何属性的对象,没有复制的变量。
8、如果定义了一个变量$a,但是没有赋初始值那么
$a == 0 吗? var_dump($a==0)输出true
$a == false 吗? var_dump($a==false)输出true
$a == '' 吗? var_dump($a=='')输出true
$a == null 吗? var_dump($a==null)输出true
$a === null 吗? var_dump($a===null)输出true
empty($b) == true吗? var_dump(empty($b))输出true
如果输出$a++是多少? var_dump($a++) 输出null
如果输出++$a是多少? var_dump(++$a) 输出 int(1)
9、字符串怎么转成整数,有几种方法?怎么实现?
强制类型转换:(整形)字符串变量名 如下:
<?php
$string = '1';
$int = (int)$string;
?>
直接转换:settype(字符串变量,整形);如下:
<?php
$string = '5';
$boolean = true;
settype($string,'integer');//输出 5
settype($boolean,'string');//输出 1
?>
intval(字符串变量);如下:
<?php
echo intval('23as');//输出23
echo intval('23.25');//输出23
?>
10、什么是标量?标量数据和数组的最大区别是什么?
布尔、整数、浮点数、字符串型的数据都属于标量数据。
一个标量只能存放一个数据,而数组可以存放多个数据。
11、常量如何定义?如何检测一个常量是否被定义?常量的只能是那些数据类型?
define() // 定义常量,
defined()//检查常量是否定义
常量的值只能是标量类型的数据
12、常量分为系统内置常量和自定义常量。请说出最常见的几个系统内置常量并说明分别表示什么意思?
__FILE__ 文件中的当前行号
__LINE__ 文件的完整路径和文件名
PHP_OS 系统常量
PHP_VERSION 查看php版本
13、常量和变量有哪些区别?
1) 常量前没有$符号;
2) 常量只能通过define()定义,而不能通过赋值语句定义
3) 常量可以在任何地方定义和访问,而变量有全局和局部之分;
4) 常量一旦定义就不能被重新定义或者取消定义,而变量可以通过赋值方式重新定义
5) 常量的值只能是标量数据,而变量的数据库类型有8中原始数据类型。
14、如何定义两个相同的常量,前者和后者哪有起作用?
前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。
15、PHP中常用的几个预定义的全局数组变量是那些,并说明意思?
有9大预定义的内置数据变量:
$_POST
$_POST超级全局变量包含用POST方法传递的参数的有关信息
$_GET
超级全局变量包含使用get方法传递的参数的有关信息。
$_REQUEST
$_REQUEST 超级全局变量是一个全能选手,它记录了通过各种方法传递给脚本的变量,特别是GET ,POST 和 COOKIE 。 这些变量的顺序不依赖于它们在发送脚本中出现的顺序,而是依赖于 variables_order 配置指令所指定的顺序。建议少用这个超级变量,因为它不够安全。
$_SESSION
$_SESSION 超级全局变量包含与所有会话有关的信息。注册会话信息能为你提供便利,这样就能在整个网站中引用这些会话信息,而无需通过GET或POST显示的传递数据。
$_COOKIE
$_COOKIE 超级全局变量存储了通过HTTP cookie传递到脚本的信息。这些cookie一般是由以前执行的PHP脚本通过PHP函数setcookie()设置的。例如,假设使用 setcookie() 存储了一个名为 example.com、值为ab2213的cookie。以后就可以通过调用$_COOKIE['example.com']来获得这个值。
$_FILES
$_FILES超级全局变量包含通过POST方法向服务器上传的数据的有关信息。这个超级全局变量与其他的变量有所不同,它是一个二维数组,包含5个元素。第一个下标标示表单的文件上传元素名;第二个下标是五个预定义下标之一,这些下标描述了上传文件的某个属性:
$_FILES['upload-name']['name']; 从客户端向服务器上传文件的文件名;
$_FILES['upload-name']['type']; 上传文件的MIME类型,这个变量是否赋值取决于浏览器的功能。
$_FILES['upload-name']['size']; 上传文件的大小(以字节为单位);
$_FILES['upload-name']['tmp_name']; 上传之后,将此文件移到最终位置之前赋予的临时名。
$_FILES['upload-name']['error']; 上传状态码。尽管这个变量的名为 error ,但实际上在成功的情况下也会填写这个变量。它有五个可能的值:
UPLOAD_ERR_OK 文件成功上传
UPLOAD_ERR_INI_SIZE 文件大小超出了 upload_max_filesize 指令所指定的最大值。
UPLOAD_ERR_FORM_SIZE 文件大小超出了MAX_FILE_SIZE 隐藏表单域参数(可选)指定的最大值。
UPLOAD_ERR_PARTIAL 文件只上传了一部分
UPLOAD_ERR_NO_FILE 上传表单中没有指定文件
$_SERVER
$_SERVER超级全局变量包含由web服务器创建的信息,它提供了服务器和客户配置以及当前请求环境的有关信息。根据服务器不同,$_SERVER中的变量值和变量个数会有差别,不过一般都能找到CGI1.1规范中定义的变量,其中包括:
$_SERVER['HTTP_REFERER']; 引导用户到达当前位置的页面的URL ;
$_SERVER['REMOTE_ADDR']; 客户IP地址 ;
$_SERVER['REQUEST_URI']; URL的路径部分。如果URL是 [url]http://www.example.com/blog/apache/index.html[/url] ,那么URI就是/blog/apache/index.html 。
$_SERVER['HTTP_USER_AGENT']; 客户的用户代理,一般会提供操作系统和浏览器的有关信息。
$_ENV
$_ENV超级全局变量提供PHP解析所在服务器环境的有关信息。此数组中的变量包括:
$_ENV['HOSTNAME'] 服务器的主机名
$_ENV['SHELL'] 系统 shell
$_GLOBALS
$GLOBALS 超级全局变量数组可以认为是超级全局变量的超集,包含全局作用域内的所有变量。执行下面的代码可以查看$GLOBALS 中所有的变量。
16、在实际开发中,常量最常用于哪些地方?
1)连接数据库的信息定义成常量,如数据库服务器的用户名、密码、数据库名、主机名
2)将站点的部分路径定义成常量,如web绝对路径,smarty的安全路径,model、view或者controller的文件夹路径;
3)网站的公共信息,如网站名称,网站关键词等信息。
17、函数的优越性有哪些
提高程序的可维护性 提高软件的可靠性 提高程序的可重用行 提高程序的开发效率
18、如何定义一个函数?函数名区分大小写吗?
1)使用function 关键字;
2)函数命名规则和变量一样,以字母或下划线开头,而不能以数字开头;
3)函数名不区分大小写;
4)函数名不可以使用已经声明过的或者系统自建的函数名称。
19、什么是变量的能见度 或者说是变量的作用域?
就是变量在程序中的可作用范围。根据变量的能见度,变量分为局部变量和全局变量。
20、什么是局部变量和全局变量?函数内是否可以直接调用全局变量?
局部变量是函数内部定义的变量,其作用域是所在的函数。如果函数外还有一个跟局部变量名字一样的变量,程序会认为他们两个是完全不同的两个变量。的那个退出函数的时候,其中一个局部变量就会同时被清除。
全局变量是定义在所有函数以外的变量,其作用域是整个php文件,但是在用户自定义的函数内部是无法使用的。如果一定要在用户自定义的函数内部使用全局变量,那么就需要使用global关键字声明。也就是说如果在函数内的变量前加上golbal来修饰,那么函数内部就可以访问到这个全局变量,不仅可以利用这个全局变量进行运算而且还可以对这个全局变量惊醒重新赋值。全局变量还可以使用$GLOBALS['var']来调用。
21、什么是静态变量?
如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。
一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时,该变量会在函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。
22、php中函数传递参数的方式有哪些?两者有什么区别?
按值传递和按地址传递(或按引用传递)
1)按值传递:待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对该变量值做的修改,不影响原本的变量值。
2)按地址传递:使用&符号,表示该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块地址导入函数中,所以函数体内的该变量和主程序中的该变量在内存中是同一个。函数体做的是修改,直接影响到函数体外部的该变量的值。
23、什么是递归函数?如何进行递归调用?
递归函数其实就是调用自身的函数,但是必须满足一下两个条件:
1)在每一次调用自身时,必须是更接近于最终结果
2)必须有一个确定的递归终止条件,不会造成死循环。
比如希望获取到目录windows下所有的文件,先遍历windows目录,如果发现其中还有文件夹,那么就会调用自身,继续往下寻找,依次类推,知道遍历到再也没有文件夹为止,这也就意味着遍历出来了所有的文件。
24、判断一个函数是否存在?
function_exists(string $function_name)如果存在,返回true,不存在则返回false。
25、func()和@func()之间有什么区别?
第二个函数调用失败不会报错,第一个会报错。 @符号加载函数前表示抑制错误抛出。
26、include()和require()函数的用法和区别是什么?include_once()和require_once()呢?
include和require出现错误后的错误级别不一样
include_once()和require_once()在加载之前要判断是否已经导入
27、说出前置++和后置++的区别?
前置++是先将变量增加1,然后在将值赋值给原来的变量;
后置++是先返回变量的当前值,然后再将变量的当前值增加1;
28、字符串运算符” . “与算术运算符”+“有什么区别?
当‘a’ 'b'之间使用时认为是连接符。如果两者之间是+的时候php会认为这是一次运算。
1)如果+号两边的字符串是数字组成,那么将会将字符串自动转换为整形;
2)如果+号两边是纯粹的字母,那么会输出0;
3)如果+号两边的字符串是以数字开头的,那么会截取字符串开头的数字,然后进行运算。
29、什么是三目(或三元)运算符?
根据一个表达式的结果在另外两个表达式中选择一个。
例如:$a=='123'?1:0;
30、控制流程序语句有哪些?
1)三种程序结构 顺序结构、分支结构、循环结构
2)分支: if/else switch/case/break/defult
3)switch需要注意的:
case子句中的常量可以是整形、字符串类型常量或者常量表达式,不允许是变量。同一个switch子句中,case的值不能相同,否则只能渠道首次出现的case中的值。
4)循环 for while do....while do...while后面必须加入分好结尾。
5)break和continue的区别。 break可以终止循环。continue是终止本次循环而进入到下一次循环中。
31、数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种?
数组是一个可以村粗一组或一系列数值的变量(复合型变量)
索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值)
数组的赋值方式有哪两种?
1、通过array()函数声明数组;
可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。
2、直接为数组元素赋值,不需要调用array()函数。例如:
$arr[0] = 1; $arr[1] = 2;
特别注意:数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当做整数对待。
例如:$array[3]与$array['3']引用的是相同的一个元素,而$array['03']引用的则就是另外一个元素了。
32、数组如何遍历?
1)for循环
2)foreach循环,这是常用的遍历方式。用法如下:foreach($arr as $key=>$value){}
3)list each和while配合起来循环
33、foreach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢?
当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset()。
reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。
34、如何计算数组长度?字符串怎么获取长度?
count()//计算数组中的元素个数
可以使用count(数组名)或者count(数组,1)如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。如果第二个参数是数字0,则等同于只有一个参数的count()函数。
sizeof() - - count()的别名(count 计算数组中的单元数目或对象中的属性个数)
字符串长度:
strlen: 成功则返回字符串string的长度;如果string为空,则返回0。
mb_strlen():返回居右encoding编码的字符串str包含的字符数,多字节的字符被记为1。如果给定的encoding无效则返回FALSE
35、数组中相关的常用函数有哪些?
1)count() 计算数组中的单元数目或者对象中的属性个数
例如:int count(mixed $var [,int $mode]) $var 通常都是数组类型,任何其他类型都只有一个单元。$model默认值为0.1为开启递归地对数组计数
2)in_array(mixed $needle , array $haystack [, bool $strict]) 检查数组中是否存在某个值。如果needle是字符串,则比较是区分大小写的。如果第三个参数strict的值为true则in_array()函数还会检查needle的类型是否和haystack中的相同。
3)array_merge(array $array1 [,array $array2[,array$...]])将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面,饭后作为结果的数组
特别注意:如果输入的数组中有相同的字符串键名,则改键名后面的值将覆盖前面一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加在后面。
如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引
4)数组与字符串之间的转换
(1)explode(string $separator , string [,int $limit])使用一个分割字符来分割字符串。
(2)implode(string $glue , array $arr)使用一个连接符将数组中的每个单元连接为一个字符串。join为implode的别名
5)sort(array &$array [,int $sort_flags]) 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。
36、数组合并函数array_merge()和数组加法运算$arr+$arr2的区别是什么?
array_merge() 使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是后者附加到前者后面。
“+” 使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是讲相同键名的值舍弃,也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。
37、字符串定义的时候单引号和双引号有什么区别?
单引号加载速度比双引号加载速度快
38、按照功能分类说说都有哪些字符串处理函数?这些函数的作用是什么?
1)字符串输出函数
(1)echo $a.$b....;是一个语言结构,而不是一个真正的函数。
(2)print($a) 本函数输出字符串。若成功则返回1,失败返回0。只能打印出简单类型变量的值(如int,string)
(3)print_r($a) 可以打印出复杂类型变量的值(如数组,对象)
(4)var_dump($a) 能输出类型、长度、值
2)去除字符串守卫空格的函数:
(1)trim() 去掉字符串两头的所有空格
(2)ltrim() 去掉字符串左侧的空格
(3)rtrim() 去掉字符串右侧的空格
3)转义字符串函数:addslashes() 返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上反斜线。这些字符是单引号(‘)、双引号(“)、反斜线(\)与null(null字符)。
4)获取字符串长度的函数:strlen(字符串)
5)截取字符串长度的函数:substr(字符串,截取位子)
6)检索字符串函数:strstr() 查找字符串的首次出现;strpos() 查找字符串在另一字符串中第一次出现的位子,对小小邪敏感
7)替换字符串函数:str_replace()
39、 正则表达式是什么?php中有哪些常用的跟正则相关的函数?请写出一个email的正则,中国手机号码和座机号码的正则表达式?
正则表达式是用于描述字符排列模式的一种语法规则。正则表达式也叫做模式表达式。
网站开发中正则表达式最常用于表单提交信息前的客户端验证。
比如验证用户名是否输入正确,密码输入是否符合要求,email、手机号码等信息的输入是否合法
在php中正则表达式主要用于字符串的分割、匹配、查找和替换操作。
preg系列函数可以处理。具体有以下几个:
string preg_quote ( string str [, string delimiter] )
转义正则表达式字符 正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。
preg_replace -- 执行正则表达式的搜索和替换
mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]
preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换
mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
preg_split -- 用正则表达式分割字符串
array preg_split ( string pattern, string subject [, int limit [, int flags]] )
常用的正则表达式写法:
中文:/^[\u4E00-\u9FA5]+$/
手机号码:/^(86)?0?1\d{10}$/
email:/^[\w-]+[\w-.]?@[\w-]+\.{1}[A-Za-z]{2,5}$/
密码(安全级别中):/^(\d+[A-Za-z]\w*|[A-Za-z]+\d\w*)$/
密码(安全级别高):/^(\d+[a-zA-Z~!@#$%^&(){}][\w~!@#$%^&(){}]*|[a-zA-Z~!@#$%^&(){}]+\d[\w~!@#$%^&(){}]*)$/
40、页面支付出现乱码,怎么解决?
1)首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是在header()函数中指定了charset;例如:
<meta http-equiv = "Content-type" content = "text/html;charset=utf-8"/>
header("content-type:text/html;charset=utf-8");
2)如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是不是跟页面设置的字符集保持一致,两者必须保持统一;
3)如果涉及到从数据库提取数据,那么单端数据库查询是的字符集是否跟当前页面设置的字符集一致,两者必须统一,例如:
mysql_query("set names utf8")。
41、preg_replace()和str_ireplace()两个函数在使用上有什么不同?preg_split()和split()函数如何使用?
preg_replace 执行正则表达式的搜索和替换
str_ireplace str_replace()的忽略大小写版本
str_replace 子字符串替换
preg_split 用正则表达式分割字符串
split 用正则表达式将字符串分割到数组中
42、获取当前时间戳的函数主要有哪些?用php打印今天的时间,格式是2018-01-01 12:12:12?用php打印出前一天的时间格式是2018-01-01 10:10:10?如何把2018-01-01 10:10:10变成unix时间戳?
echo date("Y-m-d H:i:s",time()) 当前时间
echo date("Y-m-d H:i:s",strtotime("-1 days"));前一天时间
$unix_time = strtotime("2018-01-01 10:10:10");//变成unix时间戳
43、在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码?用户在网站表单提交数据的时候为了防止脚本工具(比如用户输入<script>alert(111)</script>),php端接收数据的时候,应该如何处理?
使用urlencode()对中文进行编码,使用urldecode()来解码
使用htmlspecialchars($_Post['aa'])来过滤表单传参就可以避免脚本攻击。
44、说说mysql_fetch_row()和mysql_fetch_assoc()和mysql_fetch_array()之间有什么区别?
第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个即可以返回索引数组也可以返回关联数组,取决于他的第二个参数MYSQL_BOTH MYSQL_NUM MYSQL_ASSOC默认为MYSQL_BOTH.
$sql = " select * from table";
$result = mysql_query($sql);
$mysql_fetch_array($result,MYSQL_NUM);
45、请说出目前学过的返回是资源的函数?
fopen(打开文件)
imagecreatefromjpeg(png gif) — 从 JPEG 文件新建一图像
imagecreatetruecolor — 新建一个真彩色图像
imagecopymerge — 拷贝并合并图像的一部分
imagecopyresized — 拷贝部分图像并调整大小
mysql_connect — 打开一个到 MySQL 服务器的连接
mysql_query();只有这执行select的时候成功,才返回资源,失败返回FALSE
46、打开、关闭文件分别是什么函数? fopen() fclose()
文件读写是什么函数? fwrite() 文件写入 fread()读取打开文件
删除文件是那个函数? unlink()
判断一个文件是否存在是那个函数? is_file() 或者file_exists() 备注:file_exists() = is_file()+is_dir();
新建目录是那个函数? mkdir()
47、文件上传需要注意哪些细节?怎么把文件保存到指定目录?怎么避免上传文件重命名问题?
1.首现要在php.ini中开启文件上传;
2.在php.ini中有一个允许上传的最大值,默认是2MB。必要的时候可以更改;
3.上传表单一定要记住在form标签中写上enctype="multipart/form-data";
4. 提交方式 method 必须是 post;
5. 设定 type="file" 的表单控件;
6.要注意上传文件的大小MAX_FILE_SIZE、文件类型是否符合要求,上传后存放的路径是否存在。
可以通过上传的文件名获取到文件后缀,然后使用时间戳+文件后缀的方式为文件重新命名,这样就避免了重名。可以自己设置上传文件的保存目录,与文件名拼凑形成一个文件路径,使用move_uploaded_file(),就可以完成将文件保存到指定目录。
48、$_FILES是几维数组?第一维和第二维的索引下边分别是什么?批量上传文件的时候需要注意什么?
二维数组。第一维是上传控件的name,二维下标分别为name/type/tmp_name/size/error...
49、header()函数主要的功能有哪些?使用过程中注意什么?
header()发送http头信息
-header("content-type:text/html; charset=utf-8");-------------------//当前页面输出内容是html,编码为utf-8格式
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
-header("content-type:image/png gif jpeg");----------------------------------//当前页面输出内容的格式是图片
-header("refresh:5;url=http://www.1004javag.com/five/string.php");--//页面5秒后要跳转到新网址
-header("location:http://1004javag.com/five/string.php");-----------//页面重定向

浙公网安备 33010602011771号