【黑客技术零基础入门】PHP基础语法(非常详细)零基础入门到精通,收藏这一篇就够了

php

这里默认有HTML,JavaScript基础咯。

一、基础
1、客户端和服务端

客户端(用户端):享受服务的【前端,客户端运行代码】

服务端(远程):提供服务的【后端,服务端运行代码】

2、什么是php

PHP(全称:以前叫Personal Home Page,现在改名为Hypertext Preprocessor,即"PHP:超文本预处理器"),是一种通用开源脚本语言。

PHP是服务器端的语言,对于web开发(html),非常友好,能嵌入在html文档里面;可以跟html,css和JavaScript代码融合在一起,弥补它们做不了的事情。

3、XAMPP的安装

下载自己所需要的版本。安装即可。

开启xampp中的Apache后,在浏览器中打开localhost,即可看到htdocs(html文档)根目录下的index.php对应的页面。

4、PHP能干什么

几乎能干后端一切能干的事情

  • 独立网站
  • 网络爬虫
  • 开发后台管理系统
  • 机器学习等人工智能相关
  • 提供app、小程序、web等等数据服务
  • ......

php简单、好学、上手快。

5、一个好用的php集成工具------phpStudy

首先在官网(https://www.xp.cn/)下载对应的版本,然后解压,安装。

安装后,启动phpStudy中的服务器,在localhost中,即可以看到WWW根目录下的index.php对应的页面。

二、PHP基本语法
1、php标记

当解析一个文件时,PHP会寻找起始和结束标记,也就是<?php ?>, 这告诉PHP开始和停止解析二者之间的代码。此种解析方式使得PHP可以被嵌入到各种不同的文档中,而任何起始和结束标记之外的部分都会被PHP解析器忽略。

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <!-- 嵌入到html文件中 -->
  <?php echo "hello,php"?>
</body>
</html>

注意,访问的文档如果不是默认的index.php,则需要在访问时,加入路径进行访问。

比如想访问的是basic.php,那么需要访问的URL是localhost/basic.php

如果文件内容是纯PHP代码,最好在文件末尾删除PHP结束标记。这可以避免在PHP结束标记之后,万一意外加入空格或者换行符,会导致PHP开始输出这些空白,而脚本中此时并无输出意图。

复制代码
<?php
echo "hello,php";
// ... more code
echo "last statement";
// 脚本至此结束,并无PHP结束标记
2、指令分隔符

PHP需要在每个语句后用分号结束指令; ,一段PHP代码中的结束标记隐含表示了一个分号,在一个PHP代码段中的最后一行可以不用分号结束。

3、注释
  • 单行://
  • 多行:/**/
4、变量

PHP中变量用一个$ 后加变量名来表示。变量名区分大小写。(变量、常量、php配置文件php.ini区分大小写,其他不分)

复制代码
$var = 'Bob';
$Var = 'Joe';

$4site = 'not yet';  //非法变量名,以数字开头了
$_4site = 'not yet';  //合法变量名,以下划线开头

$this = 'Nikon';  //非法赋值,$this是一个特殊的变量,不能被赋值
5、赋值
(1)传值赋值(默认)

使用"="将赋值表达式的值赋给另一个变量(单独分配房间),互不干扰。

复制代码
$name = "tom";
$myname = $name;
(2)引用赋值

将赋值表达式内存空间的引用赋给另外一个变量,简单地将一个&符号加到将要赋值的变量前(共享一个房间),改变其中一个变量的值会影响另一个变量。

复制代码
$foo = 'Bob';
$bar = &$foo;  //通过$bar引用给$foo
6、可变变量

变量的名字可以动态改变,用$$ 符号表示。

复制代码
$a = 'hello';
$$a = 'world';  //等价于$hello = 'world'
7、常量

常量是一个简单值的标识符(名字),在脚本执行期间该值不能改变。默认大小写敏感,一般来讲常量标识符总是大写的,用define()函数关键词再定义。

常量只能包含标量数据(boolean, integer, float, string),注意没有$ 符号。

复制代码
define('NAME', 'Tom');
echo NAME;

注意:

和使用define()定义常量不同的是,使用const关键字定义常量必须处于最顶端的作用域,因为此方法是在编译时定义的。这就意味着不能在函数中,循环内以及if语句中使用const来定义常量。

8、魔术常量(预定义常量)

网络安全学习路线
如果你对网络安全入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!

9、变量作用域
(1)变量法则
  1. 超全局变量,任何地方都可以访问
  2. 常数,一般是全局性,函数内外都可以访问
  3. 全局变量(一般声明在函数外面),函数内不可以访问
  4. 函数内可以通过global关键词就可以访问全局变量(其实是同一个变量)
  5. 在函数中创建的静态变量,函数外无法访问,但是这个变量的值一直保留
  6. 在函数中创建的局部变量,函数外是无法访问的,并且在函数执行结束后失效
(2)内置超全局变量

在程序的任何地方都可以访问到,由php预先定义好的。

复制代码
$GLOBALS
$_SERVER
$_REQUEST
$_POST
$_GET
$_FILES
$_ENV
$_COOKIE
$_SESSION
<?php

$a = 100;
$b = 200;
function add() {
  $GLOBALS['c'] = $GLOBALS['a'] + $GLOBALS['b'];
}

add();
echo "<h1>$c</h1>";  //300
(3)全局变量

全局变量一般声明在函数外的变量,代码间可以访问,函数内不可以访问

复制代码
<?php

$a = 100;   //全局变量
function output() {
  echo "<h1>$a</h1>";   
  //报错:Notice: Undefined variable: a in D:\xampp\htdocs\test.php on line 5
}

output();

可以在函数中使用global关键字,对全局变量进行访问。

复制代码
<?php

$a = 100;
function output() {
  global $a;
  echo "<h1>$a</h1>";  //100
}

output();
(4)静态变量

静态函数只是在函数体内,在函数外无法访问。但是执行后,其值保留,等待下次函数执行。

复制代码
function add() {
  static $c = 500;  //静态函数
  $c++;
  echo "<h1>$c</h1>";
}

add();  //501
add();  //502
(5)变量销毁

php一般有自动垃圾回收机制,但是也可以通过收到销毁,用函数unset()。

复制代码
$a = 100;
$b = $$a;

unset($a);
echo $b;  //报错,无法访问
10、数据类型
(1)整型
复制代码
$a = 1234;  //十进制数
$a = -123;
$a = 0123;  //八进制
$a = 0x1A;  //十六进制
$a = 0b11111111;  //二进制
(2)浮点型

NAN属于浮点数

(3)字符串型
  • 一般情况是单引号和双引号

    复制代码
    $c = 100;
    
    echo 'this is {$c}';  //this is {$c}
    echo "this is {$c}";  //this is 100

    双引号字符串中可以解析变量;

    如果变量使用大括号{}, 注意变量和左括号之间不可以有空格,否则会把大括号也打印出来。

  • heredoc语法结构

  • nowdoc语法结构(<<<)

(4)布尔型

不区分大小写

(5)NULL

表示一个变量没有值。以下三种情况,变量可能为NULL:

  • 被赋值为NULL
  • 尚未被赋值
  • 被unset()
(6)数组型

php中的数组实际上是一个有序映射,映射是一种把values关联到keys的类型。

array( key => value, ...)

键key可以是一个整数integer或字符串string

值value可以是任意类型的数

复制代码
$a = array(
  "a" => "abc",
  "b" => "ddd"
);

// 自php5.4开始
$b = [
  "a" => "abc",
  "b" => "ddd"
];

var_dump($a);  //该函数可以打印变量以及它的一些类型信息
var_dump($b);

key的强制转换:

  1. 字符串: 如果包含合法整型值,会被转换为整型。如"8" 实际被储存为8,但是"08" 则不会强制转换,因为其不是一个合法的十进制数值。
  2. 浮点数: 会被转换成整型,且转换时直接舍弃小数部分。如8.7 实际被存储为8。
  3. 布尔值: 会被转换成整型,true为1,false为0。
  4. Null: 会被转换为空字符串,即""
  5. NaN: 会被转换为空字符串。
  6. 数组和对象: 不能被用作key,会出现警告:Illegal offset type

重复的key会进行覆盖:

如果在数组定义中,多个单元都使用了同一个key,则最后一个出现的单元会将前面的覆盖。

复制代码
$a = array(
  1 => "abc",
  "b" => "ddd",
  1.5 => "ccc"
);

var_dump($a);  //array(2) { [1]=> string(3) "ccc" ["b"]=> string(3) "ddd" }

key为可选项:

如果未指定key,php将自动使用之前用过的最大integer键名加上1作为新的键名。

复制代码
$b = ["abc", "ddd", "aaa"];
$d = array(1, 2, 3, 4);

$e = [
  "a",
  "b",
  4 => "c",
  "d"
];
var_dump($e);  // array(4) { [0]=> string(1) "a" [1]=> string(1) "b" [4]=> string(1) "c" [5]=> string(1) "d" }

注意这里的变量$e ,其中"d" 对应的键名为5,正是因为之前使用过的最大键名为4。

数组的访问:

$array[key] (大括号{} 的访问方法已经不再支持了)

复制代码
$a = [1, 2, 3, 4];
echo $a[0];  //1

$b = [
  "a" => 1,
  "b" => 2,
  3
];
// echo $b{0};
echo $b[0];

数组元素的修改与新增:

数组单元可以通过array[key] 来进行修改或新增;如果想要删除某键值对,对其调用unset() 函数。

复制代码
$arr = array(5 => 1, 12 => 2);

$arr[] = 15;  //相当于$arr[13] = 56
unset($arr[5]);  //删除该键值对

var_dump($arr);  //array(2) { [12]=> int(2) [13]=> int(15) }
(7)对象型

对象是复合型的数据类型,php中任何对象可以拥有特征(属性 )和行为(方法)。

复制代码
class Stu
{
    public $university = "PeKing";
    public $major;

    public function __construct($m)
    {
        $this->major = $m;
    }

    public function wugong()
    {
        echo "wugong";
    }
}

$zhang = new Stu("CS");
var_dump($zhang);
echo $zhang->major;  //CS

Resource资源类型:

比如打开一个文件,或者链接一个数据库等。

复制代码
$fp = fopen("test.txt", "r");

var_dump($fp);  //resource(5) of type (stream)
fclose($fp);
11、类型转换
(1)(type) 强制转换
  • (int)、(integer) :转换为整型

  • (float)、(double)、(real) :浮点型

  • (string) :字符型

  • (bool)、(boolean) :布尔型

  • (array) :数组型

  • (object) :对象

    $a = "12.2";

    var_dump((float)$a); //float(12.2)

(2)intval()、floatval()、strval()
复制代码
$a = "12.2";

var_dump(floatval($a));  //float(12.2)
(3)setype()函数
复制代码
$a = "12.2";

settype($a, "float");
var_dump(floatval($a));  //float(12.2)

注意,前两种转换方式都不会改变原数据的类型,即$a 还是string类型。但第三种方式会改变原数据类型,也就是直接将$a 的类型转变为float类型。

(4)Integer整型(类型转换)

如果给定的数超出integer范围,将会被解释为float类型。

复制代码
echo PHP_INT_MAX;  //9223372036854775807

var_dump(PHP_INT_MAX + 1);  //float(9.2233720368548E+18)

将resource转换成integer时,结果会是PHP运行时,给resource分配的唯一资源号。

复制代码
$fp = fopen("test.txt", "r");
var_dump($fp);  //resource(3) of type (stream)
var_dump((int)$fp);  //int(3)

NAN将转换为0。

复制代码
echo (int)NAN;  //0

字符串转换为数值:

如果该字符串没有包含'.','e'或'E' 并且其数字值在整型的范围之内,该字符串将被当成integer来取值,其他所有情况下为PHP_INT_MAX。

该字符串的开始部分决定了它的值,如果该字符串以合法的数值开始,则使用该数值,否则其值为0。

复制代码
$a = "1249857576676879778766767793";
var_dump((int)$a);  //int(9223372036854775807) 即PHP_INT_MAX

$b = "123aljfeioj";
var_dump((int)$b);  //int(123)

$c = "5.8";
var_dump((int)$c);  //int(5) 向下取整

$d = "jflj320jljk";
var_dump((int)$d);  //int(0)

$e = 1.5e+10;
var_dump((int)$e);  //int(15000000000)
(5)Boolean布尔类型(类型转换)

当转换为布尔值时,以下值被认为是FALSE:

  • 布尔值FALSE本身
  • 整型值0
  • 浮点型值0.0
  • 空字符串(字符串里有空格不算空字符串),以及字符串"0"
  • 不包含任何元素的数组
  • 特殊类型NULL(包括尚未赋值的变量)

其他所有的值都被认为是TRUE(包括任何资源 和 NAN)

复制代码
$a = NAN;
var_dump((bool)$a);  //bool(true)

$b = "  ";
var_dump((bool)$b);  //bool(true)

$c = "";
var_dump((bool)$c);  //bool(false)
(6)String字符串(类型转换)

转换规则:

  • 布尔值TRUE转换成"1" ,FALSE转换成"" (空字符串)

  • 整型和浮点型转换为数字的字面样式的string

  • 数组array总是转换成字符串"Array"

  • NULL转换为空字符串

  • 资源resource转换为"Resource id #1" 这种结构的字符串

    a = NAN; var_dump((string)a); //string(3) "NAN"

    b = true; var_dump((string)b); //string(1) "1"

    fp = fopen("test.txt", "r"); var_dump((string)fp); //string(14) "Resource id #3"
    fclose($fp);

(7)Array数组(类型转换)

对于任意integer,float,string,boolean和resource类型,如果将一个值转换为数组,将得到一个仅有一个元素的数组,其下标为0,该元素即为此标量的值。

复制代码
$a = 12.33;
var_dump((array)$a);  //array(1) { [0]=> float(12.33) }

如果一个对象object类型转换为array,则结果为一个数组,其单元为该对象的属性,键名将为成员变量名。

复制代码
class Age
{
    public $age1 = 100;
    private $age2 = 200;
    protected $age3 = 300;
}

$s = new Age();
var_dump((array)$s);  //array(3) { ["age1"]=> int(100) ["Ageage2"]=> int(200) ["*age3"]=> int(300) }

注意这里,对象内的属性类型不同,转换为数组时,键名也会有所不同。public、private以及protected有所区别。

(8)Object对象(类型转换)

array转换成object将键名成为属性并具有相对应的值。

复制代码
$obj1 = (object) array(1 => "foo");
var_dump($obj1);  //object(stdClass)#2 (1) { ["1"]=> string(3) "foo" }
var_dump($obj1->{1});  //string(3) "foo"  当键名为数字时,一定要使用大括号包裹键名
var_dump(isset($obj1->{1}));  //bool(true)

注意,当键名为数字时,一定要使用大括号包裹键名。

对于其他值,会包含进成员变量名scalar。(scalar是标量的意思)

复制代码
$obj = (object) "hao";
var_dump($obj);  //object(stdClass)#1 (1) { ["scalar"]=> string(3) "hao" }
var_dump($obj->scalar);  //string(3) "hao"
12、运算符
(1)赋值运算符=
(2)算术运算符
复制代码
+ - * / % ++ -- **(指数)

intdiv()整除

(3)字符串运算符

连接运算符.

返回其左右参数连接后的字符串。

复制代码
$a = "hello ";
$b = "php";

$c = $a.$b;
echo $c;  //hello php
(4)逻辑运算符

与&&(AND)、或||(OR)、非!、异或xor

优先级从高到低:&&、||、=、AND、OR

复制代码
$a = true && false;
var_dump($a);  //bool(false)

$b = true and false;
var_dump($b);  //bool(true)

一般情况下,AND&& 等价,但是要注意它们的优先级是不同的,and的优先级比较低,低于赋值运算符,所以$b 通过赋值运算符,直接等于了true。

平时使用时,建议使用&&来替代AND ,否则优先级容易出问题。

短路运算:

复制代码
$a = false && foo();
var_dump($a);  //bool(false)

$b = false and foo();
var_dump($b);  //bool(false)

$c = true || foo();
(5)比较运算符

===== 等于和全等运算符:和JavaScript相同。

<>!=不等。

!==不全等。

<=>太空船运算符(组合比较符):当$a小于、等于、大于$b时,分别返回一个小于、等于、大于0的integer值。php7开始提供

复制代码
$a = 9 <=> 10;
var_dump($a);  //int(-1)

$b = 10 <=> 9;
var_dump($b);  //int(1)

$c = 9 <=> 9;
var_dump($c);  //int(0)

??NULL合并操作符:从左往右第一个存在且不为NULL的操作数。如果都没有定义,则返回NULL。php7开始提供

复制代码
$a = $b ?? $c;
var_dump($a);  //NULL

$d = $b ?? 10;
var_dump($d);  //int(10)
(6)位运算

位运算符允许对整型数中指定的位进行求值和操作。

位运算符 含义
& 按位与
` `
^ 异或
~
<< >> 移位
复制代码
var_dump(3 & 1);  //int(1)
// 0000 0011(3) & 0000 0001(1) = 0000 0001(1)

var_dump(3 | 1);  //int(3)

var_dump(3 ^ 1);  //int(2)

var_dump(~3);  //int(-4)
// ~0000 0011 = 1111 1100

var_dump(3 << 1);  //int(6)
// 0000 0011 << 1 = 0000 0110(6)

var_dump(3 >> 1);  //int(1)
(7)错误处理
复制代码
$php_errormsg = "error";
$my_file = @file('non_existent_file') or
  die("Failed opening file: error wa '$php_errormsg'"); 
//Failed opening file: error wa 'error'
(8)数组运算符

合并运算符+

复制代码
$arr = [
  "a" => "apple",
  "b" => "banana"
];
$arr1 = [
  "a1" => "apple1",
  "b1" => "banana1",
  "a" => "apple",  //键名相同,合并时将会被忽略,以首次出现的键值对为准
  "c" => "apple"  //键值相同,会正常合并
];

$a = $arr + $arr1;
var_dump($a);
//array(5) { ["a"]=> string(5) "apple" ["b"]=> string(6) "banana" ["a1"]=> string(6) "apple1" ["b1"]=> string(7) "banana1" ["c"]=> string(5) "apple" }

相等运算符=====

复制代码
$arr = [
  "a" => "apple",
  "b" => "banana"
];
$arr1 = [
  "b" => "banana",
  "a" => "apple"
];

var_dump($arr == $arr1);  //bool(true)
var_dump($arr === $arr1);  //bool(false)

双等运算符主要看键值对是否一致,不管顺序。三等运算符需要考虑键值对的顺序。

复制代码
$arr = ["apple", "banana"];
$arr1 = [
  "1" => "banana",
  "0" => "apple"
];

var_dump($arr == $arr1);  //bool(true)
var_dump($arr === $arr1);  //bool(false)
(9)执行运算符

php支持一个执行运算符:反引号(``)。php将尝试将反引号中的内容作为shell命令来执行,并将其输出信息返回。

复制代码
$output = `ipconfig`;
echo "<pre>$output</pre>";
13、流程控制
(1)if/else
复制代码
$a = 12;
$b = 13;

if ($a > $b) {
  echo "a > b";
} elseif ($a < $b) {
  echo "a < b";
} else {
  echo "a == b";
}

php还提供了一些替代语法:

使用:替代{ ;使用endif 替代}

复制代码
if ($a > $b) :
  echo "a > b";
elseif ($a < $b) :
  echo "a < b";
else :
  echo "a == b";
endif;
(2)while/do-while

同样有替代语法,:endwhile

(3)for
复制代码
endfor
(4)foreach

foreach语法结构提供了遍历数组的简单方式,foreach仅能用于数组和对象。

复制代码
$arr = ["a", "b", "c", "d"];

foreach ($arr as $key=>$val) {
    echo "<h1>$key - $val</h1>";
}
endforeach
(5)break 和 continue

break结束当前for、foreach、while、do-while或者switch结构的执行,后面可以跟一个参数,表示跳出几层循环,默认为1层。

复制代码
$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];

