文章目录
PHP简介
什么是PHP
- 一种运行在服务器端的脚本/编程语言,可以嵌入到HTML中
- 该语言让Web开发人员快速书写动态生成的网页
PHP发展
- 创建者:Rasmus Lerdorf
- PHP前身:Personal Homepage,使用Perl语言开发的一种个人主页的语言
- PHP:PHP Hypertext Preprosessor,php超文本预处理器,底层使用C语言
- 平台支持:Windows,Linux,UNIX
- 数据库支持:Sqlserver,Mysql,Oracle,Access
PHP安装
- 官网下载地址:www.phpstudy.net
- 启动Apache
- 在WWW文件下新建一个
index.php
文件<?php phpinfo(); ?>
- 浏览器输入
localhost/index.php
查看配置信息
PHP语法
基础
- 标记:
<?php ?>
后面的?>
可以不写,会默认下面全都是PHP脚本 - 代码注释:
行注释://
,#
块注释:/**/
- 语句分隔符:
;
变量
$var1; //定义变量
$var2 = 1; //定义同时赋值
echo $var2; //输出变量
$var2 = 2; //修改变量
unset($var2); //删除变量,所占用的内存释放掉
命名规则:
- 必须以
$
符号开始 - 由字母数字下划线构成,不能以数字开头
- 允许中文变量(不建议)
预定义变量
- 提前定义的变量,系统定义的变量,存储许多需要用到的数据
- 预定义变量都是数组
$_GET // get方式提交的数据保存在此
$_POST // post方式提交的数据保存在此
$_REQUEST // get和post提交的都会保存
$_GLOBALS // PHP中所有的全局变量
$_SERVER // 服务器信息
$_SESSION // session会话数据
$_COOKIE // cookie会话数据
$_ENV // 环境信息
$_FILES // 用户上传的文件信息
可变变量
- 如果一个变量保存的值刚好是另外一个变量的名字,那么可以直接通过访问一个变量的到另外一个变量的值:在变量前面多加一个
$
符号
$a = 'b';
$b = 'bb';
echo $$a; // 输出的是bb
变量传值
$b = $a; // 值传递,a和b在数据段分两个内存地址存储
$a = &$b; // 引用传递,指向同一个内存地址
常量
两种定义方式
define('PI',3.14); // 使用函数定义常量
const PI = 3; // 使用const关键字定义
define('-_-','smile'); // 特殊常量的定义
const -_- = 'smile'; // 错误的定义方式
echo constant('-_-'); // 特殊常量的使用
- 常量不需要
$
符号 - 通常以大写字母为主
- 两种方式区别在于访问权限
系统常量
系统帮助用户定义的常量,用户可以直接使用
PHP_VERSION // PHP版本号
PHP_INT_SIZE // 整型大小
PHP_INT_MAX // 整型能表示的最大值,PHP里面的整型是带符号的
系统魔术常量
- 该常量的值会随着环境变化,但是用户改变不了
__DIR__ // 当前被执行的脚本所在电脑的绝对路径
__FILE__ // 当前被执行的脚本所在电脑的绝对路径(带自己文件的名字)
__LINE__ // 当前所属的行数
__NAMESPACE__ // 当前所属的命名空间
__CLASS_ // 当前所属的类
__METHOD__ // 当前所属的方法
数据类型
PHP是一种弱类型语言,变量本身没有数据类型
八种数据类型
三大类八小类:
- 基本数据类型
- 整型:默认有符号
$a = 123; // 十进制 $a = 0b110; // 二进制 $a = 0172; // 八进制 $a = 0xAF; // 十六进制 // 输出都会转换成十进制
- 浮点型:表示小数或者整型存不下的整数
浮点数保存的数据不够精确,尽量不用浮点数作精确判断 - 字符串:引号
- 布尔类型
- 整型:默认有符号
- 复合数据类型
- 对象类型
- 数组类型
- 特殊数据类型
- 资源类型:如数据库,文件
- 空类型:NULL,不能运算
类型转换
- 自动转换和强制转换,转
NULL
类型需要用到unset()
- 用的比较多的是转布尔类型(判断)和转数值类型(算术运算)
转布尔类型
规则:
true为1
,false为0
字符串转数值
- 以字母开头的字符串,永远为
0
- 以数字开头的字符串,取到碰到字符串为止(不会同时包含两个小数点)
类型判断
is_类型(变量名)
查看- 布尔类型不能用echo来查看,可以用
var_dump(变量1,变量2)
结构查看var_dump(is_int($a));
- 获取类型和设置类型
Gettype($a); // 获取类型,得到该类型对应的字符串 Settype($a,'int'); // 设置类型
Settype()
会直接改变数据本身
而强制转换是对数据值复制的内容进行处理,不会处理实际存储的内容
运算符
- 赋值运算符
- 算术运算符
- 比较运算符
==
:值相同===
:值和类型都要相同
- 逻辑运算符
逻辑与和逻辑或又称为短路运算 - 连接运算符
.
:将两个字符串连接到一起 - 错误抑制符
@
:在可能出错的表达式前面使用该符号 - 三目运算符
- 自操作运算符
文件包含
include
:系统碰到一次执行一次
include_once
:系统碰到多次只执行一次
require
:和include
本质都是包含文件,唯一的区别在于包含不到文件时,报错形式不同,include错误级别较轻,不会阻止代码执行
数组
定义
// 三种方式
$变量 = array{元素1,元素2};
$变量 = [元素1,元素2];
$变量[下标] = 值;
特点
- 可以使用整数下标或者字符串下标
如果所有下标都为整数:索引数组
如果所有下标都为字符串:关联数组 - 不同下标可以混合存在:混合数组
- 数组元素的顺序以放入顺序为准,跟下标无关
- 数字下标的自增长特性
从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值加一开始 - 特殊值下标的自动转换
布尔值:true和false变为1和0
NULL:空字符串 - PHP数组元素没有类型限制
- PHP中数组元素没有长度类型
- PHP中的数组是很大的数据,所以存储位置是堆区,为当前数组分配一块连续的内存
二维数组
$info = array(
array('name' => 'Alcie','age' => 30),
array('name' => 'Bob','age' => 28)
)
数组遍历
foreach
foreach($arr as $v){
echo $v,'<br/>';
}
foreach($arr as $k => $v){
echo 'key = ',$k,' value = ',$v,'<br/>';
}
for
- 获取数组长度:
count(数组)
- 要求数组元素的下标是规律的数字
for($i = 0,$len = count($arr); $i < $len; $i++){
echo 'key = ',$i,' value = ',$arr[$i],'<br/>';
}
语言结构
- 大多数是关键字,是PHP语法的组成部分
- 不可以被用户定义或者添加到语言扩展或者库中
- 大多数没有返回值
- 语言结构比函数快:在PHP中,函数都要先被PHP解析器(Zend引擎)分解成语言结构
- 尽量使用语言结构,避免使用函数
语言结构列表
echo()
:有无括号均可使用,能够输出一个以上字符串print()
:有无括号均可使用,只能输出一个字符串,并始终返回1die()
:输出一条消息,并退出当前脚本,是exit()
函数的别名isset()
:检测变量是否设置,并且不是 NULLunset()
:销毁指定的变量array()
list()
empty()
include()
require()
注意,include_once()是函数 ,require_once()是函数
判断是语言结构还是函数
check($name); //输出isset为语言结构
check($name); //输出array_push为函数
函数
定义
function 函数名(参数){
// 函数体
// 返回值
}
函数的调用特点:先编译后执行,只要在系统的内存中能够找到对应的函数,就可以执行(函数的调用可以在函数定义之前)
常见函数
var_dump()
:会返回变量的数据类型和值print_r()
:类似于var_dump,但是比var_dump简单,不会输出数据的类型,只会输出值(数组打印使用的比较多)eval()
:把字符串按照PHP代码来计算,该字符串必须是合法的 PHP 代码,且必须以分号结尾str_replace()
:以其他字符替换字符串中的一些字符(区分大小写)<?php // 把字符串 "Hello world!" 中的字符 "world" 替换为 "Shanghai" echo str_replace("world","Shanghai","Hello world!"); ?>
show_source()
:对文件进行语法高亮显示strstr()
:查找字符串的首次出现<?php $email = 'name@example.com'; $domain = strstr($email, '@'); echo $domain; // 打印 @example.com $user = strstr($email, '@', true); // 从 PHP 5.3.0 起 echo $user; // 打印 name ?>
伪协议
php伪协议,事实上是其支持的协议与封装协议
参数设置
在php.ini
里有两个重要的参数allow_url_fopen
和allow_url_include
- allow_url_fopen:默认值是ON,允许url里的封装协议访问文件
- allow_url_include:默认值是OFF,不允许包含url里的封装协议包含文件
常见用法
php://
- 访问各个输入/输出流(I/O streams)
- 用法:
php://input 将post请求的数据当作php代码执行 php://filter 读取源代码并进行base64编码输出,不然会直接当做php代码执行就看不到源代码内容了。
data://
- 主要用于数据流的读取。如果传入的数据是PHP代码,就会执行代码
- 用法:
data://text/plain;base64,xxxx(base64编码后的数据) data://text/plain,<?php system('ls'); ?>
file://
- 用于访问本地文件系统
- 当指定了一个相对路径时,提供的路径将基于当前的工作目录
- 用法
1. file://[文件的绝对路径和文件名] http://127.0.0.1/include.php?file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt 2. [文件的相对路径和文件名] http://127.0.0.1/include.php?file=./phpinfo.txt
zip:// & bzip2:// & zlib://
- 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:
jpg
、png
、gif
、xxx
等等 - 用法:
1. zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23) 实例,压缩 phpinfo.txt 为 phpinfo.zip ,压缩包重命名为 phpinfo.jpg ,并上传: http://127.0.0.1/include.php?file=zip://E:\phpStudy\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt 2. compress.bzip2://file.bz2 3. compress.zlib://file.gz
phar://
phar://
协议与zip://
类似,同样可以访问zip格式压缩包内容- 用法:(与zip的区别是
#
和/
)http://127.0.0.1/include.php?file=phar://E:/phpStudy/PHPTutorial/WWW/phpinfo.zip/phpinfo.txt
http:// & https://
- 常规 URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源。CTF中通常用于远程包含。