2.3php学习https://www.runoob.com/php/php-variables.html2.3.1. php语法2.3.1.1. 基础语法PHP 脚本以?php开始以?结束?php ?PHP 文件的默认文件扩展名是.phpPHP 文件通常包含 HTML 标签和一些 PHP 脚本代码每条语句末尾要加;有两种在浏览器输出文本的基础指令echo和print【注意区分后面细说】2.3.1.2. 注释用途推荐注释形式示例简单说明一行代码//或#// 输出信息说明一段代码块/* ... */用于逻辑分块的注释函数/类文档说明/** ... */DocBlock用于描述参数、返回值、用途等2.3.2. php变量变量是用于存储数据的容器2.3.2.1.1.1. PHP 变量规则变量以$符号开始后面跟着变量的名称变量名必须以字母或者下划线字符开始变量名只能包含字母、数字以及下划线A-z、0-9 和 _ 变量名不能包含空格变量名是区分大小写的$y 和 $Y 是两个不同的变量2.3.2.1. 创建声明变量变量在您第一次赋值给它的时候被创建PHP 会根据变量的值自动把变量转换为正确的数据类型【因为是弱类型】?php $txtHello world!; $x5; $y10.5; ?当您赋一个文本值给变量时请在文本值两侧加上引号2.3.2.2. 变量作用域变量的作用域是脚本中变量可被引用/使用的部分PHP 有四种不同的变量作用域localglobalstaticparameter概念PHP中的核心含义作用域local局部变量在函数/类方法内部声明的变量仅当前函数/方法内部可访问外部无法读取或修改global全局变量在函数外部声明的变量或在函数内用global关键字修饰的变量- 直接声明在函数外默认整个脚本全局可访问br- 在函数内用global修饰可以引入函数外的同名全局变量到函数作用域内static静态变量在函数/类内部用static关键字修饰的变量和局部变量一致仅函数/类内部可访问parameter参数变量函数定义时声明的输入参数本质也是局部变量仅当前函数内部可访问补充【注意全局与局部】【局部变量只作用于该函数内】【如果要在一个函数中访问一个全局变量需要使用 global 关键字】2.3.2.2.1. PHP global 关键字在函数内调用函数外定义的全局变量我们需要在函数中的变量前加上 global 关键字2.3.2.2.2. Static 作用域当一个函数完成时它的所有变量通常都会被删除。然而有时候您希望某个局部变量不要被删除。要做到这一点请在您第一次声明变量时使用static关键字2.3.2.2.2.1. 栗子举一个普通局部变量和静态变量的对比1. 普通局部变量function countVisitor(){ $num 0; // 普通局部变量 $num $num 1; echo 当前计数.$num.br; } // 连续调用3次 countVisitor(); countVisitor(); countVisitor();输出结果当前计数1 当前计数1 当前计数1为什么每次都是1因为普通局部变量$num每次调用函数都会重新创建、重新赋值为0函数运行完就销毁根本不会保留上次的结果2. 静态变量点出核心区别把代码改成staticfunction countVisitor(){ static $num 0; // 静态变量 $num $num 1; echo 当前计数.$num.br; } // 同样连续调用3次 countVisitor(); countVisitor(); countVisitor();输出结果当前计数1 当前计数2 当前计数3这就是静态变量的核心特点只初始化一次值会一直保留整个脚本运行周期都不会销毁下次调用会沿用上次修改后的值。而且它还是局部变量只有这个函数内部能访问它外部改不了它既保留了数据又不会污染全局非常适合做计数这类场景。2.3.2.3. 参数作用域【专门用来接收函数输入的局部变量】参数是通过调用代码将值传递给函数的局部变量。参数是在参数列表中声明的作为函数声明的一部分外部不可访问、用完销毁接收外部输入【前俩者局部变量也是】2.3.3. PHP 5 echo 和 print 语句2.3.3.1. echo 和 print 区别:对比维度echoprint返回值无返回值总是固定返回整数1参数数量支持多个参数用逗号分隔仅支持1个参数执行性能略快不需要处理返回值稍慢表达式中使用不可以可以因为有返回值2.3.3.2. 栗子参数数量差异// echo支持多参数输出 echo Hello, , World, !; // 正常输出Hello World! // print只能传一个参数这么写会报错 // print Hello, World; // 语法错误 print Hello World!; // 正确写法返回值和表达式用法差异因为print固定返回1所以可以把它放在条件判断这类表达式里// 这种写法是合法的print输出内容后返回1条件恒成立 if (print 检查输出) { echo 会执行这里; } // echo就不能这么用语法直接报错2.3.4. php数据类型PHP 支持以下几种数据类型:String字符串Integer整型Float浮点型Boolean布尔型Array数组Object对象NULL空值Resource资源类型2.3.4.1. php字符串一个字符串是一串字符的序列就像 Hello world!。你可以将任何文本放在单引号和双引号中?php $x Hello world!; echo $x; echo br; $x Hello world!; echo $x; ?2.3.4.2. PHP 整型整数是一个没有小数的数字。整数规则:整数必须至少有一个数字 (0-9)整数不能包含逗号或空格整数是没有小数点的整数可以是正数或负数整型可以用三种格式来指定十进制 十六进制 以 0x 为前缀或八进制前缀为 0。【var_dump是输出这个变量的信息如数值和数据类型】2.3.4.3. PHP 浮点型浮点数是带小数部分的数字或是指数形式。2.3.4.4. PHP 布尔型布尔型可以是TRUE或FALSE布尔型通常用于条件判断。$xtrue;$yfalse;2.3.4.5. PHP 数组数组可以在一个变量中存储多个值。?php $carsarray(Volvo,BMW,Toyota); var_dump($cars); ?结果会具体写出长度5类型string,数值“volvo”2.3.4.6. PHP 对象对象数据类型也可以用于存储数据。在 PHP 中对象必须声明。首先你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。然后我们在类中定义数据类型然后在实例化的类中使用数据类型?php class Car { var $color; function __construct($colorgreen) { $this-color $color; } function what_color() { return $this-color; } } ?以上实例中PHP关键字this就是指向当前对象实例的指针不指向任何其他对象或类。2.3.4.7. PHP NULL 值NULL 值表示变量没有值。NULL 是数据类型为 NULL 的值。NULL 值指明一个变量是否为空值。 同样可用于数据空值和NULL值的区别。可以通过设置变量值为 NULL 来清空变量数据?php $xHello world!; $xnull; var_dump($x); ?2.3.4.8. PHP 资源类型PHP 资源resource是一种特殊变量保存了到外部资源的一个引用。常见资源数据类型有打开文件、数据库连接、图形画布区域等。由于资源类型变量保存有为打开文件、数据库连接、图形画布区域等的特殊句柄因此将其它类型的值转换为资源没有意义。使用get_resource_type()函数可以返回资源resource类型get_resource_type(resource $handle): string2.3.5. PHP 类型比较虽然 PHP 是弱类型语言但也需要明白变量类型及它们的意义因为我们经常需要对 PHP 变量进行比较包含松散和严格比较。松散比较使用两个等号比较只比较值不比较类型。严格比较用三个等号比较除了比较值也比较类型。2.3.5.1. 栗子?php if(42 42) { echo 1、值相等; } echo PHP_EOL; // 换行符 if(42 42) { echo 2、类型相等; } else { echo 3、类型不相等; } ?结果1、值相等3、类型不相等2.3.5.2. PHP中 比较 0、false、null?php echo 0 false: ; var_dump(0 false); echo 0 false: ; var_dump(0 false); echo PHP_EOL; echo 0 null: ; var_dump(0 null); echo 0 null: ; var_dump(0 null); echo PHP_EOL; echo false null: ; var_dump(false null); echo false null: ; var_dump(false null); echo PHP_EOL; echo 0 false: ; var_dump(0 false); echo 0 false: ; var_dump(0 false); echo PHP_EOL; echo 0 null: ; var_dump(0 null); echo 0 null: ; var_dump(0 null); echo PHP_EOL; echo false: ; var_dump( false); echo false: ; var_dump( false); echo PHP_EOL; echo null: ; var_dump( null); echo null: ; var_dump( null);结果0 false: bool(true) 0 false: bool(false) 0 null: bool(true) 0 null: bool(false) false null: bool(true) false null: bool(false) 0 false: bool(true) 0 false: bool(false) 0 null: bool(false) 0 null: bool(false) false: bool(true) false: bool(false) null: bool(true) null: bool(false)2.3.5.3. 一些些2.3.6. php常量PHP 中的常量是指一旦定义后其值不能被改变的标识符。常量值被定义后在脚本的其他任何地方都不能被改变。常量可以用define()函数或const关键字来定义。全局作用域: 常量在定义后可以在整个脚本的任何地方使用无需使用global关键字。【在函数内调用函数外定义的全局变量我们需要在函数中的变量前加上 global 关键字】一个常量由英文字母、下划线、和数字组成但数字不能作为首字母出现。 (常量名不需要加 $ 修饰符)。2.3.6.1. 设置 PHP 常量【define】设置常量使用define()函数函数语法如下bool define ( string $name , mixed $value [, bool $case_insensitive false ] )该函数有三个参数:name必选参数常量名称即标志符。value必选参数常量的值。case_insensitive可选参数如果设置为TRUE该常量则大小写不敏感默认是大小写敏感的。栗子?php // 区分大小写的常量名 define(GREETING, 欢迎访问 Runoob.com); echo GREETING; // 输出 欢迎访问 Runoob.com echo br; echo greeting; // 输出 greeting但是有警告信息表示该常量未定义 ?2.3.6.2. 设置PHP常量【const】const CONSTANT_NAME value;以下是一个使用 const 关键字定义常量的实例const SITE_URL https://www.runoob.com; echo SITE_URL; // 输出 https://www.runoob.com2.3.6.3. 预定义常量PHP 提供了一些预定义常量可以在脚本中直接使用。这些常量通常用于获取 PHP 的配置信息、版本信息等。常见的预定义常量有PHP_VERSION当前 PHP 解析器的版本。PHP_OS服务器的操作系统。PHP_INT_MAX最大的整数值。E_ERROR、E_WARNING、E_PARSE等错误报告级别。【直接echo就行了echoPHP_VERSION;// 输出 PHP 版本例如 7.4.1】2.3.6.4. 常量数组define是用的“#”[]; const是用的 #[,];2.4. php继续学习PHP 变量 | 菜鸟教程2.4.1. php if-else2.4.2. lfelse语句2.4.2.1. 条件语句if 语句- 在条件成立时执行代码if...else 语句- 在条件成立时执行一块代码条件不成立时执行另一块代码if...elseif....else 语句- 在若干条件之一成立时执行一个代码块switch 语句- 在若干条件之一成立时执行一个代码块2.4.2.2. 其实c语言里面已经讲过简单带过2.4.3. php switch语句?php switch (expression) { case value1: // 代码块1 break; case value2: // 代码块2 break; // 更多的 case 语句 default: // 如果没有匹配的值 } ?expression是要被比较的表达式。case value:是可能的值如果expression的值等于某个case的值就执行相应的代码块。break;用于终止switch语句防止继续执行下一个case。default:是可选的用于指定当没有匹配的case时执行的代码块。2.4.3.1.1. 栗子?php $favcolorred; switch ($favcolor) { case red: echo 你喜欢的颜色是红色!; break; case blue: echo 你喜欢的颜色是蓝色!; break; case green: echo 你喜欢的颜色是绿色!; break; default: echo 你喜欢的颜色不是 红, 蓝, 或绿色!; } ?2.4.4. php 数组数组是一个能在单个变量中存储多个值的特殊变量。数值数组- 带有数字 ID 键的数组关联数组- 带有指定的键的数组每个键关联一个值多维数组- 包含一个或多个数组的数组2.4.4.1. 数值数组自动从0开始计数可以更加便捷地去表示这个位置内容数据2.4.4.1.1. 获取长度count$cars2.4.4.1.2. 遍历使用For循环2.4.4.2. 关联数组指代2.4.4.2.1. 遍历数组2.4.4.2.1.1. 补充【使用函数foreach】// 格式1只获取元素值不需要键名 foreach (要遍历的数组 as $当前元素值) { // 循环体逻辑 } // 格式2同时获取元素的键和值 foreach (要遍历的数组 as $当前键名 $当前元素值) { // 循环体逻辑 }栗子$userInfo [ username admin, role root, id 1 ]; foreach ($userInfo as $key $value) { echo {$key}{$value}br; } // 输出 // usernameadmin // roleroot // id1$userInfo [ username admin, role root, id 1 ]; // 只拿值不拿键 foreach ($userInfo as $value) { echo {$value}br; } // 输出 // admin // root // 1 foreach ($userInfo as $key $value) { echo {$key}br; } //输出 // username // role // id2.4.5. php数组排序sort()- 对数组进行升序排列rsort()- 对数组进行降序排列asort()- 根据关联数组的值对数组进行升序排列ksort()- 根据关联数组的键对数组进行升序排列arsort()- 根据关联数组的值对数组进行降序排列krsort()- 根据关联数组的键对数组进行降序排列2.4.5.1. sort(),rsort()[0]2,,,[1]42.4.5.2. asort(),arsort(),ksort(),krsort()a:是值后面那个 #k:是键前面那个 # 2.4.6. PHP 表单 - 验证邮件和URL2.4.6.1.1. preg_match — 进行正则表达式匹配int preg_match ( string $pattern , string $subject [, array $matches [, int $flags ]] )参数作用说明$pattern正则规则必填必须是完整的正则表达式需要用分隔符包裹常用/例如/test/i$subject目标字符串必填要匹配的原始字符串$matches匹配结果可选存储匹配到的结果$matches[0]是整个正则匹配到的内容$matches[1]是第一个分组的结果以此类推$flags标记位可选用来修改匹配行为常用值PREG_OFFSET_CAPTURE会同时返回匹配结果在字符串中的偏移位置匹配成功输出1,对应内容若!preg_match($pattern, $username)则是不符合不匹配时进行的操作符号含义作用/正则定界符PHP正则必须用分隔符把规则包起来常用/只是语法要求本身不匹配内容^匹配开头代表必须从字符串的第一个字符就开始符合规则不能在开头插入其他内容\d匹配数字和[0-9]一个意思代表只能匹配0~9的阿拉伯数字量词代表前面的\d至少出现1次不允许空字符串$匹配结尾代表必须匹配到字符串的最后一个字符不能在结尾留其他非数字内容2.4.6.1.1.1. 例子1获取URL中的参数值CTF代码审计常考提取URL路径中/flag_xxxxxx格式的flag编号$url /api/flag_1a2b3c4d/get.php; // 正则匹配flag_后面的任意字符 $pattern /flag_([a-zA-Z0-9])/; preg_match($pattern, $url, $matches); echo 匹配到的flagflag_ . $matches[1]; // 输出匹配到的flagflag_1a2b3c4d2.4.6.1.1.2. 例子2用户名正则校验绕过场景场景要求用户名只能是字母不能包含特殊字符且必须以字母开头$username admin123; // 正则规则开头到结尾只能是字母 $pattern /^[a-zA-Z]$/; if (!preg_match($pattern, $username)) { echo 用户名不合法不能包含数字;//匹配不成功 } else { echo 用户名合法; } // 这里$username是admin123输出用户名不合法不能包含数字对应PHP 5.2下的绕过例子如果正则要求必须只包含字母但我们想插入攻击代码可以用空字节截断绕过// 插入了\0%00截断后面的攻击代码不会被检查 $username admin\0?php eval($_GET[cmd]);?; $pattern /^[$/; if (!preg_match($pattern, $username)) { echo 用户名不合法; } else { echo 用户名合法; } // 在PHP 5.2中会输出用户名合法成功绕过正则检测2.4.6.1.1.3. 例子3WAF绕过数组绕过a-zA-Z]场景WAF用preg_match检测POST参数中是否有eval等危险关键词// 服务端检测逻辑 if (preg_match(/eval|union|select/i, $_POST[content])) { die(检测到恶意内容已拦截);//匹配成功 } echo 请求通过; // 绕过方法把content传成数组而不是字符串 // content[0]test此时preg_match匹配数组会直接返回falseWAF拦截不生效 // 最终会输出请求通过绕过成功这也是你做Web渗透测试时非常实用的绕过技巧。2.4.6.1. 验证 URL邮箱名称?php // 定义变量并默认设置为空值 $nameErr $emailErr $genderErr $websiteErr ; $name $email $gender $comment $website ; if ($_SERVER[REQUEST_METHOD] POST) { if (empty($_POST[name])) { $nameErr Name is required; } else { $name test_input($_POST[name]); // 检测名字是否只包含字母跟空格 if (!preg_match(/^[a-zA-Z ]*$/,$name)) { $nameErr 只允许字母和空格; } } if (empty($_POST[email])) { $emailErr Email is required; } else { $email test_input($_POST[email]); // 检测邮箱是否合法 if (!preg_match(/([\w\-]\[\w\-]\.[\w\-])/,$email)) { $emailErr 非法邮箱格式; } } if (empty($_POST[website])) { $website ; } else { $website test_input($_POST[website]); // 检测 URL 地址是否合法 if (!preg_match(/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9#\/%?~_|!:,.;]*[-a-z0-9#\/%~_|]/i,$website)) { $websiteErr 非法的 URL 的地址; } } if (empty($_POST[comment])) { $comment ; } else { $comment test_input($_POST[comment]); } if (empty($_POST[gender])) { $genderErr 性别是必需的; } else { $gender test_input($_POST[gender]); } } ?2.4.7. php 时间string date ( string $format [, int $timestamp ] )参数描述format必需。规定时间戳的格式。timestamp可选。规定时间戳。默认是当前的日期和时间。date() 函数的第一个必需参数format规定了如何格式化日期/时间。format字符说明返回值例子日------d月份中的第几天有前导零的 2 位数字01到31D星期中的第几天文本表示3 个字母Mon到Sunj月份中的第几天没有前导零1到31lL的小写字母星期几完整的文本格式Sunday到SaturdayNISO-8601 格式数字表示的星期中的第几天PHP 5.1.0 新加1表示星期一到7表示星期天S每月天数后面的英文后缀2 个字符stndrd或者th。可以和j一起用w星期中的第几天数字表示0表示星期天到6表示星期六z年份中的第几天0到365星期------WISO-8601 格式年份中的第几周每周从星期一开始PHP 4.1.0 新加的例如42当年的第 42 周月------F月份完整的文本格式例如 January 或者 MarchJanuary到Decemberm数字表示的月份有前导零01到12M三个字母缩写表示的月份Jan到Decn数字表示的月份没有前导零1到12t给定月份所应有的天数28到31年------L是否为闰年如果是闰年为1否则为0oISO-8601 格式年份数字。这和Y的值相同只除了如果 ISO 的星期数W属于前一年或下一年则用那一年。PHP 5.1.0 新加Examples:1999or2003Y4 位数字完整表示的年份例如1999或2003y2 位数字表示的年份例如99或03时间------a小写的上午和下午值am或pmA大写的上午和下午值AM或PMBSwatch Internet 标准时000到999g小时12 小时格式没有前导零1到12G小时24 小时格式没有前导零0到23h小时12 小时格式有前导零01到12H小时24 小时格式有前导零00到23i有前导零的分钟数00到59s秒数有前导零00到59u毫秒 PHP 5.2.2 新加。需要注意的是date()函数总是返回000000因为它只接受 integer 参数 而 DateTime::format() 才支持毫秒。示例:654321时区------e时区标识PHP 5.1.0 新加例如UTCGMTAtlantic/AzoresI是否为夏令时如果是夏令时为1否则为0O与格林威治时间相差的小时数例如0200P与格林威治时间GMT的差别小时和分钟之间有冒号分隔PHP 5.1.3 新加例如02:00T本机所在的时区例如ESTMDT【译者注】在 Windows 下为完整文本格式例如Eastern Standard Time中文版会显示中国标准时间。Z时差偏移量的秒数。UTC 西边的时区偏移量总是负的UTC 东边的时区偏移量总是正的。-43200到43200完整的日期时间------cISO 8601 格式的日期PHP 5 新加2004-02-12T15:19:2100:00rRFC 822 格式的日期例如Thu, 21 Dec 2000 16:01:07 0200U从 Unix 纪元January 1 1970 00:00:00 GMT开始至今的秒数参见 time()2.4.8. php过滤器2.1.8.1. 过滤器是什么PHP 过滤器用于验证和过滤来自非安全来源的数据。测试、验证和过滤用户输入或自定义数据是任何 Web 应用程序的重要组成部分。PHP 的过滤器扩展的设计目的是使数据过滤更轻松快捷。2.4.8.2. 函数和过滤器filter_var()- 通过一个指定的过滤器来过滤单一的变量filter_var_array()- 通过相同的或不同的过滤器来过滤多个变量filter_input- 获取一个输入变量并对它进行过滤filter_input_array- 获取多个输入变量并通过相同的或不同的过滤器对它们进行过滤2.4.8.2.1. 栗子FILTER_VALIDATE_INT验证是否是整数验证数字参数最常用// 验证id是否是整数 $id $_GET[id]; if(filter_var($id, FILTER_VALIDATE_INT)){ echo 合法参数; }FILTER_SANITIZE_STRING过滤字符串去除标签和特殊字符用来防止XSSFILTER_VALIDATE_URL验证URL格式代码题中经常用来考URL绕过【FILTER_VALIDATE_URL要求必须有http://协议头我们可以通过在URL中嵌入来绕过host验证例如http://example.com127.0.0.1会被误认为访问example.com实际解析的是127.0.0.1可以触发SSRF绕过。】FILTER_VALIDATE_IP验证IP地址格式2.4.8.3. Validating 和 Sanitizing有两种过滤器Validating 过滤器用于验证用户输入严格的格式规则比如 URL 或 E-Mail 验证如果成功则返回预期的类型如果失败则返回 FALSESanitizing 过滤器用于允许或禁止字符串中指定的字符无数据格式规则始终返回字符串验证输入第一段FILTER_VALIDATE_EMAIL属于验证类过滤器只做格式验证返回结果是true合法 或false非法不会修改你的原始输入。第二段FILTER_SANITIZE_URL属于净化类过滤器会直接修改输入内容自动删除URL中不允许的特殊字符比如空格、非ASCII字符、#、这些符号返回处理后的干净字符串。2.4.8.4. 验证输入?php if(!filter_has_var(INPUT_GET, email)) { echo(没有 email 参数); } else { if (!filter_input(INPUT_GET, email, FILTER_VALIDATE_EMAIL)) { echo 不是一个合法的 E-Mail; } else { echo 是一个合法的 E-Mail; } } ?上面的实例有一个通过 GET 方法传送的输入变量 (email)检测是否存在 GET 类型的 email 输入变量如果存在输入变量检测它是否是有效的 e-mail 地址2.4.8.5. 净化输入?php if(!filter_has_var(INPUT_GET, url)) { echo(没有 url 参数); } else { $url filter_input(INPUT_GET, url, FILTER_SANITIZE_URL); echo $url; } ?上面的实例有一个通过 GET 方法传送的输入变量 (url)检测是否存在 GET 类型的 url 输入变量如果存在此输入变量对其进行净化删除非法字符并将其存储在 $url 变量中2.4.8.6. 过滤多个输入?php $filters array ( // name字段使用FILTER_SANITIZE_STRING净化 name array ( filterFILTER_SANITIZE_STRING ), // age字段验证是否是整数同时限制范围1-120 age array ( filterFILTER_VALIDATE_INT, optionsarray ( min_range1, max_range120 ) ), // email字段直接验证邮箱格式 email FILTER_VALIDATE_EMAIL ); $result filter_input_array(INPUT_GET, $filters); //一次性从INPUT_GET也就是URL参数中获取三个参数 //按照上面定义的规则分别过滤结果会按字段名存回到$result数组中。 if (!$result[age]) { echo(年龄必须在 1 到 120 之间。br); } elseif(!$result[email]) { echo(E-Mail 不合法br); } else { echo(输入正确); } ?filter_input_array()函数的第二个参数可以是数组或单一过滤器的 ID。如果该参数是单一过滤器的 ID那么这个指定的过滤器会过滤输入数组中所有的值。如果该参数是一个数组那么此数组必须遵循下面的规则必须是一个关联数组其中包含的输入变量是数组的键比如 age 输入变量此数组的值必须是过滤器的 ID 或者是规定了过滤器、标志和选项的数组2.4.8.7. 使用 Filter Callback通过使用FILTER_CALLBACK过滤器可以调用自定义的函数把它作为一个过滤器来使用。
郑州网站建设
网页设计
企业官网