(小白)PHP基础学习001 20201001
历程
1.echo 打印
<?php
$a=100;
echo 'HelloWorld',$a;
?>
HelloWorld100
- unset
<?php
$a=100;
unset $a;
echo 'HelloWorld',$a;
?>
报错:
Parse error: syntax error, unexpected '$a' (T_VARIABLE), expecting '(' in /box/script.php on line 3
Exited with error status 255
- 变量命名、
可以中文命名,但不建议、
<?php
$中国='china';
echo 'HelloWorld ',$中国;
?>
结果:
HelloWorld china
- 预定义变量:
$_GET:获取所有表单以get方式提交数据
$_POST:POST提交的数据都会保存在此
$_REQUEST:GET和POST提交的都会保存
$_GLOBALS:PHP中所有的全局变量
$_SERVER:服务器信息
$_SESSION:session会话数据
$_COOKIE:cookie会话数据
$_ENV:环境信息
$_FILES:用户上传的文件信息
- 可变变量
<?php
$a='b';
$b='bb';
echo $a," ";
echo $$a;
?>
结果:
b bb
这就相当于$
a
=
a=
a=(
a
)
=
a)=
a)=b
延伸拓展:
<?php
$a='b';
$b='bb';
$bb='bbb';
echo $a," ";
echo $$a," ";
echo $$$a;
?>
结果:
b bb bbb
有兴趣的可以用个for循环试试
- 变量传值
将一个变量赋值给另一个变量
第一种:值传递,两个变量没关系
<?php
$a=1;
$b=$a;
$b=2;
echo $a," ",$b;
?>
结果
1 2
第二种:引用传递,两个变量指向同一个内存空间
<?php
$a=1;
$b=&$a;
$b=2;
echo $a," ",$b;
?>
结果
2 2
内存中,通常有几个分区:
栈区:程序可以操作的内存部分(不存数据,运行程序代码),少但是快
代码段:存储程序的内存部分(不执行)
数据段:存储普通数据(全局区和静态)
堆区:存储复杂数据,大但效率低
- 换行(未成功)
<?php
$a=1;
$b=2;
echo $a,$b,"<br/>";
?>
结果:
12<br/>
具体原因不知道,我是在线编辑的,回头可以在其它方面测试或者了解一下
- 常量定义
<?php
define("PI",3.14);
const PII=3;
echo PI," ",PII
?>
结果:
3.14 3
常量通常以大写字母,与变量进行区别,前面不能加 , 加 ,加 ,加后就被认为是变量
区别:
特殊符号:
define("-_-",3.14);//这种方式可行
const -_-=3; //这种方式不行
像上面的方式-_-不能直接使用,而必须用constant的方式访问常量:
<?php
define("-_-",3.14);//这种方式可行
//echo -_- //报错
echo constant('-_-');
?>
结果:
3.14
数据不允许被修改的,一定用常量
- 常用的几个系统常量
PHP_VERSION:PHP版本号
PHP_INT_SIZE:整形所占用字节数,整形大小
PHP_INT_MAX:整形能表示的最大值(PHP中整形是允许出现负数:带符号)
<?php
echo PHP_VERSION," ",PHP_INT_SIZE," ",PHP_INT_MAX;
?>
结果:
7.4.1 8 9223372036854775807
- 魔术常量
双下划线开始+常量名+双下划线结果
魔术常量的值通常会跟着环境变化,但是用户改变不了,只能看着它变化
__DIR__:当前被执行的脚本所在电脑的绝对路径
__FILE__:当前被执行脚本所在的电脑的绝对路径(带自己文件的名字)
__LINE__:当前所属的行数
__NAMESPACE__:当前所属的命名空间
__CLASS__:当前所属的类
__METHOD__:当前所属的方法
//等等
<?php
echo __DIR__," ";
echo __FILE__," ";
echo __LINE__," ";
?>
结果:
/box /box/script.php 4
- 数据类型
数据类型:data type 在PHP中指的是存储的数据本身的类型,而不是变量的类型,PHP是一种弱类型语言,变量本身没有数据类型
PHP的八种类型
三大类,八小类
简单(基本数据类型):4小类
整型:int/integer,系统分配4个字节,表示整数类型(有前提)
浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数
字符串:string,系统根据实际长度分配,表示字符串(引号)
复合数据类型:2个小类
对象类型:object,存放对象(面向对象)
数组类型:array,存储多个数据(一次性)
特殊数据类型:2个小类
资源类型:resource,存放资源数据(PHP外部数据,如数据库,文件)
空类型:NULL,只有一个值是NULL(不能运算)
-
类型转换
在很多条件下,需要指定的数据类型,需要外部数据(当前PHP取得的数据)
转换方式:
自动转换:
系统根据需求自己判定,自己转换(用的比较多,效率偏低)
强制(手动转换):认为根据需要的目标类型转换 -
类型判断
PHP类型比较表
https://www.php.net/manual/zh/types.comparisons.php
这里的isset()指是的数据是否存在
其它类型转数值的说明:
布尔true为1,false为0
字符串转数值有自己的规则
以字母开头的字符串,永远为0
以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
- 强制转换
在变量前增加一个括号(),然后在里面写上对应的类型:int/integer_其中NULL类型需要用到unset()
<?php
$a="abc1.1.1";
$b="1.1.1abc";
//自动转换
//echo $a+$b; 直接运行会报错
echo (float)$a," ",(float)$b;
?>
结果
0 1.1
需要注意的是,在这里的两个字符串是不能直接相加的:
<?php
$a="abc";
$b="def";
echo $a+$b
?>
Warning: A non-numeric value encountered in /box/script.php on line 4
Warning: A non-numeric value encountered in /box/script.php on line 4
0
bool类型无法用echo来查看,因为打印出来的True不能确定是布尔型还是string
<?php
$a=TRUE;
echo $a
?>
结果是:
1
类型判断
is_***()=>这里的***是类型,比如:is_NULL
<?php
$a=TRUE;
echo is_bool($a)," ";
$b=FALSE;
echo is_bool($b);
?>
结果:
1 1
可以用jvar_dump结果查看:
<?php
$a=TRUE;
var_dump(is_int($a));
var_dump(is_bool($a));
?>
结果:
bool(false)
bool(true)
- 获取以及设定数据的类型
gettype()
settype():与强制转换不同
强制转换(类型)变量,是对数据值复制的内容进行处理(不会处理实际存储的内容,也就是原数据不变,而settype()会改变数据本身)
<?php
$a='123abc';
//强制转换
echo (int)$a," ";
echo gettype($a)," ";
//settype()
echo settype($a,"int")," ";
echo gettype($a);
?>
结果:
123 string 1 integer
- 整数类型
整数类型,4个字节存储数据,最大就是32位,42亿多,但PHP中默认是有符号类型(区分正负数),所以一般是正,一半是负
PHP中提供了四种整型定义方式:
十进制,二进制,八进制和十六进制
<?php
$a=100;//10进制;
$b=0b110; //2进制;
$c=0110; //8进制
$d=0x110; //16进制
echo $a," ",$b," ",$c," ",$d
?>
结果:
100 6 72 272
在PHP的输出中,默认所有的输出都是十进制,所以都会自动转为十进制
- 浮点型
浮点型,小数类型以及超过整型所能存储范围的整数(不保证精度),精度范围大概在15个有效数字左右。
<?php
$f1=1.23;
$f2=1.23e10;
var_dump($f1,$f2);
?>
结果:
float(1.23)
float(12300000000)
衍生:
<?php
$f1=1.23;
$f2=1.23e10;
$f3=PHP_INT_MAX+1;
var_dump($f1,$f2,$f3);
?>
float(1.23)
float(12300000000)
float(9.2233720368548E+18)
原本f3是整型,但因为超出了自身的范围,所以变成了浮点型
结果:
float(1.23)
float(12300000000)
float(9.2233720368548E+18)
尽量不用浮点数做精确判断,浮点数保存的数据不够精确,而且在计算机凡是小数基本上存的都不准确
<?php
$f1=0.7;
$f2=2.1;
$f3=$f2/3;
var_dump($f3==$f1);
?>
结果:
bool(false)
按我们正常计算,结果应该是true,但电脑存在浮点的误差,所以结果是false
- 布尔型
<?php
$f1=true;
$f2=FALSE;
var_dump($f1,$f2);
?>
结果:
bool(true)
bool(false)
Empty():判断数据的值是否为“空”,不是NULL,如果为空返回true,不为空返回false
Isset():判断数据存储的变量本身是否存在,存在变量返回true,不存在返回false
具体见上面第13点,类型判断
- 判断
在PHP中,123和"123"是可以判断相等的
<?php
$f1="123";
$f2=123;
var_dump($f1==$f2);
?>
结果:
bool(true)
- 连接运算符
.:两接两个字符串
.=:相当于a=a.b
<?php
$f1="abc";
$f2="def";
echo $f1.$f2
?>
结果:
abcdef
- 错误抵制符
@:在可能出错的表达式前加上@
生产的时候会用到,但在开发的时候基本不用,因为开发的时候希望把错误暴露出来
<?php
$f1=8;
$f2=0;
echo @($f1/$f2);
?>
结果:
INF
而如果没有@
<?php
$f1=8;
$f2=0;
echo $f1/$f2;
?>
Warning: Division by zero in /box/script.php on line 4
INF
- 三目运算符
表达式?表达式2:表达式3;
if_else_
这个和其它语言相同
- 自操作运算符
<?php
$a=1;
$a++;//前置自操作
echo $a," ";
$b=1;
++$b; //后置自操作
echo $b," ";
echo "==>";
$a=1;
$b=1;
echo $a++," ",++$b;//这里相当于先把a输出,然后再给a自身++,b则相反
echo "==>";
$a=1;
$c=$a++; //这里相当于先把a赋值给c,然后再给a自身++
echo $c," ";
$b=1;
$d=++$b; //这里相当于先把++b计算出来,然后再赋值给d
echo $d," ";
?>
结果:
2 2 ==>1 2==>1 2
- 计算机码
计算机码:计算机在实际存储数据的时候,采用的编码规则(二进制规则)
计算机码:原码、反码和补码,数值本身最左边一位是用来充当符号位;正数为0,负数为1
原码:数据本身从十进制转换成二进制得到的结果
正数:左边符号位为0(正数的原码,反码和补码就是原码本身)
负数:左边符号位为1
反码:针对负数,符号位不变,其他位取反
补码:针对负数,反码+1
系统中存在两个0,+0和-0
+0:00000000
-0:10000000
-0 取反:11111111
补码:0000000
<?php
//计算机码:
$a=5;
$b=-5;
/*
5原码:00000101
-5原码:10000101
取反:11111010
求补:11111011
*/
?>
- 位运算
取出计算机中最小的单位(位bit)进行运算:
&:按位与,两个位都为1,结果为1,否则为0
|:按位或,两个有一个为1,结果为1,否则为0
~:排位非,一个位如果为1,则变成0,否则反之
^:按位异或:两个相同则为0,不同则为1
<<:按位左移:整个(32位),向左移动一位,右边补0
>>:按位右移:整个(32位),向右移动一位,左边补相应的内容(正数补0,负数补1)
<?php
//计算机码:
$a=5;
$b=-5;
/*
5原码:00000101
-5原码:10000101
取反:11111010
求补:11111011
*/
//系统进行任何位运算的时候都是使用的补码
//运算结束之后都必须转换成原码才是最终要显示的数据
var_dump($a & $b);
/*
5:00000101
-5:11111011
&:00000001
*/
var_dump(~$b);
/*
-5:11111011
取反00000100
原码00000100
*/
?>
结果:
int(1)
int(4)
- 运算符优先级
- 控制分类
<?php
$a=1;
$b=5;
if($a>$b){
echo $a-1;
}elseif($a==$b){
echo $a;
}else{
echo $a+1;
}
?>
这里的elseif是这么写的
<?php
$a=1;
$b=5;
switch($a){
case $a>$b:
echo 'big';
break;
case $a==$b:
echo 'equal';
break;
default:
echo 'small';
break;
}
?>
结果:
smal
这里有个default,上面的条件都不满足时,就会执行default
<?php
for($a=0;$a<10;$a++){
echo $a," ";
}
echo "end:",$a;
?>
结果:
0 1 2 3 4 5 6 7 8 9 end:10
结果发现,for循环里的a在循环外也是可以调用的
<?php
for($a=0;$end=10,$a<$end;$a++){
echo $a," ";
}
echo "end:",$a;
?>
结果同上
只是这里可以多放一个变量的设定$end=10
for循环的无限循环
<?php
for(;;){
echo "hi ";
}
?>
可以在括号里一个条件都不放,但分号必须要有,这样就无限循环了
do while
<?php
$i=1;
do{
if($i%2!=1){
echo $i,"|";
}
$i++;
}while($i<=10)
?>
结果:
2|4|6|8|10|