参考资料:PHP5 权威编程
变量
定义:$变量名 = 值; 例如:$demo = 1;
变量的基本操作:① 赋值 : $num1 = 1;
② 取值 : echo $num1; $num2 = $num1;
③ 判断:isset(变量名)判断该变量是否存在或者该变量是否有数值,返回布尔类型;
$num3 = isset($num1); // 判断$num1是否存在;
$num4 = null; //null 表示没有数据;
$num5 = isset($num4); // false
empty(变量名) 判断变量的内容 是否为空(有多种情况都是“空的”:0, “”, “0”, false, null, array())
④ 删除 :unset
$num6 = 100;
unset($num6);
$demo = isset($num6); //false
变量命名规则 :以字母或者下划线开头, 后面跟任意数量(含0个)的字母,数字和下划线
变量的传值方式:只有2种=》 值传递 和 引用传递
值传递
注意: 两个变量值相等,且互相独立,互不影响。
引用传递
注意:两个变量共同指向一个数据空间,对其中任何一个变量操作,改变了数据空间,另一个变量也会更改。
可变变量:一个变量的变量名可以动态的设置和使用。
注意:1 在PHP 中一个 $ 后面总是跟着一个变量名;
2 echo输出的变量 为 $m1 ,即 abc, 所以输出$abc , 也就是100,这种连续出现$的变量形式,就是 可变变量。
预定义变量:php 中预先定义好的变量。
主要有:$_GET, $_POST, $_REQUEST, $_SERVER, $GLOBALS , 均是 数组
$_GET 一个包含所有PHP 从客户浏览器接受的GET变量的 数组
$_POST 一个包含所有PHP 从客户浏览器接受的POST变量的 数组
用法与GET一样 $data = $_POST['数据名称'];
$_REQUEST $_GET变量和$_POST变量数据的“合集”:即,它里面同时存储了这两种数据。
用法与POST 和 GET 一样 $data = $_REQUEST[‘数据项名称’];
$_SERVER 一个存放Web服务器变量的 数组 ,它代表在一次浏览网页的过程中的浏览器端的一些信息或服务器端的一些信息。
可以通过 print_r($_SERVER)查看内容:
比如
$_SERVER[‘REMOTE_ADDR’]:获取访问者的ip地址
$_SERVER[‘SERVER_ADDR’]:获取服务器所在的ip地址
$_SERVER[‘SERVER_NAME’]:获取服务器的名字,其实就是站点设置中的servername
$_SERVER[‘DOCUMENT_ROOT’]:获取站点的真实物理地址,其实就是站点设置中的documentroot
$_SERVER[‘PHP_SELF’]:获取当前网页地址(不含域名部分)
$_SERVER[‘SCRIPT_FILENAME’]:获取当前网页地址物理路径
$_SERVER[‘QUERY_STRING’]获取当前网页地址中的所有get数据(就是?号后面部分),但只是一个整体的字符串而已。
$GLOBALS 一个存储了我们自己定义的所有“全局变量”的 数组
$GLOBALS['全局变量名']
常量
定义: ① define('常量名',常量值) ;
② const 常量名 = 常量值;
const 语法只能用再 顶层代码 中,而不能用在大括号位置
取值: ① 直接使用其名字
② constant("常量名") // 常量名是一个字符串
这种方式有灵活性:
$i = 1;
$s = “C” . $i;
echo constant($s); //这里也是取得C1这个常量的值;
判断常量会否存在 :defined("常量名")函数
常用的形式: if ( defined(常量名) ) { ... } else { ... }
使用一个未定义常量
注意:在php中,当使用一个未定义的常量的时候,系统会直接将该常量当做“有值”的常量去使用,并且其值就是该常量名——虽然也会报错!
预定义常量:系统中预定好的一些常量,大约几百个,常用的几个是:
M_PI: 就是圆周率的常量值;
PHP_OS: 就是php运行所在的操作系统
PHP_VERSION:就是php的版本号
PHP_INT_MAX: php中的最大的整数值
魔术常量:其实只是常量的形式,但没有常量的“恒常”的含义:其值其实会变化的,只有很少的几个:
__FILE__ 当前网页文件的完整的物理路径
__DIR__ 当前网页文件所在的文件夹
__LINE__ 当前这个常量名所在的行数
常量和变量的区别:1 定义形式不同
2 使用形式不同,常量无需 $ 符号
3 可变程度不同 常量的值不可以改变,常量也不可以销毁
4 作用范围不同 常量具有超全局作用域(函数内外都可以直接使用)
5 可用类型不同 常量只能存储基本类型(整数,浮点数,字符串,布尔)
PHP 中的注释
单行注释 : ① // 注释内容 ② # 注释内容
多行注释 : /* 注释内容 */
PHP 的基本数据类型
php 支持8中基本的数据类型:4种基本类型(标量类型):布尔(boolean),整型(interger),浮点型(float/double), 字符串(string); 2种复合类型:数组(array), 对象(Object);2种特殊类型:资源(resource), Null
整数类型
整数类型的 4种 写法
进制转化:bin 2进制 oct 8进制 dec 10进制 hex 16进制
进制转化只要分为两种情况:1. 10进制转化为其他三种进制 decbin() decoct() dechex();2. 其他三种进制转化为10进制
进制转化实例(重点)
1.10进制转化为其他三种进制
decbin(一个10进制数字): 结果返回的是该数字的2进制数字形式的字符串
decbin(10); // 1010 string类型
decoct(一个10进制数字): 结果返回的是该数字的8进制数字形式的字符串
decoct(10); //12 string类型
dechex(一个10进制数字): 结果返回的是该数字的16进制数字形式的字符串
dechex( 10 ); //a string类型
2. 其他三种进制转化为10进制
bindec(一个2进制数字字符串): 结果返回的是该2进制数字字符串对应的10进制数字
octdec(一个8进制数字字符串): 结果返回的是该8进制数字字符串对应的10进制数字
hexdec(一个16进制数字字符串): 结果返回的是该16进制数字字符串对应的10进制数字
对于输入的字符串中的字符,如果不是对应进制的数字,会被忽略。
3. 进制转化的计算
10进制,转换为2,8,16进制的基本做法:除2,8,16,取余,直到商为0,所有余数倒着写出
例如 123 转化为2 进制
123/2 61 余1 61/2 30余1 30/2 15余0 15/2 7余1 7/2 3余1 3/2 1余1
1/2 0余1
将余数按倒叙写出来, 即为2进制数字 : 1111011
123转为 8 进制
123/8 15余3 15/8 1余7 1/8 0余1
即为 173
123转为 16 进制
123/16 7余11 (11在16进制中为字母 B) 7/16 0余7
即为 7B
2,8,16进制,转换为10进制的基本做法:将每位数字乘以该位的权值,然后相加的结果
对一个10进制数字: 1234,可以这样去理解它的大小:
1234 = 1*10³ + 2*10² + 3*10¹ + 4*10º = 1000 + 200 + 30 + 4; (任何数的0次方都是1)
这里,我们对10³ , 10², 10¹, 10º 等等,称为“权值”;每个位的权值是不同的。
对于10进制,每个位上的权值,就是10 的 n次方;
对于8进制,每个位上的权值,就是8的 n次方;
对于16进制,每个位上的权值,就是16 的 n次方;
对于2进制,每个位上的权值,就是2 的 n次方;
8进制转10机制
例如8进制数字123
1*8² + 2*8¹ +3*8º = 83
16进制转10机制 数字123
1*16² + 2*16¹ + 3*16º = 291
2进制转10进制 数字1011
1*2³ + 0*2² + 1*2¹ +1*2º = 11
浮点型
浮点数的2种表现形式
注意:浮点数不应该比较大小:
1,所有数字,最终的表示形式,都是2进制
2,大多数浮点数的2进制形式,不能完全表达准确,最终只能“以很高的精度接近理论值”
3,因此,浮点数比较是不可靠。
字符串
字符串的 4种 表现形式:1.双引号字符串 2.单引号字符串 3.双引号定界符字符串 4.单引号定界符字符串
①双引号字符串可以识别的内容: \\ \" \n(换行符) \r(回车符) \t(tab符) \$(表示$符,取消其在双引号字符串中的变量起始含义
②单引号字符串可以识别的内容: \\ \'
③双引号定界符字符串可以识别的内容: \\ \n(换行符) \r(回车符) \t(tab符) \$
④单引号定界符字符串可以识别的内容: 没有转义符
注意: 在 双引号定界符字符串 和 单引号定界符字符串 中,标识符是我们自己取的一个类似 常量的名字,可以随便取; 该字符串结束一行,只能出现 标识符 本身 和一个分号, 而且还要顶格写, 其他什么都不能出现;
布尔类型
只有两个值:true 和 false
只有如下数据是被当做“假”(false):
0, 0.0, “”, “0”, null, array(), false,还有一个是“未定义的变量”,其他都为true
类型转换 和 类型相关函数
① 类型转换
自动转换 : 在任何运算中,如果需要某种类型的数据,而给出的数据不是该类型,通常都会发生自动转换:将该类型转换为目标需要的类型。
强制转换: (目标类型)数据, 将该类型的数据转化为目标类型
$n1 = 1; $s1 = (string) $n1;
通常的转换目标类型有:
(int), (float), (string), (bool), (array), (object)
②类型相关函数:
var_dump():用于输出变量的完整信息,基本只用于代码的调试;
getType($变量名):获取该变量的类型名字,返回的该变量的类型的字符串,如:"string","bool","int";
setType($变量名,"目标类型"):将该变量强制转化为目标类型;
isset(),empty(),unset() :上面 变量 中已经记录过 ↑
is_类型名($变量):判断某个数据是否为某个类型,例如:
is_int($变量名):判断该变量是否为整数类型;
is_float(),is_string(),is_bool(),is_array(),is_object(),is_null(),is_numeric()(判断该变量是否为数字),is_scalar()(判断该变量是否为一个标量类型)
PHP 中的运算符
PHP中包含三种运算符: 一元运算符,二元运算符 和 三元运算符
算术运算符:
符号有: + - * / %
注意:1.都是针对数字进行的运算。
2.如果两边不是数字类型的数据,会自动转化为数字类型。
3.取余运算只针对 整数 进行运算,如果不是整数,会自动截取整数部分。
例如:8.8%2 => 8%2 8%2.2 => 8%2
自增自减运算符
对数字进行 +1 或者 -1 的运算。
注意:1.字符串只能 自增,自增的效果就是 下一个字符,只能针对字母 或者 数字进行自增。
2.布尔类型没有自增自减, null 无自减,自增结果为1
前自增和后自增的区别
独立的自增自减运算,前自增和后自增效果是一样的;
在有自增运算的其他语句中,前自增 和 后自增有区别:前自增是对变量先+1 ,然后再做其他运算,后自增是先做其他运算,然后对变量 +1;
前自减和后自减的效果相同;
比较运算符
符号:> >= < <= == != === !==
注意:1.比较运算符一般是针对数字的比较。
2. == 和 === 的区别:== 是模糊相等比较,数据的值相等,就相等;=== 是精准相等比较,数据的值和类型都相等,两者才相等;
3.浮点数不要比较大小。
常见不同类型(标量类型)数据之间的比较规律
1.if 比较的数据有布尔值,转化为布尔值比较,比较的原则只有一个:true>false;
2.else if 有数字值,就转化为数字值比较;
3.else if 两边都是纯数字 字符串,转为数字比较;
4.else 按字符串比较,字符串的比较规则:对两边的字符串,一个一个从前往后取出字符并进行比较,谁“先大”,结果就是它大。
“abc” > “d”; //false,后者大
“abc” > “abc123”; //true ”c”大于”1”
“3abc” > “12abc”; //true, ”3”大于“1”
逻辑运算符
逻辑且 &&
true && true ==>> true
true && false ==>>false
false && true ==>>false
false && false ==>>false
总结:只有2个都是true,结果才是true;只要有一个是false,结果就是false
逻辑或 ||
true || true ==>> true
true || false ==>>true
false || true ==>>true
false || false ==>>false
总结:只有2个都是false,结果才是false;只要有一个是true,结果就是true
逻辑非 !
!true ==>> false
!false ==>> true
字符串运算符
只有一个 : .
就是将这个符号两边的字符串连接起来,如果两边不是字符串,就会自动转换为字符串,然后连接起来。
12."3" =>"123"
赋值运算符
基本赋值运算符: = ;
形式:$变量名 = 值;
衍生的赋值运算符 : += -= *= /=
+=加等: 形式: $变量名 += 值;
相当于:$变量名 = $变量名 + 值;
-=加等: 形式: $变量名 -= 值;
相当于:$变量名 = $变量名 - 值;
三元运算符
形式: 数据1 ? 数据2 : 数据3
相当于:
if(数据值1){
$变量名 = 数据值2;
}
else{
$变量名 = 数据值3;
}
位运算符
1 位就是2进制数字的每一个“位”,一个整数数字,有(由)32个位构成!
2 位运算符是仅仅针对整数进行的运算符;
3 位运算符有如下几个
&: 按位与;
|: 按位或;
~: 按位非;按位取反;
^: 按位异或
4 位运算符的基本语法规则:
按位与基本规则:
1 & 1 ==>> 1
1 & 0 ==>> 0
0 & 1 ==>> 0
0 & 0 ==>> 0
按位或基本规则:
1 | 1 ==>> 1
1 | 0 ==>> 1
0 | 1 ==>> 1
0 | 0 ==>> 0
按位非基本规则:
~1 ==>> 0
~0 ==>> 1
按位异或基本规则:
1 ^ 1 ==>> 0
1 ^ 0 ==>> 1
0 ^ 1 ==>> 1
0 ^ 0 ==>> 0
按位异或的规则是:相同为0,不同为1
整数的按位运算
形式:$n1 & $n2 //n1 ,n2是任意的整数
运算方法:将两个整数 的 二进制数字形式(32位) 的每一个对应位上 的数字 按照位运算符的基本法则进行运算。
注意:他们运算的结果,其实仍然是一个普通的数字(10进制)。
例如
10的二进制(只写后面的8位): 0000 1010
20的二进制 (只写后面的8位): 0001 0100
进行 按位与 运算 : 0000 0000
$v1 = 10 & 20; 结果为0
进行 按位或 运算 : 0001 1110
$v1 = 10 | 20; 结果为 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 = 30
整数的按位左移运算
形式: $n1 << $m
含义:将十进制数字n1的二进制数字形式(也是32位的)的每一个位上的数字都一次性往左边移动m位,并将右边空出来的位置补0,左边冒出去的不管,这样操作之后得到的结果。
例如:$n1 =10 << 2
10的二进制(只写后面的8位): 0000 1010
移动2位 : 0010 1000
结果为 2^5 + 2^3 = 40
原码,反码,补码
原码:就是一个二进制数字,从“数学观念”上来表达出的形式。其中,我们规定:
一个数字的最左边一位是“符号位”,0表示正数,1表示负数;
反码:正数的反码就是其本身(即不变);负数的反码是:符号位不变,其他位取反;
补码:正数的补码就是其本身(即不变);负数的补码是:符号位不变,其他位取反后+1——即反码+1
5的源码 00000000 00000000 00000000 00000101
5的反码 00000000 00000000 00000000 00000101
5的补码 00000000 00000000 00000000 00000101
-5的源码 10000000 00000000 00000000 00000101
-5的反码 111111111 11111111 11111111 11111010
-5的补码 111111111 11111111 11111111 11111011
数组运算符
+: 数组联合,也可以理解为“数组串联”;将右边的数组项合并到左边的数组的后面,得到一个新数组。如有重复键,则结果以左边的为准。
==:如果两个数组具有相同的键名和键值(可以顺序不同,或类型不同),则返回true
===:如果两个数组具有相同的键名和键值且顺序和类型都一样,则返回true
错误控制运算符@
通常就用在一个地方:
$link = @mysql_connect("数据库服务器地址", “用户名”, “密码”);
作用是:
如果该连接数据的语句失败(比如连接不上),则屏蔽该失败的错误提示!
运算符优先级
括号最优先,先乘除后加减,赋值最落后
算术运算符〉比较运算符〉逻辑运算符(除了“非”运算)
PHP 中的流程控制
条件控制结构:① if 语句
② switch 语句
循环控制结构: ① while 语句
② do...while 语句
③ for 语句
break 和 continue 语句
break:用于完全终止某个循环,让执行流程进入到循环语句后面的语句;
continue:用于停止当前正在进行的当次循环,而进入到循环的“下一次”过程中去(通常就是循环的开始位置);
PHP 中控制脚本执行顺序
die(字符串)/exit(字符串):输出该字符串后,立即 停止PHP 的执行!即后续程序不再执行,包括后续的其他所有php和html代码部分。exit是die的同义词。他们也可以不加字符串,而是直接停止。
sleep($n):让程序停止运行指定的秒数。然后等待过了那个时间后,就继续运行。单位为秒。
PHP 中文件加载
4个基本语句:include ,require,include_once ,require_once
使用形式:include “要加载的文件路径”; 或: include (“要加载的文件路径”);
文件加载的路径问题:
① 相对路径:是相对于当前网页文件所在的位置来定位某个被加载的文件位置,形式:
./ :表示当前位置,即当前网页文件所在的位置(目录);
../ :表示上一级位置,即当前网页文件所在的位置的上一级位置(目录);
②绝对路径:{1} 比如 include “d:/phpstudy/www/demo.php”; 基本不会用这种形式
一般运用 include __DIR__ .'/demo.php' 或者 include $_SERVER[‘DOCUMENT_ROOT’] . '/www\./demo.php'
{2} 网络绝对路径:include “http://www.baidu.com/index.php”;
③无路径:形式就是没有给出路径信息,而只给出文件名,不推荐。
include “demo.php” 不推荐
文件载入和执行过程详解
第1步:从include语句处退出php脚本模式(进入html代码模式)
第2步:载入include语句所设定的文件中的代码,并执行(如同在当前文件中一样)
第3步:退出html模式重新进入php脚本模式,继续执行之后的代码
4个载入语句的区别
include 和 require 的区别:include载入文件失败时(即没有找到该文件),报一个“提示错误”,然后继续执行后续代码;requre载入文件失败时,报错并立即终止执行。通常,require用于在程序中,后续的代码依赖于载入的文件的时候。
include和include_once的区别:include载入的文件不判断是否重复,只要有include语句,就会载入一次——即此时可能导致重复载入。include_once载入的文件会有内部判断机制是否“前面代码”已经载入过,如果载入过,就不再载入。
require和require_once的区别:同include和include_once的区别。
include_once和require_once的区别:同include和require的区别。
在被载入文件中return语句的作用
1 一个载入语句,如果载入成功,其实是有返回值的,为1,如果载入失败,则返回的是false。(虽然我们通常不去使用该返回值)。
$v1 = include "./demo.php"; //载入成功返回1
2 return语句此时的作用是终止载入过程——该return语句的后续被载入文件的代码不再载入。
3 return语句也可以用于该被载入文件载入时返回一个数据,形式为:return 数据;
PHP 中的错误处理
错误的分类
通常分 3 种: ① 语法错误:程序运行前,都要先检查语法,如果有错误,就会立即报错,并且不会去执行程序。 ② 运行时错误 :在程序语法检查通过后,开始运行程序并在此过程中遇到的错误。常见分3类:{1}提示性错误 {2}警告性错误 {3}致命错误③ 逻辑错误:自己写代码的逻辑错误。
错误的分级
PHP语言中,将各种错误进行了不同级别的分类归纳, 并形成大约10几个级别的错误,这就是技术层面的错误分级。
每一级别的错误,都有一个‘代号’,这个代号其实也就是一个系统内部的 常量
系统常见错误:
E_ERROR: 致命错误 常量值 1
E_WARNING: 警告性错误 常量值 2
E_NOTICE: 提示性错误 常量值 8
用户可自定义的错误:
E_USER_ERROR: 自定义致命错误
E_USER_WARNING: 自定义警告性错误
E_USER_NOTICE: 自定义提示性错误
其他:
E_STRICT: 严谨性语法检查错误
E_ALL 代表“所有错误”
错误的触发
系统触发:程序运行到某行代码,确实出现了某项错误,此时系统就会报错,这就触发了系统错误。
系统触发的典型错误有3种:{1}E_ERROR: 致命错误 ,程序无法执行后面的语句,比如调用一个不存在的函数。 {2}E_WARNING: 警告性错误 ,会出现错误提示,并继续执行后面的代码,比如 include 载入一个不存在的文件 {3}E_NOTICE: 提示性错误 会出现错误提示,并继续执行后面的代码,比如 使用一个不存在的变量 和常量
自定义触发:当我们处理某些数据的时候,本来数据本身是没有错误的,但根据具体应用(业务)的需要,会要求数据满足某种条件,而该数据并不满足的时候,我们就可以在程序中“主动”去触发(创建)一个错误,以表明该数据的“非法性”。
语法形式:
trigger_error(“错误提示信息内容”, 3种用户错误代号之一);
其中触发了用户的致命错误(E_USER_ERROR),也会终止程序的后续执行。
错误报告的显示问题
是否显示错误报告:
方式① php.ini 中 display_erros = On 或者 Off
方式② 脚本中 ini_set(" display_erros", 1); 或者 0
显示哪些级别的错误报告:
方式① php.ini中 error_reporting = E_ALL | E_ STRICT //显示全部
error_reporting = E_NOTICE //只显示E_NOTICE级别的错误
error_reporting = E_NOTICE | E_WARING | E_ERROR //显示该3种;
error_reporting = E_ERROR | E_USER_ERROR //显示该2种严重错误
方式②脚本中:
跟php.ini中设置其实是一样,例如:
ini_set(“error_reporting”, E_NOTICE); //就显示该一个级别的错误;
ini_set(“error_reporting”, E_NOTICE | E_WARNING), //显示2个级别;
ini_set(“error_reporting”, E_NOTICE | E_WARNING | E_ERROR), //显示3个级别;
ini_set(“error_reporting”, E_ALL | E_STRICT), //这才代表显示所有错误。
错误日志的记录问题
错误日志就是错误报告,然后写入文件中,就是错误日志。
一. 是否记录 log_error
方式① php.ini 中 log_error = On 或者 Off
方式② 脚本中 ini_set("log_errors", 1); 或者 0
函数 ini_set(“PHP配置项”,值); 用来在脚本中设置 php.ini 中某项的值
$data = ini_get(“PHP配置项”); 用于获取php.ini中是某项的值
二. 记录位置 error_log
方式① 直接使用一个文件名,此时系统会自动在每个文件夹下都建立该文件名,并用其记录该文件夹下的所有网页文件发生的错误信息。
ini_set("error_log","文件名称.txt"); 记录到该文件
方式② 使用一个特殊的名字“syslog”,则此时所有错误信息都会记录到系统的“日志文件”中。
ini_set("error_log","syslog"); 记录到系统日志中
系统日志文件在这里:控制面板》管理工具》事件查看器》window日志》应用程序
自定义错误处理器
错误处理器 就是 一旦发生错误,用来处理该错误的 函数。
自定义错误处理,就是 让系统不要处理错误了,而是由 开发者 来对错误进行处理:显示和记录。
步骤1: 设置要用于处理错误的函数
set_error_handler(“函数名”);
步骤2 : 定义函数
function 函数名(){
错误处理内容 显示错误报告 和 记录错误日志
}
$errcode :代表错误代号 此处为8 表示 E_NOTICE
$errMsg: 代表错误信息内容
$errFile: 代表错误的文件名
$errLine: 代表错误的行号