PHP - 部分笔记
系统常量
系统常量:系统帮助用户定义的常量,用户可以直接使用
常用的系统常量
- PHP_VERSION: PHP版本号
- PHP_INT_SIZE: 整型大小
- PHP_INT_MAX: 整型能表示的最大值
魔术常量
在PHP中有一些魔术常量,他们以双下划线开始+常量名+双下划线结束,魔术常量的值通常会跟着环境变化,但是用户改变不了
- __DIR__ 当前被执行的脚本所在电脑的绝对路径
- __FILE__ 当前被执行的脚本所在电脑的绝对路径(带自己文件的名字)
- __LINE__ 当前所属行
- __NAMESPACE__ 当前所属命名空间
- __CLASS__ 当前所属类
- __METHOD__ 当前所属方法
参数传递
按值传递参数
默认的,在传递参数的时候就是使用这种方式,对形参的操作不会影响到实际参数的值,传递参数的时候只把实参的值传给形参
<?php
function argsTest($a){
echo ++$a;
}
$i = 10;
argsTest($i); // 输出11
echo "<br/>".$i; // 输出10
// 表明形参改变不会影响到实参的值
?>
按引用传递
按引用传递参数,相当于形参和实参所指的的是用一个变量,指向内存用一个地址,形参改变了值,实参同时也会改变
<?php
function argsTest2(&$a){
echo ++$a;
}
$i = 10;
argsTest2($i); // 输出11
echo "<br/>".$i; // 同样输出11
// 按引用传递的时候,形参所指的变量与实参所指的是同一个
?>
可变长度参数列表
PHP提供的,可以直接使用
- func_get_args();
- func_get_arg();
- func_num_args();
这个三个函数可以使用在自定义函数内部,能够返回我们一些关于参数的信息
<?php
function test(){
var_dump(func_get_args()); // 返回一个传递的参数数组
/*
array(6) {
[0]=> int(999)
[1]=> int(888)
[2]=> int(777)
[3]=> int(123)
[4]=> string(6) "baigei"
[5]=> string(5) "Hello"
}
*/
var_dump(func_get_arg([INDEX])); // 传递一个下标,返回参数数组中该下标的值,超出范围报错
var_dump(func_num_args()); // 返回参数个数
}
test(999,888,777,123,"baigei","Hello");
?>
可变函数
可变函数(变量函数),可将函数名字加上单/双引号,直接赋给变量使用,变量名后面加一对圆括号,PHP将寻找与变量值同名的函数尝试执行。但不能用于例如:echo, print, unset(), empty(), include, require 以及类似语言结构,需要使用自己包装的函数。可变函数可以用来实现包括回调函数,函数表在内的一些用途
<?php
function test(){
echo "I'm function test!";
}
$a = 'test';
$a();
?>
内部(内置)函数
PHP 提供很多现成的函数或者结构,可以直接使用,echo(结构)、include()、include_once()、require()等等
常用的内置函数
需要再百度,太多太杂,有些可以根据函数名大概猜到是用来干什么的
数据类型
数据类型:data type ,在PHP中指的是存储的数据本身的类型,不是变量的类型,PHP时弱类型语言,变量本身没有数据类型
PHP的八种数据类型
三大类八小类
简单(基本)数据类型 :4个小类
- 整型:int/integer,系统分配4个字节存储,表示整型类型
- 浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数
- 字符串型:string,系统根据实际长度分配,表示字符串
- 布尔类型:bool/boolean, 表示布尔类型,只有两个值:true和false
复合类型:2个小类
- 对象类型:object,存放对象
- 数组类型:array,存放多个数据(一次性)
特殊数据类型:2个小类
- 资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)
- 空类型:
NULL
,只有一个值就是NULL
,不能运算
类型转换
PHP有两种类型转换方式:
- 自动转换:系统根据需求自己判定,自己转换(用的比较多,效率偏低)
- 强制(手动)转换:认为根据需要的目标类型转换
强制转换方法:
在需要转换的变量之前加一个()
,里面写上需要转换的类型,例如(int)$a
NULL
类型用到unset()
- 布尔
true
为1,false
为0 字符串转数值有自己的规则
- 以字母开头的字符串,永远为0
- 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
判断数据类型
通过一组类型判断函数,来判断变量类型;是一组以
is_
开头后面跟类型名字的函数
is_xxx(变量名)
,相同结果返回true
,失败返回false
Bool类型不能用echo
来查看,可以使用var_dump(变量名)
结构查看**
获取数据类型
还有一组函数可以用来获取以及设定变量的类型
Gettype(变量名)
:获取类型,得到该类型对应的字符串settype(变量名, 类型)
:设定数据类型:与强制转换不同- 强制转换变量名,是对数据值复制的内容进行处理(不会处理实际存储的内容)
settype()
会直接改变数据本身
整型类型
4个字节存储数据,最大就是32位,42亿多,但是在PHP中默认时有符号整型(区分正负数),就是要给一半给负数,正负数各占20多亿
PHP中提供了四种整型定义的方式:二进制、八进制、十进制、十六进
$a = 0b110; // 二进制
$a = 0120; // 八进制
$a = 120; // 十进制
$a = 0x120; //十六进制
默认PHP的输出的数值会自动转换成十进制输出
进制转换
Decbin() // 十进制转二进制
Decoct() // 十进制转八进制
Dechex() // 十进制转十六进制
BinDec() // 二进制转十进制
浮点型
所存储的整型,不保证精度,精度范围大概在15个有效数字左右
定义方式:
$f = 1.23
$f = 1.23e10 // 科学计数法,e表示以10为底
数组
创建数组
创建的时候不需要指定数组大小,可以在同一个数组存储任何类型数据
<?php
$student[0] = "Hi";
$student[1] = 10;
// 数组需要使用print_r 输出
print_r($student);
var_dump($student);
// 不指定数组下标,会从0开始,依次递增
$a[] = 10;
$a[] = "Hello";
?>
通过array
创建数组
<?php
$student = array(10, "Haaa", 1024.123);
var_dump($student);
// 通过array key=>value 结构创建数组
$a = array(
0=>10,
1=>"Haaa",
2=>1024.12
);
print_r($a);
// 也可以像Python的字典一样,创建关联数组,索引值是字符串
$b = array(
"name"=>"白给",
"age"=>10,
"money"=>0
);
var_dump($b);
?>
数组遍历
索引数组
<?php
$a = array(
0=>10,
1=>"Haaa",
2=>1024.12
);
echo count($a); // 返回数组里面数据的个数
// 如果使用count() 需要返回多维数组的数据个数, 再传一个参数
// count(array[,1])
$b = array(
array(1,2,3),
array(4,5,6)
);
echo count($b,1); // 输出6
// 第一种循环使用索引素组,使用for(不适用关联数组)
for($i=0; $i<count($a); $i++){
echo $a[$i];
}
?>
关联数组
<?php
// 关联数组遍历, foreach语句
/*foreach(数组变量 as 变量1){
// 循环体...
}
*/
$b = array(
"name"=>"白给",
"age"=>10,
"money"=>0
);
//var_dump($b);
foreach($b as $value){
echo $value."<br/>";
}
// 遍历同时获取索引值
foreach($b as $key=>$value){
echo $key."=".$value."<br/>";
}
?>
预定义超全局数组变量
预定义:已经定义好了的数组变量
超全局:超级全局变量,作用域是全局,任何地方都可以使用
- $GLOBALS
- $_SERVER
- $_GET
- $_POST
- $_FILES
- $_COOKIE
- $_SESSION
- $_REQUEST
- $_ENV
处理数组的函数
....
文件上传
上传上来的文件默认是放在一个临时的目录里面的,只需把里面的文件移到我们指定的目录
php.ini
配置文件
配置项 | 值 | 描述 |
---|---|---|
file_uploads | ON | 确定服务器上的PHP脚本是否可以接收HTTP文件上传 |
memory_limit | 8M | 设置脚本可以分配最大内存量,防止失控的脚本独占服务器内存 |
upload_max_filesize | 2M | 限制PHP处理上传文件的最大值,此值必须小于post_max_size值 |
post_max_size | 8M | 限制通过POST方法可以接收的信息最大量 |
upload_tmp_dir | F:/phpstudy/tmp | 上传文件存放的临时路径,可以是一个绝对路劲,这个目录对于拥有此服务器进程的用户必须是可写的 |
$_FILES
多维数组,存储上传文件信息
数组变量 | 说明 |
---|---|
$_FILES['file']['name'] | 客户端机器文件的原名称,包含扩展名 |
$_FILES['file']['size'] | 已上传文件的大小,单位为字节 |
$_FILES['file']['tmp_name'] | 文件上传之后,存在服务器临时目录的临时文件名 |
$_FILES['file']['error'] | 文件上传时产生的错误. 0: 表示没有发生任何错误,文件上传成功. 1: 表示上传文件大小超出PHP配置文件中upload_max_filesize所指的的值. 2: 表示上传文件大小超出了HTML表单中MAX_FILE_SIZE选项所指定的值. 3: 表示文件只被部分上传. 4: 没有上传任何文件 |
$_FILES['file']['type'] | 获取客户端上传文件的MIME类型,MIME类型规定各种文件格式的类型,每种MIME类型都是由/分割的主类型和子类型组成 |
<?php
var_dump($_FILES);
if(if_uploaded_file($_FILES['hh']['tmp_name'])){
$arr = pathinfo($_FILES['hh']['name']); // 取上传文件后缀
$newName = date('YmGis').rand(1000,9999);
echo $newName;
move_uploaded_file($_FILES['hh']['tmp_name'], 'uploads/'.$newName.$arr['extension']);
}
?>
<html>
<head>
<meta charset="utf-8">
<title>File Upload</title>
</head>
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="hh"/>
<input type="submit" name="submit" value="上传"/>
</form>
</html>
array(1) {
["hh"]=>
array(5) {
["name"]=>
string(2) "MT"
["type"]=>
string(24) "application/octet-stream"
["tmp_name"]=>
string(35) "D:\phpstudy_pro\WWW\tmp\php6B30.tmp"
["error"]=>
int(0)
["size"]=>
int(3351)
}
}
判断普通文件和目录
- is_file(string $filename) // 判断文件名是否为一个正常文件
- is_dir(string $filename) // 判断给定字符串是否为一个目录
文件属性
- file_exists() // 检查为文件或目录是否存在
- filesize() // 获取文件大小,以字节为单位
- is_readable() // 判断给定文件名是否可读
- is_writeable() // 判断给定文件名是否可写
- filectime() // 获取文件创建时间
- filetime() // 获取文件的修改时间
- fileatime() // 获取文件的上次访问时间
- stat() // 获取文件大部分属性值
目录基本函数
- basename()// 返回路径文件部分
- dirname() // 返回路径目录部分
pathinfo() // 返回文件路径信息
array(4) { ["dirname"]=> string(19) "D:\phpstudy_pro\WWW" ["basename"]=> string(5) "3.php" ["extension"]=> string(3) "php" ["filename"]=> string(1) "3" }
- opendir() // 打开目录句柄,相当于进入该目录,返回目录句柄
- readdir() // 从目录句柄读取条目,返回下一个文件的文件名
- revinddir() // 倒回目录句柄
- closedir() // 关闭目录句柄
- mkdir($dirname, 0777, true(递归创建)) // 新建目录
- rmdir() // 删除指定空目录
- scandir() // 列出指定路径中的文件和目录
文件基本操作
- fopen() // 打开文件或者URL
- fread() // 读取文件
- fgets() // 从文件指针读取一行
- feof() // 测试文件指针是否到文件结束位置
- fwrite() // 写入文件
- rewind() // 倒回文件指针位置
- flock() // 轻便的咨询文件锁定
- ftruncate() // 将文件截取到给定的长度
- fclose() // 关闭一个已打开的文件指针
- file() // 把整个文件读入一个数组中
- copy() // 拷贝文件
- unlink() // 删除文件
- file_get_contents() // 将整个文件读入一个字符串,返回一个字符串
- file_put_contents() // 将字符串写入文件中
- rename() // 重命名文件或文件夹
readfile() // 读入一个文件并写入到输出缓冲
<?php $f = fopen("./1.php", "a+"); // 返回一个文件指针 var_dump(fread($f, 1)); // 读取一个字节,中文需要读取3个字节 var_dump(fgets($f)); var_dump(fwirte($f, "Haaaaa")); readfile($f);
自操作运算符
++
:在原来的值+1
--
:在原来的值-1
前置或者后置,如果本身只有自操作,例如单单只有$a++
/--$a
,不参与其他运算时,结果是一样的,都是自增1。但如果自操作同时还参与别的运算,那么效果就不一样
前置自操作
先自增1,再把改变的值给别人
后置自操作
先把自己的值给别人,然后再自增1
$a = 1;
$b = 1;
echo $a, $b; // 输出 1 1
echo $a++, ++$b; // 输出 1, 2
echo $a, $b; // 输出 2, 2
计算机码
计算机在实际存储数据的时候,采用的编码规则时二进制
计算机码:原码、反码、补码。
数值本身最左边一位是用来充当符号位,正数为0,负数为1
- 原码:数据本身从十进制转换成二进制得到的结果
正数:左边符号位为0
负数:左边符号位为1
- 反码:针对负数,符号位不变,其他位取反
- 补码:针对负数,反码+1
正数的原码、反码、补码都一样,都是原码
系统中存在两个0:+0 和 -0
+0:00000000
- 0:10000000 // 原码
负数原码取反:11111111
负数反码+1:00000000
最终得出+0 和 -0 都是 00000000
位运算符
<<
:按位左移,整个位向左移动一位,右边补0
>>
:按位右移,整个位向右移动一位,左边补符号位对应内容(正数补0,负数补1)
* 系统进行任何位运算时都是使用补码,运算结束后都必须转换成原码才是最终要的结果
$a = 5;
$b = -5;
/*
5的原码: 00000101
-5的原码: 10000101
-5原码取反: 11111010 // 反码
-5反码+1: 11111011 // 补码
*/
// 按位右移
var_dump($b>>1); // 按位右移一位
var_dump($b>>2); // 按位右移两位
/*
-5 11111011
向右移动两位: 111110
负数移动两位,左边补两个1
>>2 11111110 // 补码
-1 11111101 // 反码
取反 10000010 // 原码,结果为-2
*/
按位左移:乘以2的操作
按位右移:除以2的操作(不完全正确)
正则表达式
描述了一类字符串的特征,通过这个特征配合一些函数,对其进行操作
由普通字符和元字符组成的字符串,普通字符(字母、数字之类的,符号需要反斜线转义);元字符,有特殊功能的字符比如
*
、+
、?
、.
等等。/re/
,/
为正则的定界符
除了数字、字母、反斜线以外的可以作为定界符,比如 #
、!
、{}
、|
,需要成对出现,前后一致
preg_match_all()
执行一个全局正则表达式,按指定的正则表达式,在给定的字符串中进行搜索,匹配符合特征的部分取出来
int preg_match_all(string $pattern, string $subject[, arrary $matches...])
<?php
$pattern = '/test/';
$str = 'abc';
var_dump(preg_match_all($pattern, $str, $arr));
// 把匹配到的部分放到$arr数组中
?>
表达式 | 说明 | |
---|---|---|
d | 匹配任意一个一位十进制数字,等价于[0-9] | |
D | 匹配任意一个除十进制数字以外的数字,等价于[^0-9] | |
s | 匹配任意一个空白字符,比如换页符、换行符、回车符、制表符、 垂直制表符 | |
S | 匹配除空白字符以外的任意一个字符 | |
w | 匹配任意一个数字或字母或下划线 | |
W | 匹配除数字、字母、下划线以外的任意一个字符 | |
. | 匹配除换行符以外的任意一个字符 | |
* | 匹配0次或1次或多次前面的字符 | |
+ | 匹配1次或者多次其前面的字符 | |
? | 匹配0次或者1次前面的字符 | |
{n} | 表示前面字符恰好出现n次 | |
{n,} | 表示前面字符出现不少于n次 | |
{n,m} | 表示前面字符至少出现n次,最多出现m次,就是在[n,m]这个范围 | |
^或A | 匹配字符串开始位置 | |
$或Z | 匹配字符串的结束位置 | |
\ | 匹配两个或多个模式 | |
[] | 匹配方括号中的任意一个字符 | |
[^] | 匹配除方括号中字符以外的任意一个字符 | |
() | 将括号中作为一个整体以便将其中的内容获取到 | |
\\m或者$m | 获取第m个圆括号扩起的内容 |
.*
配合使用默认是贪婪模式匹配,即尽可能长的去匹配,例如
<?php
$pattern = '/t.*t/'; // 贪婪模式
$str = 'abcsjdftsdfsdftsfstdftsdfsdf';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
/* 输出
int(1)
array(1) {
[0]=>
array(1) {
[0]=>
string(15) "tsdfsdftsftsdft"
}
}
*/
?>
解决贪婪模式需要在.*
后面加一个?
,懒惰匹配,例如
<?php
$pattern = '/t.*?t/'; // 非贪婪模式
$str = 'abcsjdftsdfsdftsfstdftsdfsdf';
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr);
/* 输出
int(2)
array(1) {
[0]=>
array(2) {
[0]=>
string(8) "tsdfsdft"
[1]=>
string(5) "tsdft"
}
}
*/
?>
模式修正符
修正符 | 说明 |
---|---|
i | 在和模式进行匹配时不区分大小写 |
m | 多行匹配,如果目标字符串中没有'n'字符,或者模式中没有出现^或$,设置这个修饰符不产生任何影响.使用条件:1. 目标字符串中必须含"\n", 2.正则表达式中必须出现^或者$. |
s | 如果设定了此修正符,那么将匹配所有的字符包括换行符 |
U | 禁止贪婪匹配,与? 作用相同 |
用法:在定界符后面添加修正符号,例如:/test/i
可以匹配字符中的大小写、大小写混合的test
字符串.
与正则表达式配合的函数
preg_match
preg_match()返回pattern的匹配次数,它的值是0次或1次,preg_match()在第一次匹配后就会停止搜索(匹配)
第四个参数可以传递PREG_OFFSET_CAPTURE
(值为0),得到匹配部分偏移值
<?php
$pattern = "/t(.*?)st/";
$str = " tdsfst tssfs tsdfst sttsestsfd";
var_dump(preg_match_all($pattern, $str, $arr));
var_dump($arr); // 匹配所有,返回一个数组,嵌套两个数组,第一个数组为匹配的值,第二个数组为第一个圆括号里面的值
echo '</hr>';
var_dump(preg_match ($pattern, $str, $arr));
var_dump($arr); // 只匹配一次
?>
/*输出
int(3)
array(2) {
[0]=>
array(3) {
[0]=>
string(6) "tdsfst"
[1]=>
string(13) "tssfs tsdfst"
[2]=>
string(6) "ttsest"
}
[1]=>
array(3) {
[0]=>
string(3) "dsf"
[1]=>
string(10) "ssfs tsdf"
[2]=>
string(3) "tse"
}
}
</br>int(1)
array(2) {
[0]=>
string(6) "tdsfst"
[1]=>
string(3) "dsf"
}
*/
preg_replace
正则替换
- 第一个参数: 正则表达式
- 第二个参数:要替换成的字符串
- 第三个参数:目标字符串
- 第四个参数(可选):默认是-1,替换所有符合的字符串(替换次数)
- 第五个参数(可选):放一个变量,存放替换的次数值
preg_replace 第一个参数和第二个参数可以传数组,一一对应的去替换
<?php
$pattern = "/<div>(.*?)<\/div>/";
$str = "asdf<div>哈喽!这是一个div.</div>dsfs";
var_dump(preg_match($pattern, $str, $arr));
$rep_str = "<a>这是一个a标签.</a>"; // 会把需要替换内容改变,相当于整个覆盖
$rep_str1 = "<a>$1</a>"; // 仅仅替换标签,中间内容保持不变,通过`\\1`或者`$1` 获取到正则表达式第一个圆括号括起的内容
var_dump(preg_replace($pattern, $rep_str, $str));
// 输出 int(1) string(35) "asdf<a>这是一个a标签.</a>dsfs"
var_dump(preg_replace($pattern, $rep_str1, $str));
// 输出 string(40) "asdf<a>哈喽!这是一个div.</a>dsfs"