foreach ($arr1 as $key1=>$val1) {
    foreach ($arr2 as $key2=>$val2) {
        if ($val1 == "b1" && $val2 == "b2") {
            echo "--------";
            break;
        }
        echo "<h1>$val1 - $val2</h1>";
    }
}

此时就是break一层的情况,输出结果为:

如果改为break 2

复制代码
$arr1 = ["a1", "b1", "c1"];
$arr2 = ["a2", "b2", "c2"];

foreach ($arr1 as $key1=>$val1) {
    foreach ($arr2 as $key2=>$val2) {
        if ($val1 == "b1" && $val2 == "b2") {
            echo "--------";
            break 2;
        }
        echo "<h1>$val1 - $val2</h1>";
    }
}

continue在循环中用来跳过本次循环中剩余代码的执行,用法跟break差不多,也可以跟参数。

黑客资料分享

这年头,谁还没个"一夜暴富"的梦? 但网络安全这行,想靠"速成秘籍"变大佬?省省吧! 最近,不知道哪儿冒出来的"360联名黑客教程", 吹得天花乱坠,说什么"0基础到挖漏洞,包就业"。 真的假的? 今天就来扒一扒这玩意儿, 看看是真材实料, 还是又一个收割智商税的套路。

先说清楚,我不是来砸场子的。 免费分享技术资料,这事儿本身是好的。 但就怕挂羊头卖狗肉, 忽悠小白入坑。 这年头, "免费"的东西, 往往才是最贵的。

