变量的理解:
变量名和值的对应关系——引用关系,即使用该变量名,就是指使用该变量名所指代的变量值。
图示:
传值方式:
前提:传值方式是专门指一个把变量的值传递给另一个变量的方式。
值传递: 将变量的值进行拷贝,然后把拷贝的新的值赋值给另一个变量。
引用传递: 将变量的引用关系进行拷贝,然后用此关系将数据跟另一个变量建立联系
在php中,默认变量之间传值,都是使用值传递。
如果想要实现引用传递,必须使用引用传递符号:&
可变变量:
当一个变量的名字又是一个变量的时候,就称为可变变量。
形式上,通常就是两个(或以上)的“$”连续出现。
$abc = “v1”;
$v1 = 123;
echo $$abc; //理解:$($abc) => $v1 =>123
预定义变量(超全局数组):
都是数组,都具有超全局作用域,都是系统自动维护。
$_GET:通过get方式发送(提交)的数据集合。
有4种形式可以发送get数据:
<form action=”abc.php” method=”get” >。。。。</form>
<a href=”abc.php?a=5&b=10&c=xyz”> 笑嘻嘻</a>
上一行黄色的部分,叫做“连接参数”,查询字符串,还是$_SERVER[‘QUERY_STRING’]
location.href = “abc.php?a=5&b=10&c=xyz”;
location.assing(“abc.php?a=5&b=10&c=xyz”);
获取get数据形式只有一个:$_GET[‘数据名’]
$_POST:通过post方式发送(提交)的数据集合。
<form action=”abc.php” method=”post” >。。。。</form>
获取post数据形式只有一个:$_POST[‘数据名’]
$_REQUEST::通过get和post方式发送(提交)的数据集合的全部。
$_SERVER:
其中存储了服务器端和客户端的相关信息。
SERVER_NAME,
DOCUEMNT_ROOT
SERVER_ADDR
REMOTE_ADD
PHP_SELF
QUERY_STRING
SCRIPT_FILENAME
$GLOBALS:
常量:
定义形式:
使用函数定义: define(“常量名”, 常量值)
使用const关键字: const 常量名=常量值;
注:常量值只能是标量类型(string,int,float,bool)
使用常量:
直接使用常量名:
使用函数: constant(“常量名”); 比如:
const C1 = 1;
const C2 = 2;
for($i = 1; $i <=2; $i++){
echo constant( “C” . $i );
}
常量变量的区别:
定义形式,使用形式,作用域范围,可用类型不同。
判断常量是否存在:
就一个函数:defined(“常量名”)
使用一个未定义的常量(特殊情况):
php会报一个notice错误,并又同时“认可”该常量,并且其值就是该常量的名字本身。
预定义常量:
有很多很多,M_PI, PHP_OS, PHP_VERSION, E_ERROR, ...
魔术常量:
很少的几个而已:__DIR__, __FILE__, __LINE__
数据类型
整体划分
· 标量类型: int, float, string, bool
· 复合类型: array, object
· 特殊类型: null, resouce
整数类型int, integer
3种整数表示法
· 十进制写法:123:
$n1 = 123;
· 八进制写法: 0123
$n2 = 0123;
· 十六进制写法: 0x123
$n3 = 0x123;
进制转换问题
先学习几个单词:
dec: 十进制
bin:二进制
oct:八进制
hex:十六进制
· 十进制转二进制decbin(),除2取余倒着写
$v1 = decbin(123); //注意:参数必须是10进制数字,转换后的结果必然是二进制字符串。
我们也可以通过手工的方式来完成10进制转2进制的完整过程。
基本做法是:将10进制数字除以2,并取得余数,如果除得的商不为0,则继续除以2,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的2进制数字:
· 十进制转八进制decoct(),除8取余倒着写
使用php系统函数:
$r1 = decoct(十进制数字); //结果是一个8进制数字字符串。
我们也可以通过手工的方式来完成10进制转8进制的完整过程。
基本做法是:将10进制数字除以8,并取得余数,如果除得的商不为0,则继续除以8,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的8进制数字:
· 十进制转十六进制dechex(),除16取余倒着写
16进制的数字包括如下(从0开始):
0 1 2 3 4 5 6 7 8 9 A B C D E F
对应10进制其实是:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
系统函是:dechex(十进制数字), 结果是16进制数字字符串。
手工运算:
基本做法是:将10进制数字除以16,并取得余数,如果除得的商不为0,则继续除以16,并继续去的余数,直到商为0。然后将所有取得的余数,按“倒序写出”,就是对应的16进制数字:
二进制转十进制bindec(),每位数值乘以2的权值然后相加
先理解一个“权值”概念:
就是某位数字上的该数字所代表的数的大小。比如:
10进制数字1234,其代表:1*10 3+ 2*102 + 3*101 + 4*100 = 1000+ 200 + 30 + 4;
这里,10 3, 102 ,101 ,等等,就称为权值。
二进制转10进制,就是将每位数值乘以对应位上的权值,然后相加得到的结果。
用系统函数是:
$v1 = bindec(“二进制数字字符串”) ;//得到的结果是10进制数字
手工转换:
二进制数字的权值,从右到左,分别是:
20, 21, 22, 23, 24, 25,.....
即分别是(10进制大小):
1, 2, 4, 8, 16,32
手工计算:
1010110
=1*26 + 0*XX + 1*24 + 0*XX + 1*22 + 1*21 + 0 //说明,其中XX表示无所谓的数字值
=64 + 0 + 16 + 0 + 4 + 2 + 0
=86
· 八进制转十进制octdec() ,每位数值乘以8的权值然后相加
用系统函数是:
$v1 = octdec(“8进制数字字符串”) ;//得到的结果是10进制数字
手工算法统2进制转换为10进制,略。
· 十六进制转十进制hexdec() ,每位数值乘以16的权值然后相加
用系统函数是:
$v1 = hexdec(“16进制数字字符串”) ;//得到的结果是10进制数字
· 注意:十进制转为其他进制结果是字符串,其他进制转为十进制要求给定数据是字符串形式
思考:
$v1 = bindec(123);//理解过程:bindec(“123”) =>bindec(“1”)=>1
$v2 = bindec(0123);//理解:0123是8进制数字,其10进制值为:83,再当作二进制字符串就是“83”,结果就只能是0
$v3 = bindec(“0123”);//理解:因为直接就是字符串了,就当二进制字符串用,结果是1
$v4 = octdec(0123); //理解:0123是8进制数字,其10进制值为:83,再当作8进制字符串就是“83”,但8进制中没有“8”这个数字,就只识别出一个“3”这个数字
以下代码测试:
浮点类型float, double, real
有两种写法:
$v1 = 1.234; //带小数点,,就是浮点类型
$v2 = 1.234E3;//含义是:1.234乘以10的3次方,即1234,带E的形式就是浮点数
$v3 = 1234E3;//结果值是1234000,但也是一个浮点数。
关于浮点数的细节知识
· 10进制小数转二进制小数的做法:乘2并顺序取整数部分
没有系统函数。
· 浮点数不应直接进行大小比较
因为浮点数在系统内部(cpu级别),很可能都是不精确表达。
要想进行比较,我们只能考虑自己应用中的精度要求的基础上,将其转换为整数进行比较。
通常的做法是:乘以10的精度位数数次方,比如精度要求3位有效数字,则乘以103次方
· 当整数运算的结果超出整数的范围后,会自动转换为浮点数。
整数的范围,在32位系统下,大约正负20多亿
字符串类型string
js中,虽然有2种字符串表达形式,但也应该理解为是一种字符串:
var str1 = ‘单引号字符串’
var str2 = “双引号字符串”;
但在php中,单引号和双引哈字符串,是有不同细节含义的字符串。
php中,有4种字符串形式:
单引号字符串:
双引号字符串:
更多的转义符见手册如下:
nowdoc(单引号)定界符字符串:
布尔类型:bool, boolean
用于标识某种只有两个状态值的数据:true,false——吃没吃,去没去,有没有。。。。。
在应用出,我们常常会(需要)直接将一个数据(可能是各种其他类型)当作一个布尔值来进行判断。
那么此时其实发生的是:会将该数据隐含转换为布尔值。
最常见的语法形式就是:
if( 某数据/变量 ){
.................
}
那么,在php中,其他各种数据,隐含转换为布尔值的时候,会当作false的有:
0
0.0
null
“”
“0”
array(); //空数组
未定义的变量 //当然要尽量避免
其他数据就当作true来看待了。
看手册:PHP手册〉附录〉类型比较表〉使用 PHP 函数对变量 $x 进行比较
数组类型array
标识一系列数据的“有序排列”的集合体。
php中,数组的下标可以使用整数或字符串。
数字下标常说“索引号”,
字符串下标常说“键名”。
实际上,在php的报错系统中,都叫做“index”,或offset
数组中还可以存储数组,就可以构成“多维数组”的形式。
数组遍历在php中有专门语法:
foreach( 数组名 as 下标变量$k => 值变量$v1 ){
//这里就是循环体,就可以使用两个变量$k, $v1
}
对象类型object
在php中,对象跟js中的有比较大的区别。
通常,js中的对象,有自定定义的(创建的),也有“现成”,比如window,location,标签对象。
但:
php中的对象,通常都是指自己定义的对象,纯语法的。
资源类型resource
· 含义:基本上都是指对外部数据的引用。(数据非php代码生成的) 不是PHP语言通过某种语法形式“创造”的数据,而是外部本来就有该数据(比如数据库,文件,图片),PHP只是通过某种语法(或方式)来对其进行某些操作。
空类型null
只是一个计算机中编程领域的“概念”类型,只是为了表达变量所存储的数据的某种特殊情形所创建的概念——没有存数据,或没有存有效的有意义的数据
类型转换
自动转换:
通常自动转换是弱类语言的一个最基本也最方便的一个特征:它会在各种运算中根据运算符的需要也将非该运算符所能处理的数据转换为可以处理的数据。常见情形如下:
· if(数据){}:转为bool类型
· 算术运算符:转为数字类型
· 连接运算符:转为字符串类型
· 比较运算符:转为布尔类型或数字类型
o 两边如果有至少一个布尔,则另一边就会转为布尔,并进行比较
o 否则,就转为数字进行比较
特别常用的一个转换(不管是自动转换还是强制转换),就是字符串转换为数字:
“5” ==>> 5 //整数
“5.5” ==>> 5.5浮点数
“5abc” ==>> 5整数
“5.5ab” ==>> 5.5浮点数
“abc5” ==>> 0整数
“abc” ==>> 0整数
“” ==>> 0
Python中的数据类型
PHP数据类型 8种
布尔型(boolean)
字符串型(string)
整型(integer)
浮点型(float)
数组(array)
对象(object)
资源(resource
空值(null)
Java数据类型
byte
short
int
long
float
double
boolean
char
String
强制转换
就是通过语法来让某数据转换为另一种类型的数据,语法格式为:
(目标类型)数据;
注意:我们并不能使用该语法将任意类型的数据,转换为其他任意类型——因为有些类型之间的转换是没有意义的——系统内部也没有定义过该类型转换的规则。
——最常见的转换通常就发生在基本(标量)数据类型之间。
与类型相关的系统函数
· var_dump():能够输出一个变量的完整信息。
· getType():获取一个变量的类型名称,结果是一个单词(字符串), setType();设置一个变量的类型,语法: setType(变量名,目标类型)
· isset(), empty(), unset();
o isset()判断一个变量是否存在数据:
o empty()判断一个数据是否为空:接近我们的日常观念(没有就是空)
o unset():销毁(删除)一个变量。
· is_XX类型() 系列函数:判断某个数据是否是某种类型,包括:
o is_int(), is_float(), is_numeric(),is_bool(), is_array(), is_scalar():
is_numeric()对:3, 3.5,“3”,“3.14”判断都是true
is_scalar():判断是否为标量类型(即int,float,stirng,bool)
运算符
算术运算符
有以下几个:+ - * / % ++ --
· 注意:注意取余运算%,先取整,再取余
$v1 = 7.5 % 3; //结果是:1
$v2 = 7.5 % 3.5; //结果是:1
对比js中:——js中, 不会进行取整处理
var v1 = 7.5 % 3; //结果是:1.5
var v2 = 7.5 % 3.5; //结果是:0.5
自增自减运算符:
· 常规:对数字进行自加1或自减1。
· 字符串: 只能自增,且自增的效果就是“下一个字符”
· 布尔值递增递减无效
· null递减无效,递增结果为1
前加加和后加加的区别:
· 前++:先完成变量的递增运算,再取得该变量的值参与别的运算。
· 后++:先将原来变量的值临时存储,再将变量值递增,最后再将临时存储的值参与别的运算。
· 推论1:如果独立语句中进行自加运算,前自加后自加没有区别 。
· 推论2:如果前自加后自加是放在别的语句中,则会有所区别。
· 推论3: 前加加比后加加效率略高(在循环中建议使用前加加)。
比较运算符:
包括:> >= < <= ==松散相等 != ===严格相等 !==
==和===的区别:
==:松散相等,比较的是两个数据“类型转换之后”是否有可能相等,也常常认为是“数据内容是否相同”
===:严格相等,全等,只有两个数据的类型和数据的内容都完全一致,才相等。
严重推荐参考手册〉〉附录〉〉类型比较表。
常见不同类型的比较(主要指标量类型的数据)——非正常比较
· 正常比较——数字的大小比较
· 如果有布尔值,均转为布尔值比较:规则:true > false
· 否则,如果有数字,均转为数字比较:
· 否则,如果两边都是纯数字字符串,转为数字比较
· 否则,就按字符串比较
字符串的比较规则为:按字符的先后顺序依次一个一个比较,发现哪个大,则就表示整体大,后续不再比较
逻辑运算符:&& || !
前提:都是针对布尔类型的值进行的运算,如果不是布尔,就会转换为布尔。
逻辑与:
规则(真值表):
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
逻辑非:
!true ==> false
!false ===>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 = “不及格";
}