php基础知识

因为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类型比较

==比较值

===除了值,还有类型

这个方便看

img

img

php常量

常量不能开头是数字,不需要美元修饰

常量任何脚本都可使用

设置php常量、使用define()函数

bool define ( string $name , mixed $value [, bool $case_insensitive = false ] )

但是在php的8版本中,7.多就废除了对大小写的设定。

image-20210628220717878

常量是全局的在默认下,在整个脚本下都可运行

<?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() 函数返回包含数组中所有键名的一个新数组,如果提供了第二个参数,则只返回键值为该值的键名。

别人都在不停的努力,自己又怎么会停
原文地址:https://www.cnblogs.com/chenyouxiu/p/14952756.html