想白嫖?先掂量掂量自己是不是那块料!

复制代码
          ***需要的来找我拿⬇(无偿共享)\***

本教程比较珍贵,仅限大家自行学习,不要传播!更严禁商用!

教程内容:

    • 从零到精通完整闭环:基础攻防→渗透测试→应急响应→CTF实战,5大模块200+课时,比大学教材更贴近企业实战!"

    • 里面有很多渗透等方面的实战案例,手把手复现攻击链,比看小说更刺激!

    • 全网最全面的课程,不仅包含了入门必备的操作系统、计算机网络和编程语言等初级知识,而且包含了中级的各种渗透技术,并且还有后期的CTF对抗、区块链安全等高阶技术。

    • 比学校教的东西更贴近实战,比市面上那些机构教的东西还要专业

      完整学完你不管是去找工作、挖漏洞、还是护网、打CTF都问题不大!

这份资料,说是积累了十多年的技术教程, 听着挺唬人。 但我还是要泼一盆冷水: 资料再多, 不等于你就能学会。 关键在于, 你能不能把这些知识转化成自己的能力。 别光顾着收藏, 多花时间学习、实践才是正道!

视频教程 别光看, 跟着敲!

视频教程是好东西, 但也别光顾着看。 跟着视频一步一步敲代码, 遇到问题多思考、多查资料, 才能真正掌握技术。 别忘了, 编程这玩意儿, 靠的是手感!

PDF书籍 别只看, 啃透它!

书籍是系统学习的基石, 但也别只看目录。 找到一本好书, 就要沉下心来, 一页一页地啃透它。 别忘了, 理论是实践的先导!

工具安装包/源码 别乱用, 搞清楚原理!

工具是提升效率的利器, 但也别乱用。 搞清楚工具的原理、用法, 才能真正发挥它的作用。 别忘了, 工欲善其事, 必先利其器!

面试经验 别死记硬背, 理解才是关键!

面试是检验学习成果的试金石, 但也别死记硬背。 理解技术原理、掌握实战技能, 才能在面试中脱颖而出。 别忘了, 机会总是留给有准备的人!

最后, 我想对所有想入行网络安全的朋友说一句: 别指望靠一份资料就能成为大佬! 真正的成长, 靠的是持续学习、不断实践、永不放弃的精神!