因为dvwa打不下去了,有点看不懂,学习一下php再代码审计
自己用的是phpstrom和xampp,php版本8
基本用法
<?php
echo"chenyouxiu";
?>
结果会chenyouxiu,也可以添加html元素来改变字体
php每个代码行都必须以分号结束。分号是一种分隔符,用于把指令集区分开来。
php注释有两种
//
/*
...
*/
变量是用来存储数据的容器
php变量规则
变量以$开始,后跟变量名称
变量名必须以字母或下划线字符开始
变量名只能含有字母数字字符和下划线
变量名不能含有空格
区分大小写(php语句和php变量都区分大小写)
php没有声明变量的命令
第一次复赋值便被创建
当赋值给一个文本值时,把文本值两侧加引号。
全局变量
可在任何脚本中访问
函数内声明的是局部变量,尽在函数内访问
global 关键字用于函数内访问全局变量,访问只需要在函数内调用数外定义的全局变量,在函数中的变量前加global关键字
也可以用php函数里的数据,$GLOBALS['变量']
例子
<?php
$x=5;
$y=10;
function myTest()
{
$GLOBALS['Z']=$GLOBALS['y']+$GLOBALS['x'];
}
myTest();
echo $Z;
?>
static作用域
希望某个局域变量不要删除
第一次声明使用static关键字
但会保留前一次变量的值
echo PHP_EOL;
//是一个空格的
参数作用域
通过调用代码来将值传递给局部变量。
<?php
function my($a)
{
echo($a);
}
my(4)
?>
//输出4
php的echo和print
echo可以输出一个或多个
print只能输出一个,返回值总为1
echo加不加括号都一样
echo命令中可以使用html的代码
<?php
echo "<h2>chenyouxu<br></h2>";
echo ”gg“
?>
在对函数进行arry的取值,发现没法进行用单引号,所以就按照教程的来用给双引号吧
EOF的使用说明
必须后接分号,不然不通过
eof可以用任意其他字符代替,只需要保证结束标志和开始标志一样。
结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)
以 <<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号
开始标记和结束标记相同,只要不和其他的冲突命名就行
位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以
<?php
$name="chenyoxiu";
$a= <<<eof
<h1>my name is $name</h1>
eof;
echo $a;
?>
php数据类型
字符串
dddd
整形
必须至少有一个数字
整数不能包含逗号或空格
可以正数或负数
三种进制:
10、16(0x)、8
在php文件的var_dump函数返回变量的数据类型和值
浮点型
dddd
布尔型
通常用于判断条件
php数组
$变量名字=arry("","","")
php对象
对象数据类型也可以用于存储数据,且必须声明。
类似python
得先使用class关键字声明类对象,类可以是包含属性和方法的结构。
phpnull
null表示没有值,可以通过设置变量值为null来清空变量数据
php类型比较
==比较值
===除了值,还有类型
这个方便看
php常量
常量不能开头是数字,不需要美元修饰
常量任何脚本都可使用
设置php常量、使用define()函数
bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )
但是在php的8版本中,7.多就废除了对大小写的设定。
常量是全局的在默认下,在整个脚本下都可运行
<?php
define("name","chenyouxiu");
function mytest()
{
echo name;
}
mytest();
?>
字符串变量
用于存储并处理文本
可直接使用、也可存储在变量中
PHP 并置运算符
并置运算符 (.) 用于把两个字符串值连接起来。
<?php
$txt="hello";
$tet=" chenyouxiu";
echo $txt." ".$tet;
?>
strlen
dddd,空格也算
strpos
查找文字,没有返回bool的false
查找字符串在另一字符串中第一次出现的位置
按从0开始
<?php
echo strpos("Hello world!","world");
?>
//返回6
PHP 运算符
赋值运算符 = 用于给变量赋值
算术运算符 + 用于把值加在一起
主要是取反,相反数
<?php
$x=2;
echo -$x;
?>
intdiv()
函数返回值为第一个参数除于第二个参数的值并取整(向下取整)
赋值运算符
dddd
a.=b就是a=a.b连接两个字符串
<?php
$a = "Hello";
$b=$a." world!";
echo $b;
$x="<br>baby";
$x.="chenyouxiu";
echo $x;
?>
//两个方式
递增/递减运算符
预递增是在$前,后递增是在$后
比较运算符
运算符 | 名称 | 描述 | 实例 |
---|---|---|---|
x == y | 等于 | 如果 x 等于 y,则返回 true | 5==8 返回 false |
x === y | 绝对等于 | 如果 x 等于 y,且它们类型相同,则返回 true | 5==="5" 返回 false |
x != y | 不等于 | 如果 x 不等于 y,则返回 true | 5!=8 返回 true |
x <> y | 不等于 | 如果 x 不等于 y,则返回 true | 5<>8 返回 true |
x !== y | 绝对不等于 | 如果 x 不等于 y,或它们类型不相同,则返回 true | 5!=="5" 返回 true |
x > y | 大于 | 如果 x 大于 y,则返回 true | 5>8 返回 false |
x < y | 小于 | 如果 x 小于 y,则返回 true | 5<8 返回 true |
x >= y | 大于等于 | 如果 x 大于或者等于 y,则返回 true | 5>=8 返回 false |
x <= y | 小于等于 | 如果 x 小于或者等于 y,则返回 true | 5<=8 返回 true |
PHP 逻辑运算符
x and y | 与 | 如果 x 和 y 都为 true,则返回 true | x=6 y=3 (x < 10 and y > 1) 返回 true |
---|---|---|---|
x or y | 或 | 如果 x 和 y 至少有一个为 true,则返回 true | x=6 y=3 (x6 or y5) 返回 true |
x xor y | 异或 | 如果 x 和 y 有且仅有一个为 true,则返回 true | x=6 y=3 (x6 xor y3) 返回 false |
x && y | 与 | 如果 x 和 y 都为 true,则返回 true | x=6 y=3 (x < 10 && y > 1) 返回 true |
x || y | 或 | 如果 x 和 y 至少有一个为 true,则返回 true | x=6 y=3 (x5 || y5) 返回 false |
! x | 非 | 如果 x 不为 true,则返回 true | x=6 y=3 !(x==y) 返回 true |
异或,以前python里是^表示异或的符号,但意义不一样。。。
<?php
$x=array("a"=>"red","b"=>"green");
$y=array("c"=>"bule","d"=>"yellow");
$z=$x+$y;
var_dump($z);
?>
/*
结果
array(4) { ["a"]=> string(3) "red" ["b"]=> string(5) "green" ["c"]=> string(4) "bule" ["d"]=> string(6) "yellow" }
*/
三元运算符
?:
语法格式
dddd
三元多了,从左到右运算’
php不在通过返回的函数语句中起作用
return $var == 42 ? $a : $b;
当时ture就是本身,是false就是另一个条件
可以选择
aaa?:bbb
NULL 合并运算符
expr1 为 null
,表达式 (expr1) ?? (expr2)
等同于 expr2,否则为 expr1
issert()监测是否为空,null合并运算符和issert()一样不会产生警告。
产生的是表达式结果,不是变量,返回函数引用会出现警告
该运算符可以镶套
组合比较符
$c = $a <=> $b;
- 如果 $a > $b, 则 $c 的值为 1。
- 如果 $a == $b, 则 $c 的值为 0。
- 如果 $a < $b, 则 $c 的值为 -1。
优先级
优先级: && > = > and
优先级: || > = > or
换行不仅可以用<br>
也可以用
if else
if elseif else
//dddd
switch语句
有选择的执行代码块之一
switch()
{
case 条件:
内容;
break;
case 条件:
内容;
break;
default:
内容
}
数组
array() 函数用于创建数组
数组有三种:
数值数组:带有数字ID键的数组
关联数组:带有指定的键的数组,每个键关联一个值
多维数组:包含一个或多个组的数组
PHP 数值数组
自动分配,id键从0开始
获取数组长度
count
遍历数值数组
遍历并打印数组中的所有值,可以使用for循环
<?php
$cars=array("Volvo","BMW","Toyota");
$arrlength=count($cars);
for($x=0;$x<$arrlength;$x++)
{
echo $cars[$x];
echo "<br>";
}
?>
php关联数组
分配给数组的指定的键的数组
两种创建关联数组的方法
$age=arrary("peter"=>"22","dad"=>"44");
or
$age["peter"]="35";
...
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is ".$age["Peter"]. " years old.";
?>
遍历关联打印
使用foreach循环
<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
foreach($age as $x=>$x_value)
{
echo "key=".$x.",value=".$x_value;
echo "<br>";
}
?>
数组排序
- sort() - 对数组进行升序排列
- rsort() - 对数组进行降序排列
- asort() - 根据关联数组的值,对数组进行升序排列
- ksort() - 根据关联数组的键,对数组进行升序排列
- arsort() - 根据关联数组的值,对数组进行降序排列
- krsort() - 根据关联数组的键,对数组进行降序排列
dddd
超级全局变量
$GLOBALS
在脚本的全部作用域种都可以使用
<?php
$x=58;
$y=15;
function addition()
{
$GLOBALS["z"]=$GLOBALS["x"]+$GLOBALS["y"];
}
addition();
echo $z;
?>
// z 是一个$GLOBALS数组中的超级全局变量,该变量同样可以在函数外访问
$_SERVER
这个数组中的项目由 Web 服务器创建
$_SERVER['PHP_SELF'] | 当前执行的文件相对路径 |
---|---|
$_SERVER['GATEWAY_INTERFACE'] | 服务器使用的 CGI 规范的版本;例如,"CGI/1.1"。 |
$_SERVER['SERVER_ADDR'] | 当前运行脚本所在的服务器的 IP 地址。 |
$_SERVER['SERVER_NAME'] | 当前运行脚本所在的服务器的主机名。如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。(如: www.runoob.com) |
$_SERVER['SERVER_SOFTWARE'] | 服务器标识字符串,在响应请求时的头信息中给出。 (如:Apache/2.2.24) |
$_SERVER['SERVER_PROTOCOL'] | 请求页面时通信协议的名称和版本。例如,"HTTP/1.0"。 |
$_SERVER['REQUEST_METHOD'] | 访问页面使用的请求方法;例如,"GET", "HEAD","POST","PUT"。 |
$_SERVER['REQUEST_TIME'] | 请求开始时的时间戳。从 PHP 5.1.0 起可用。 (如:1377687496) |
$_SERVER['QUERY_STRING'] | query string(查询字符串),如果有的话,通过它进行页面访问。 |
$_SERVER['HTTP_ACCEPT'] | 当前请求头中 Accept: 项的内容,如果存在的话。 |
$_SERVER['HTTP_ACCEPT_CHARSET'] | 当前请求头中 Accept-Charset: 项的内容,如果存在的话。例如:"iso-8859-1,*,utf-8"。 |
$_SERVER['HTTP_HOST'] | 当前请求头中 Host: 项的内容,如果存在的话。 |
$_SERVER['HTTP_REFERER'] | 引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。) |
$_SERVER['HTTPS'] | 如果脚本是通过 HTTPS 协议被访问,则被设为一个非空的值。 |
$_SERVER['REMOTE_ADDR'] | 浏览当前页面的用户的 IP 地址。 |
$_SERVER['REMOTE_HOST'] | 浏览当前页面的用户的主机名。DNS 反向解析不依赖于用户的 REMOTE_ADDR。 |
$_SERVER['REMOTE_PORT'] | 用户机器上连接到 Web 服务器所使用的端口号。 |
$_SERVER['SCRIPT_FILENAME'] | 当前执行脚本的绝对路径。 |
$_SERVER['SERVER_ADMIN'] | 该值指明了 Apache 服务器配置文件中的 SERVER_ADMIN 参数。如果脚本运行在一个虚拟主机上,则该值是那个虚拟主机的值。(如:someone@runoob.com) |
$_SERVER['SERVER_PORT'] | Web 服务器使用的端口。默认值为 "80"。如果使用 SSL 安全连接,则这个值为用户设置的 HTTP 端口。 |
$_SERVER['SERVER_SIGNATURE'] | 包含了服务器版本和虚拟主机名的字符串。 |
$_SERVER['PATH_TRANSLATED'] | 当前脚本所在文件系统(非文档根目录)的基本路径。这是在服务器进行虚拟到真实路径的映像后的结果。 |
$_SERVER['SCRIPT_NAME'] | 包含当前脚本的路径。这在页面需要指向自己时非常有用。FILE 常量包含当前脚本(例如包含文件)的完整路径和文件名。 |
$_SERVER['SCRIPT_URI'] | URI 用来指定要访问的页面。例如 "/index.html"。 |
$_REQUEST
用于收集HTML表单提交的数据。
<html>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
<?php
$name = $_REQUEST['fname'];
echo $name;
?>
</body>
</html>
//当用户点击submit时,会执行表单的action的指定脚本文件
$_POST
广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
$_GET
在HTML form标签的指定该属性:"method="get"。
循环
while - 只要指定的条件成立,则循环执行代码块
do...while - 首先执行一次代码块,然后在指定的条件成立时重复这个循环
<html>
<?php
$i=1;
while($i<=5)
{
echo "The number is " . $i . "<br>";
$i++;
}
?>
</html>
do。。while
<html>
<?php
$i=1;
do{
$i++;
echo "my baby is".$i."<br>";
}
while($i<=5);
?>
</html>
for循环
for (初始值; 条件; 增量)
{
要执行的代码;
}
//初始值和增量参数可为空,或者有多个表达式(用逗号分隔)。
foreach 循环
用于遍历数组。
foreach ($array as $value)
{
要执行代码;
}
//每进行一次循环,就会将数组的值逐一传递
<?php
$x=array("google","chenyouxiu","dating");
foreach ($x as $value)
{
echo $value.PHP_EOL;
}
?>
foreach ($array as $key => $value)
{
要执行代码;
}
//每进行一次循环,当前数组元素的键与值就会给$key$value变量,逐一移动,
<?php
$x=array(1=>"Google", 2=>"Runoob", 3=>"Taobao");
foreach ($x as $key => $value)
{
echo "key 为 " . $key . ",对应的 value 为 ". $value . PHP_EOL;
}
?>
php函数
创建 PHP 函数
函数通过调用函数来执行的。
函数的名称应该提示出对应的功能
命名应以字母或下划线开头
<?php
function name()
{
echo "chenyouxiu";
}
echo "ni hao! ";
name();
?>
PHP 函数 - 添加参数
<?php
function writename($name)
{
echo $name ." 就这些本事?<br>";
}
echo "my name is ";
writename("chenyouxiu");
writename("chenyouxiu");
?>
两个参数
<?php
function writename($nname,$lname)
{
echo $nname." renens".$lname."<br>";
}
writename("chenyouxiu"," jiayou");
?>
返回值
<?php
function add($x,$y)
{
$total=$x+$y;
return $total;
}
echo "1+7=".add(1,7)
?>
魔术常量
离谱的常量
__LINE__显示行数
echo "this is ".__LINE__."name";
__FILE__文件的完整路径和文件名,如果用在被包含文件中,则返回被包含的文件名
__DIR__文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录
__FUNCTION__看函数名的
实例
<?php
function test() {
echo '函数名为:' . __FUNCTION__ ;
}
test();
?>
__CLASS__看类名的
__TRAIT__
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait SayWorld {
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class MyHelloWorld extends Base {
use SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
__METHOD__返回该方法被定义时的名字
__NAMESPACE__当前命名空间的名称(区分大小写)
PHP 命名空间
必须在其它所有代码之前声明命名空间
可以在同一个文件中定义不同的命名空间代码
建议使用大括号形式的语法
namespace Myproject{
}
声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句
所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前
也不可出现html
也可分层
namespace MyProjectSubLevel;
面向对象
变量 $this 代表自身的对象。
先定义类---创建对象---调用函数,设置内容----调用函数,获取内容
<?php
class Site {
/* 成员变量 */
var $url;
var $title;
/* 成员函数 */
function setUrl($par){
$this->url = $par;
}
function getUrl(){
echo $this->url;
}
function setTitle($par){
$this->title = $par;
}
function getTitle(){
echo $this->title;
}
}
//创建对象
$runoob = new Site;
$taobao = new Site;
$google = new Site;
// 调用成员函数,设置标题和URL
$runoob->setTitle( "菜鸟教程" );
$taobao->setTitle( "淘宝" );
$google->setTitle( "Google 搜索" );
$runoob->setUrl( 'www.runoob.com' );
$taobao->setUrl( 'www.taobao.com' );
$google->setUrl( 'www.google.com' );
// 调用成员函数,获取标题和URL
$runoob->getTitle();
$taobao->getTitle();
$google->getTitle();
$runoob->getUrl();
$taobao->getUrl();
$google->getUrl();
?>
构造函数
function __construct( $par1, $par2 ) {
$this->url = $par1;
$this->title = $par2;
}
//然后赋值可以一块赋值,
$runoob = new Site('www.runoob.com', '菜鸟教程');
$runoob->getTitle();
$runoob->getUrl();
继承
使用关键字 extends 来继承一个类,PHP 不支持多继承
class Child extends Parent {
// 代码部分
}
<?php
class Child_Site extends Site(){
var $category;
function setchile($par){
$this->$category=$par;
}
function getchile(){
echo $this->category;
}
}
?>
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
- public(公有):公有的类成员可以在任何地方被访问。
- protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
- private(私有):私有的类成员则只能被其定义所在的类访问。
类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有
类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有
emmm
做题
函数体内引用全局变量,必须在函数内部使用“global”关键字
<?php
$a = 1;
function Test()
{
echo "a = $a";
}
Test();
?>
<?php
$a = 1;
function Test()
{
echo $GLOBALS["x"]=$GLOBALS["a"];
}
Test();
?>
在 PHP 中,不区分大小写的关键字 NULL 用于没有定义值的情况。
声明常量使用关键字 define
<?php
$a = array(
'a',
3 => 'b',
1 => 'c',
'd'
);
?>
d’ 的值为最大的整数索引+1。
空数组转化为 null
<?php
if ('2' == '02') {
echo 'true';
} else {
echo 'false';
}
?>
//数值字符串作为整数进行比较。所以对。。。。。
<?php
$a = array(
null => 'a',
true => 'b',
false => 'c',
0 => 'd',
1 => 'e',
'' => 'f'
);
echo count($a), "
";
?>
就3,键名将被这样转换:null 转为(空字符串),true 转为 1,false 转为 0。
PHP 变量只有一个作用域(函数中除外)
一个类只能继承一个基类
headers_list() 函数返回已发送的(或待发送的)响应头部的一个列表,如需确定是否已发送报头,使用 headers_sent() 函数。
include 文件时,对引入的文件个数没有限制,使用 include_once 则只引入一次文件。
array_keys() 函数返回包含数组中所有键名的一个新数组,如果提供了第二个参数,则只返回键值为该值的键名。