因为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关键字
但会保留前一次变量的值
echo PHP_EOL; //是一个空格的
通过调用代码来将值传递给局部变量。
<?php function my($a) { echo($a); } my(4) ?> //输出4
echo可以输出一个或多个
print只能输出一个,返回值总为1
echo加不加括号都一样
echo命令中可以使用html的代码
<?php echo "<h2>chenyouxu<br></h2>"; echo ”gg“ ?>
在对函数进行arry的取值,发现没法进行用单引号,所以就按照教程的来用给双引号吧
必须后接分号,不然不通过
eof可以用任意其他字符代替,只需要保证结束标志和开始标志一样。
结束标识必须顶格独自占一行(即必须从行首开始,前后不能衔接任何空白和字符)
以 <<<EOF 开始标记开始,以 EOF 结束标记结束,结束标记必须顶头写,不能有缩进和空格,且在结束标记末尾要有分号
开始标记和结束标记相同,只要不和其他的冲突命名就行
位于开始标记和结束标记之间的变量可以被正常解析,但是函数则不可以
<?php $name="chenyoxiu"; $a= <<<eof <h1>my name is $name</h1> eof; echo $a; ?>
dddd
必须至少有一个数字
整数不能包含逗号或空格
可以正数或负数
三种进制:
10、16(0x)、8
在php文件的var_dump函数返回变量的数据类型和值
dddd
通常用于判断条件
$变量名字=arry("","","")
对象数据类型也可以用于存储数据,且必须声明。
类似python
得先使用class关键字声明类对象,类可以是包含属性和方法的结构。
null表示没有值,可以通过设置变量值为null来清空变量数据
==比较值
===除了值,还有类型
这个方便看
常量不能开头是数字,不需要美元修饰
常量任何脚本都可使用
设置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 $txt="hello"; $tet=" chenyouxiu"; echo $txt." ".$tet; ?>
dddd,空格也算
查找文字,没有返回bool的false
查找字符串在另一字符串中第一次出现的位置
按从0开始
<?php echo strpos("Hello world!","world"); ?> //返回6
赋值运算符 = 用于给变量赋值
算术运算符 + 用于把值加在一起
主要是取反,相反数
<?php $x=2; echo -$x; ?>
函数返回值为第一个参数除于第二个参数的值并取整(向下取整)
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 |
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
expr1 为 null
,表达式 (expr1) ?? (expr2)
等同于 expr2,否则为 expr1
issert()监测是否为空,null合并运算符和issert()一样不会产生警告。
产生的是表达式结果,不是变量,返回函数引用会出现警告
该运算符可以镶套
$c = $a <=> $b;
优先级
优先级: && > = > and
优先级: || > = > or
换行不仅可以用<br> 也可以用\n
if else if elseif else //dddd
有选择的执行代码块之一
switch() { case 条件: 内容; break; case 条件: 内容; break; default: 内容 }
array() 函数用于创建数组
数组有三种:
数值数组:带有数字ID键的数组
关联数组:带有指定的键的数组,每个键关联一个值
多维数组:包含一个或多个组的数组
自动分配,id键从0开始
count
遍历并打印数组中的所有值,可以使用for循环
<?php $cars=array("Volvo","BMW","Toyota"); $arrlength=count($cars); for($x=0;$x<$arrlength;$x++) { echo $cars[$x]; echo "<br>"; } ?>
分配给数组的指定的键的数组
两种创建关联数组的方法
$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>"; } ?>
dddd
在脚本的全部作用域种都可以使用
<?php $x=58; $y=15; function addition() { $GLOBALS["z"]=$GLOBALS["x"]+$GLOBALS["y"]; } addition(); echo $z; ?> // z 是一个$GLOBALS数组中的超级全局变量,该变量同样可以在函数外访问
这个数组中的项目由 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"。 |
用于收集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的指定脚本文件
广泛应用于收集表单数据,在HTML form标签的指定该属性:"method="post"。
在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 (初始值; 条件; 增量) { 要执行的代码; } //初始值和增量参数可为空,或者有多个表达式(用逗号分隔)。
用于遍历数组。
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 function name() { echo "chenyouxiu"; } echo "ni hao! "; name(); ?>
<?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__当前命名空间的名称(区分大小写)
必须在其它所有代码之前声明命名空间
可以在同一个文件中定义不同的命名空间代码
建议使用大括号形式的语法
namespace Myproject{ }
声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句
所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前
也不可出现html
也可分层
namespace MyProject\Sub\Level;
变量 $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(私有)来实现的。
类属性必须定义为公有,受保护,私有之一。如果用 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), "\n"; ?> 就3,键名将被这样转换:null 转为(空字符串),true 转为 1,false 转为 0。
PHP 变量只有一个作用域(函数中除外)
一个类只能继承一个基类
headers_list() 函数返回已发送的(或待发送的)响应头部的一个列表,如需确定是否已发送报头,使用 headers_sent() 函数。
include 文件时,对引入的文件个数没有限制,使用 include_once 则只引入一次文件。
array_keys() 函数返回包含数组中所有键名的一个新数组,如果提供了第二个参数,则只返回键值为该值的键名。