变量
//注释
<?php
echo "Hello";
$var1;//定义变量
$var2=2;//定义并赋值
echo $var2;//如果输出未赋值的变量,会报Notice: Undefined variable(报的错是:未定义的变量)
//删除变量,其实就是置为NULL
unset($var1);
变量命名规则
- 必须以$开头
- 字母数字下划线组成,但是不能以数字开头
预定义变量
- $_GET:获取所有表单以get方式提交的数据
- $_POST:post方式提交的数据
- $_REQUSET:get和post方式提交的数据
- $GLOBALS:php中的所有全局变量
- $_SERVER:服务器信息
- $_SESSION:session会话数据
- $_COOKIE:cookie会话数据
- $_ENV:环境信息
- $_FILES:用户上传的文件信息
可变变量
<?php
$a='b';
$b='bb';
echo $$a;//bb
引用传递
$a=1;
$b=&$a;
$b=2;
echo $a,$b;//22
常量
定义常量
<?php
/**
* 定义常量两种方式
*/
define('a',1);
//5.3之后支持
const b=1;
echo a,b;//11
常量命名规则
- 常量不需要$符号,一旦使用,系统会认为为变量
- 字母数字下划线,数字不能开头
- 常量通过大写字母为主
- 常量命名规则比较松散,可以使用特殊字符,但是该方式只能使用define定义
常量两种定义方式区别
- 权限区别
- 常量通过不分区大小写,但是可以区分,可以参照define函数自三个参数,默认是false
<?php
define('a',2);
define('A',1);
echo a,A;//21
define('b',2);
define('B',1,true);
echo b,B;
/**
* 输出结果:
* 21
Notice: Constant b already defined in E:\WorkSpace\PHPStorm\day01\index.php on line 8
2
Notice: Use of undefined constant B - assumed 'B' in E:\WorkSpace\PHPStorm\day01\index.php on line 9
B
*/
特殊符号定义常量
<?php
define('--',3);
echo constant('--');//3
系统常量
- PHP_BERSION:PHP版本号
- PHP_INT_SIZE:整形大小(字节数)
- PHP_INT_MAX:整形能表示的最大值
- DIR:当前被执行的脚本所在电脑的绝对路径
- FILE:当前被执行的脚本所在电脑的绝对路径带自己文件的名字
- LINE:当前所属的行数
- NAMESPACE: 当前所属命名空间
- CLASS:当前所属的类
- METHOD:当前所属的方法
数据类型
基本数据类型
- 整形:int/interger 系统分配4个字节存储,表示整数类型.(默认是有符号类型)
- 浮点型:float(4字节)/double 分配8个字节,表示小数或整形存不下的数据
- 字符串: string 系统根据实际长度分配
- 布尔型:bool/boolean true/false
复合数据类型
- 对象类型:object 存放对象
- 数组类型:array 存储多个数据
特殊数据类型
- 资源类型:resource 存放资源数据(PHP外部数据,如数据库,文件)
- 空类型:NULL 只有一个值NULL
其他类型转布尔值的说明
字符串=》数值
- 以字母开头的字符串,永远为0
- 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
<?php
$a='1.2.3a';
echo (float)$a,(int)$a;//1.2 1
类型判断
<?php
$a='1.2.3a';
var_dump(is_string($a));//bool(true)
gettype
<?php
$a='1.2.3a';
echo gettype($a);//string
settype
<?php
$a='1.2.3a';
$b=settype($a,'int');
$c='32a';
$d=(int)$c;
echo $a,$b,$c,$d;//1132a32
settype和强制类型转换的不同
- 强转,是对数据值的赋值的内容进行处理,不会处理实际存储的内容
- settype会直接改变数据本身
整数类型转化
- Decbin():十进制转二级制
- Decoct():十进制转八进制
- Dechex():十进制转十六进制
- Bindec():二级制转十进制
<?php
var_dump(decbin(107));# string(7) "1101011"
浮点数
<?php
$f1=1.23;
$f2=1.23e10;
$f3=PHP_INT_MAX+1;
var_dump($f1,$f2,$f3);
#float(1.23)
#float(12300000000)
#float(2147483648)
为什么同样字节,浮点数表示范围大
Empty()和Isset()
- Empty(): 判断数据的值是否为空,不是null,如果为空返回true否则false(针对真实存储的数据)
- Isset(): 判断数据存储的变量本身是否存在,不管里面存储的是空字符串还是0等,变量存在就返回true(针对变量)
运算符
!==和===
连接字符串
- .: 将两个字符串连接到一起
- .=:将左边的内容和右边内容连接起来,并赋值给左边变量
错误抑制符
- @:在可能出错的表达式前面使用@
<?php
$f1=1.23;
@($f1/0);
遍历数组
<?php
$a=[1,2,3];
$b=array(1,2,3);
foreach ($a as $vlaue) {
echo $vlaue;
}
for ($i =0; $i < sizeof($a);$i++) {
echo $a[$i];
}
foreach($b as $k=>$v){
echo $k."=>".$v;
}
continue和break
- continue:结束本次循环进入下次循环
- break:结束循环
- continue 2:结束当前自己循环,同时外部循环如果还有循环体也一起结束,进入下次
- break 2:结束自己循环,同时外部也结束,如果还有外部不受影响
流程控制替代语法
if: if(): endif;
switch: switch(): endswitch();
文件包含
- 向上包含,类似java里面的import(先导入再使用)
-
向下包含,先定义再传递
include和require
include_once:只会导入一次
include:出现一次导入一次
require:和include区别只是在文件不存在的时候,
报错形式不一样(include只是警告,后面代码正常执行,require警告一次报错一次,后续代码不执行)
require_once:类似include_once
函数
<?php
//此时下面的&$name证明是引用传递,但是1是常量,会报错,可以定义$a=1然后传递$a即可
haha(1,20);
//默认值一般放在最后面
function haha(&$name,$num=1)
{
echo $num.' hello world'.$name;
}
作用域
<?php
//全局空间:最终会被系统纳入超全局空间(系统定义的全局变量的位置)变量中:$GLOBALS['global']=global area
$global='global area';
var_dump($GLOBALS['global']); //string(11) "global area"
function haha()
{
global $a;
$a='innner';
// echo $GLOBALS['global'];//通过这种方式使用,也可以通过传参
//echo $global;//报错
//或者使用下面方式,通过global定义变量都会放在$GLOBALS内部,如果全局存在则是使用,不存在则是定义,这样可以
//实现局部使用全局,全局使用局部,同理,都可以修改,但是实际上都是$GLOBALS的作用,但是一般不这么使用
global $global;
echo $global;
//但是这些作用域只针对变量,如果内部使用外部常量,则可以正常使用,前提是define定义的
}
haha();
echo $a; //inner
静态变量
<?php
function haha()
{
static $local='local';
$local.=$local;
echo $local,'<br/>';
}
haha();#locallocal
haha();#locallocallocallocal
可变函数
<?php
function haha()
{
echo 'a','<br/>';
}
$a='haha';//注意是字符串
$a();
匿名函数
<?php
$fun= function () {
echo "匿名函数";
};
$fun();
<?php
function test()
{
$name=__FUNCTION__;
$fun= function ()use ($name) {//use就是将外部变量(局部)保留给内部使用
echo $name; //test
};
$fun();
}
test();
伪类型
- Mixed:混合的,可以是多种php中的数据类型(例如手册上的传参类型很多种可以使用该类型)
- Number:数值的,可以是任意数值类型(整形和浮点型)
常用函数
输出函数
- print():类似于echo输出提供的内容,本质是一种结构(不是函数),返回1,可以不需要使用括号
- print_r():类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用比较多)
<?php
echo print('hello world<br/>');
print 'hello world<br/>';
$a='hello world<br/>';
print_r($a);
时间函数
- date():按照时间戳或者格式时间,如果没有参数是当作当前时间使用
- time():当前时间对应的时间戳(秒级别)
- microtime():获取微秒级别的时间
<?php
echo date('Y年m月d日H:i:s<br/>',12345678);
echo time(),'<br/>';
echo microtime();
数学函数
- max():参数最大值
- min():参数最小值
- rand():得到随机数,都是闭区间,需要参数
- mt_rand():与rand一样,只是底层结构不一样,效率更高
- round():四舍五入
- ceil():向上取整
- floor():向下取整
- pow():幂运算
- abs():绝对值
- sqrt():平方根
有关函数的函数
- function_exists():判断指定的函数名字是否在内存中存在
- func_get_arg():在自定义函数中获取指定数值对应的参数
- func_get_args():在自定义函数中获取所有的参数(数组)
- func_num_args():获取当前自定义函数的参数数量
<?php
function test($a, $b)
{
var_dump(func_get_arg((1)));
var_dump(func_get_args());
var_dump(func_num_args());
}
test(1,2,3);
/***
* int(2)
array(3) {
[0]=>
int(1)
[1]=>
int(2)
[2]=>
int(3)
}
int(3)
*/
字符串
单引号
在单引号中,任何特殊字符都会按原样输出【除\、\‘将会被转义输出】
从上面例子中我们可以明显看到,变量是没有被解析的;同时带反斜杠的转义字符仅仅只有单引号、反斜杠被转义输出了,其他的是直接输出。
双引号
在双引号中,遇到$将会解析该变量;
双引号中会转义反斜杠的转义字符;
?
<?php
$var = 'this is a var!';
echo "666$var 666、\'、\"、\\、\n、\r、\t、\$";
注意:变量和后面字符之间必须有空格,不然无法确定变量名称,或者使用{$var}666这样也行
由上面例子我们可以知道,双引号中的变量被解析了,替换成字符串;其他带反斜杠的转义字符都进行了相应的转义。
单双引号之间的区别
- 双引号会替换变量的值,而单引号会把它当做字符串输出。
- 对于转义的支持
- 性能速度问题,由于双引号中的字符串需要检测是否含有$符号修饰的变量,因此从理论上讲,单引号是比较快的。
heredoc与nowdoc
heredoc
heredoc可以理解为不使用双引号来定义字符串,但效果与使用双引号一致。【此时双引号相当于普通字符】
- 开始标记和结束标记使用相同的字符串,通常以大写字母来写。
- 开始标记后不能出现空格或多余的字符。
- 结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号 。
- 位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以。
<?php
$var = 'this is zq';
echo <<<EOD
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<title>"随风"</title>
</head>
<body>
66666666666<br/>
"666666666"<br/>
$var<br/>
\$var<br/>
\n666<br>
</body>
</html>
EOD;
此时双引号仅仅只是一个普通字符;其他的效果和双引号的字符串效果一致。
nowdoc
同理,nowdoc是不使用单引号来定义,但效果相当于使用单引号来定义的字符串。【此时单引号相当于普通字符】
<?php
$var = 'this is zq';
echo <<<EOD
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf8" />
<title>"随风"</title>
</head>
<body>
'02020'<br/>
\'<br/>
66666666666<br/>
"666666666"<br/>
$var<br/>
\$var<br/>
\n666<br>
</body>
</html>
EOD;
注意:
定界符之后必须不能有任何字符【特别是空格字符有时会没注意到】,否则将会出错。
如上例中的EOT后面有空格就会报这个错误:【 Parse error : syntax error, unexpected '<<' (T_SL)】
字符串长度问题
-
strlen():得到字符串的长度(字节为单位)
多字节字符串的长度问题:包含中文的长度(使用mbstring扩展)
注意首先打开php的mbstring扩展
<?php
$var = '中国abc';
echo mb_strlen($var,'utf-8'); #5
echo strlen($var); #9
字符串相关函数
数组
<?php
$arr1=array(1,2,'3',true);
$arr2=[1,2,'3',true];
//隐形数组,字符串等也可以做下标
$arr3[]=1;
//var_dump($arr3); #array(1) { [0]=> int(1) }
<?php
//特殊下标
$a1[false]=false;
$a2[true]=true;
$a3[NULL]=NULL;
var_dump($a1,$a2,$a3);
#array(1) { [0]=> bool(false) } array(1) { [1]=> bool(true) } array(1) { [""]=> NULL }
for遍历数组
<?php
//多维数组
$arr = array(
0=>array('name' => 'Jim', 'age' => 30),
1=>array('name' => 'Tom', 'age' => 20),
2=>array('name' => 'Jret', 'age' => 10)
);
//print_r($arr);
# Array ( [0] => Array ( [name] => Jim [age] => 30 ) [1] => Array ( [name] => Tom [age] => 20 ) [2] => Array ( [name] => Jret [age] => 10 ) )
foreach ($arr as $value) {
print_r($value);
echo $value['name'],$value['age'];
}
$arr1=[1,2,3,4,5,6,7,8];
//注意此处$i后是,这样提前把len定义出来,性能优化
for ($i = 0,$len=count($arr1);$i < $len; $i++) {
echo $arr1[$i];
}
while配个each和list遍历数组
0下标-》 取得元素的下标值
1下标-》 取得元素的值
key下标-》 取得元素的下标值
value下标-》 取得元素的值
<?php
$arr2=array(1,'name'=>'Tom',3,'age'=>30);
echo '<pre>';
print_r(each($arr2));
#List(变量1,变量2)=each(数组);是一种赋值运算,但是可以得到fasle(each取不到正确结果的时候),整个表达式为false
while ((list($key,$value)=each($arr2))){
echo $value;
}
输出:
Array
(
[1] => 1
[value] => 1
[0] => 0
[key] => 0
)
Tom330
数组相关函数
注意:next和prev会移动指针,有可能导致指针移动到最前或者最后(离开数组),导致next和prev不能 回到准确的指针位置