变量是包含了一个名称和一个值的“标识符”。
形式:变量必须以$开头,后面紧跟变量名
变量的基本使用
定义变量(赋值):直接给变量赋值,就是定义;
不支持js中的那种“定义但不赋值”的语法。
换句话说,第一次给一个变量赋值,就算定义变量。
取值:所有需要一个变量值的语句中,就会取得该变量的值,常见包括:
输出:echi $v1; //取得$v1的值,并输出
给其他变量赋值$v2 = $v1; //取得$v1的值,并赋值给$v2
参与运算:$v3 = $v1 + 3; //取得$v1的值,并跟3相加,。。。。
判断变量是否存在isset()
存在,就返回true,不存在就返回false
实际上,如果一个变量的值是null,返回的也是false
修改变量值(赋值):
第二次及以后给一个变量赋值,就算修改变量值
删除unset():就是断开变量名跟数据之间的“引用关系”
基本规则:
1,只能使用大小写字母,下划线(_),数字
2,数字不能开头
3,不能跟所在环境(系统)的关键字重名(比如if, for, function.....
行业规则(潜规则):
基本规则,保证的是语法的正确性。
行业规则,保证的是是否能得到别人的尊重!
行业规则中,有如下几种常用的命名规则:
1,驼峰命名法:
示例:name, myName, myFatherName
2,帕斯卡命名法:
示例:Name, MyName, MyFatherName
3,下划线间隔法:
示例:name, my_ame, my_father_name
变量间的传值方式
总体说明:
1,这里讨论的传值方式是指:一个变量对另一个变量
2,它不仅仅适用于赋值语句,也适用于其他有同样含义的语句,比如:函数的实参到形参
3,传值方式只有2种:值传递,引用传递
4,php中,所有变量,默认都是值传递。
5,要想使用引用传递,必须使用引用传递的符号: &
值传递(相互独立)
是指将一个变量的数据值(数据内容)拷贝一份,然后赋值给另一个变量。
引用传值:(相关联)
是指将一个变量的引用关系拷贝一份,然后赋值给另一个变量,即另一个变量也同样由该关系决定了指向某个数据:
预定义变量
$_GET, $_POST, $_SERVER, $_REQUEST, $GLOBALS, $_COOKIE, $_SESSION, ..........(大约10个)
超全局变量都是数组!
$_SERVER变量(数组)
常用的有:
REMOTE_ADDR, 用户的IP地址
SERVER_ADDR: 服务器端的IP地址
SERVER_NAME: 服务器名(主机名)
DOCUMENT_ROOT: 站点绝对路径(其实就是主机设置中的DocumentRoot
PHP_SELF:当前网页的文件路径
QUERY_STRING: 表示一个get请求的整体字符串,类似这样:
http://www.abc.com/abc.php?a=5&b=10连接地址中的“a=5&b=10”
输出所有项(可能每台服务器有所差异)
常量(配置) pwd = 123
使用形式:define(“常量名”, 常量值);
推荐常用名使用全大写形式
直接使用名字
数据类型
整体划分
标量类型: int, float, string, bool
复合类型: array, object
特殊类型: null, resouce
字符串类型string
php中,有4种字符串形式:
单引号字符串:
双引号
nowdoc(单引号)定界符字符串:
heredoc(双引号)定界符字符串:
布尔类型:bool, boolean
用于标识某种只有两个状态值的数据:true,false——吃没吃,去没去,有没有。。。。。
在应用出,我们常常会(需要)直接将一个数据(可能是各种其他类型)当作一个布尔值来进行判断。
那么此时其实发生的是:会将该数据隐含转换为布尔值。
最常见的语法形式就是: num == 3 flag = 1
If(flag){}
if( 某数据/变量 ){
.................
}
那么,在php中,其他各种数据,隐含转换为布尔值的时候,会当作false的有:
0
0.0
null
“”
“0”
array(); //空数组
未定义的变量 //当然要尽量避免
其他数据就当作true来看待了。
数组类型array
标识一系列数据的“有序排列”的集合体。
php中,数组的下标可以使用整数或字符串。
数字下标常说“索引号”,
字符串下标常说“键名”。
实际上,在php的报错系统中,都叫做“index”,或offset
数组中还可以存储数组,就可以构成“多维数组”的形式。
数组遍历在php中有专门语法:
foreach( 数组名 as 下标变量$k => 值变量$v1 ){
//这里就是循环体,就可以使用两个变量$k, $v1
}
类型转换
自动转换:
通常自动转换是弱类语言的一个最基本也最方便的一个特征:它会在各种运算中根据运算符的需要也将非该运算符所能处理的数据转换为可以处理的数据。常见情形如下:
if(数据){}:转为bool类型
算术运算符:转为数字类型
连接运算符:转为字符串类型 + .
比较运算符:转为布尔类型或数字类型
两边如果有至少一个布尔,则另一边就会转为布尔,并进行比较
否则,就转为数字进行比较
特别常用的一个转换(不管是自动转换还是强制转换),就是字符串转换为数字:
“5” ==>> 5 //整数
“5.5” ==>> 5.5浮点数
“5abc” ==>> 5整数
“5.5ab” ==>> 5.5浮点数
“abc5” ==>> 0整数
“abc” ==>> 0整数
“” ==>> 0
运算符
算术运算符
有以下几个:+ - * / % ++ --
注意:注意取余运算%,先取整,再取余
前加加和后加加的区别:
前++:先完成变量的递增运算,再取得该变量的值参与别的运算。
后++:先将原来变量的值临时存储,再将变量值递增,最后再将临时存储的值参与别的运算。
推论1:如果独立语句中进行自加运算,前自加后自加没有区别 。
推论2:如果前自加后自加是放在别的语句中,则会有所区别。
推论3: 前加加比后加加效率略高(在循环中建议使用前加加)。
==和===的区别:
==:松散相等,比较的是两个数据“类型转换之后”是否有可能相等,也常常认为是“数据内容是否相同”
===:严格相等,全等,只有两个数据的类型和数据的内容都完全一致,才相等。
逻辑运算符:&& || !
前提:都是针对布尔类型的值进行的运算,如果不是布尔,就会转换为布尔。
逻辑与:
规则(真值表):
true && true ==> true;
true && false ==>false
false && true ==>false;
false && false ==>false;
只有两个都是true,结果才是true
只要有一个是false,结果就是false
逻辑或:
规则(真值表):
true || true ==> true;
true || false ==>true
false || true ==>true;
false || false ==>false;
只有两个都是false,结果才是false
只要有一个是true,结果就是true
短路现象之逻辑与短路:
在实际应用中,参与逻辑运算的数据,往往都不是直接的布尔值,而是有关计算之后的布尔结果值。
大致如下:
if( IsFemale( $uName ) && isAge($uName) > 18){
......echo “女士优先”
}
此时,如果IsFemale()函数判断的结果是false,那么后续的函数isAge()就不再调用,自然也不再进行大于18的判断,这是就称为“短路现象”
短路现象之逻辑或短路:
if( IsFemale( $uName ) || isAge($uName) < 18){
......echo “有限照顾女士或未成年人”
}
此时,如果IsFemale()函数判断的结果是true,那么后续的函数isAge()就不再调用,自然也不再进行小于18的判断,这就是“或运算符短路现象”
字符串运算符:
只有一个: .
衍生一个: .=
会将运算符两边的数据转换为字符串。
对比js:+(具有双重含义,此时就需要一定的“判断”)
赋值运算符:
只有一个: =
衍生多个: += -= *= /= %= .=
基本形式为:
$变量 符合赋值运算符 数据2;
这些衍生的赋值运算符,是这种运算的一个简化形式:
$v2 = $v2 [运算符] 数据2;//某个变量跟另一个数据进行某种运算之后的结果再存入该变量
对比(它不是这种形式的简化):
$v2 = 数据2 [运算符] $v2; //这种形式不应该简化
条件(三目)运算符:
一般的运算符需要2个数据参与
有几个运算符只需要一个数据参与: ++, -- !
则:
条件运算符就需要至少3个数据参与!
形式为:
数据1 ? 数据2 :数据3;
通常,数据1最终应该是一个布尔值(如果不是,则会当作布尔值来使用)。
含义:
如果数据1为true,则运算结果为数据2, 否则运算结果为数据3
典型举例:
$score = 66;
$result 1= $score >= 60 ? “及格” : “不及格”; //结果是“及格”
$result 2= $score ? “及格” : “不及格”; //结果是“及格”,但含义完全不同,因为即使分数是33,也是及格。只有分数为0才是不及格。
三目运算符可以转换为if else语句来实现:
if( $score >= 60){
$result1 = “及格";
}
else{
$result1 = “不及格";
}
for循环: