系统常量

系统常量:系统帮助用户定义的常量,用户可以直接使用

常用的系统常量

  • 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的八种数据类型

三大类八小类

  1. 简单(基本)数据类型 :4个小类

    • 整型:int/integer,系统分配4个字节存储,表示整型类型
    • 浮点型:float/double,系统分配8个字节存储,表示小数或者整型存不下的整数
    • 字符串型:string,系统根据实际长度分配,表示字符串
    • 布尔类型:bool/boolean, 表示布尔类型,只有两个值:true和false
  2. 复合类型:2个小类

    • 对象类型:object,存放对象
    • 数组类型:array,存放多个数据(一次性)
  3. 特殊数据类型:2个小类

    • 资源类型:resource,存放资源数据(PHP外部数据,如数据库、文件)
    • 空类型:NULL,只有一个值就是NULL,不能运算

类型转换

PHP有两种类型转换方式:

  1. 自动转换:系统根据需求自己判定,自己转换(用的比较多,效率偏低)
  2. 强制(手动)转换:认为根据需要的目标类型转换

强制转换方法:

在需要转换的变量之前加一个(),里面写上需要转换的类型,例如(int)$a

NULL类型用到unset()

  • 布尔true为1,false为0
  • 字符串转数值有自己的规则

    • 以字母开头的字符串,永远为0
    • 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)

判断数据类型

通过一组类型判断函数,来判断变量类型;是一组以is_开头后面跟类型名字的函数

is_xxx(变量名),相同结果返回true,失败返回false

Bool类型不能用echo来查看,可以使用var_dump(变量名)结构查看**

获取数据类型

还有一组函数可以用来获取以及设定变量的类型

  • Gettype(变量名):获取类型,得到该类型对应的字符串
  • settype(变量名, 类型):设定数据类型:与强制转换不同

    1. 强制转换变量名,是对数据值复制的内容进行处理(不会处理实际存储的内容)
    2. 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_uploadsON确定服务器上的PHP脚本是否可以接收HTTP文件上传
memory_limit8M设置脚本可以分配最大内存量,防止失控的脚本独占服务器内存
upload_max_filesize2M限制PHP处理上传文件的最大值,此值必须小于post_max_size值
post_max_size8M限制通过POST方法可以接收的信息最大量
upload_tmp_dirF:/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"

标签: none

添加新评论