PHP基础

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);  //删除变量,所占用的内存释放掉

命名规则:

  1. 必须以$符号开始
  2. 由字母数字下划线构成,不能以数字开头
  3. 允许中文变量(不建议)

预定义变量

  • 提前定义的变量,系统定义的变量,存储许多需要用到的数据
  • 预定义变量都是数组
$_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是一种弱类型语言,变量本身没有数据类型

八种数据类型

三大类八小类:

  1. 基本数据类型
    1. 整型:默认有符号
      $a = 123;  // 十进制
      $a = 0b110;  // 二进制
      $a = 0172;  // 八进制
      $a = 0xAF;  // 十六进制
      // 输出都会转换成十进制
      
    2. 浮点型:表示小数或者整型存不下的整数
      浮点数保存的数据不够精确,尽量不用浮点数作精确判断
    3. 字符串:引号
    4. 布尔类型
  2. 复合数据类型
    1. 对象类型
    2. 数组类型
  3. 特殊数据类型
    1. 资源类型:如数据库,文件
    2. 空类型:NULL,不能运算

类型转换

  • 自动转换和强制转换,转NULL类型需要用到unset()
  • 用的比较多的是转布尔类型(判断)和转数值类型(算术运算)
转布尔类型

在这里插入图片描述
规则:
true为1,false为0

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

类型判断

  • 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];
$变量[下标] =;

特点

  1. 可以使用整数下标或者字符串下标
    如果所有下标都为整数:索引数组
    如果所有下标都为字符串:关联数组
  2. 不同下标可以混合存在:混合数组
  3. 数组元素的顺序以放入顺序为准,跟下标无关
  4. 数字下标的自增长特性
    从0开始自动增长,如果中间手动出现较大的,那么后面的自增长元素从最大的值加一开始
  5. 特殊值下标的自动转换
    布尔值:true和false变为1和0
    NULL:空字符串
  6. PHP数组元素没有类型限制
  7. PHP中数组元素没有长度类型
  8. 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
  1. 获取数组长度:count(数组)
  2. 要求数组元素的下标是规律的数字
for($i = 0,$len = count($arr); $i < $len; $i++){
	echo 'key = ',$i,' value = ',$arr[$i],'<br/>';
}

语言结构

  • 大多数是关键字,是PHP语法的组成部分
  • 不可以被用户定义或者添加到语言扩展或者库中
  • 大多数没有返回值
  • 语言结构比函数快:在PHP中,函数都要先被PHP解析器(Zend引擎)分解成语言结构
  • 尽量使用语言结构,避免使用函数

语言结构列表

  • echo():有无括号均可使用,能够输出一个以上字符串
  • print():有无括号均可使用,只能输出一个字符串,并始终返回1
  • die():输出一条消息,并退出当前脚本,是exit()函数的别名
  • isset():检测变量是否设置,并且不是 NULL
  • unset():销毁指定的变量
  • 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_fopenallow_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://

  • 均属于压缩流,可以访问压缩文件中的子文件,更重要的是不需要指定后缀名,可修改为任意后缀:jpgpnggifxxx 等等
  • 用法:
    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中通常用于远程包含。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值