PHP基本语法总结(非常详细),零基础入门到精通,看这一篇就够了


PHP 脚本以 <?php 开始,以 ?> 结束:

<?php
// PHP 代码
?>

输出语句

PHP 中使用 echoprint 语句来输出数据。

echo 和 print 区别:

echo - 可以输出一个或多个字符串

print - 只允许输出一个字符串,返回值总为 1

<?php
echo "Hello, World!";
?>

会输出Hello,World!

注释

PHP 支持三种注释方式:

单行注释:使用 //

单行注释:使用 # (较少使用)

多行注释:使用 /* */

<?php
// 这是一个单行注释
# 这也是一个单行注释
/*
这是一个多行注释
*/
?>

注释部分的代码不会被编译。

数据类型(变量)

变量是用于存储信息的"容器"

PHP 支持多种数据类型,包括但不限于:

字符串 (string):一系列字符。

整型 (integer):没有小数点的数字。

浮点型 (float):带有小数点的数字。

布尔型 (boolean):只有两个可能的值,truefalse

数组 (array):存储多个值的集合。

对象 (object):面向对象编程中的实例。

NULL:表示一个未定义的变量。

PHP 中的变量总是以 $ 符号开始,后面跟着变量名。

<?php
$myVar = "Hello";
echo $myVar;
?>

会输出Hello。

局部和全局作用域

在所有函数外部定义的变量,拥有全局作用域。除了函数外,全局变量可以被脚本中的任何部分访问,要在一个函数中访问一个全局变量,需要使用 global 关键字(这一点与c语言不同)。

<?php
$x=5;
$y=10;
 
function myTest()
{
    global $x,$y;
    $y=$x+$y;
}
 
myTest();
echo $y; // 输出 15
?>

PHP 将所有全局变量存储在一个名为 $GLOBALS[index] 的数组中。 index 保存变量的名称。这个数组可以在函数内部访问,也可以直接用来更新全局变量。

<?php
$x=5;
$y=10;
 
function myTest()
{
    $GLOBALS['y']=$GLOBALS['x']+$GLOBALS['y'];
} 
 
myTest();
echo $y;
?>

这样写也是正确的。

类型比较(松散比较与严格比较)

松散比较:使用两个等号 == 比较,只比较值,不比较类型。

严格比较:用三个等号 === 比较,除了比较值,也比较类型。

例如,“42” 是一个字符串而 42 是一个整数。FALSE 是一个布尔值而 “FALSE” 是一个字符串。

42与“42”值相等(使用返回true)类型不同(使用=返回false)

常量

PHP 中的常量是指一旦定义后其值不能被改变的标识符。

常量值被定义后,在脚本的其他任何地方都不能被改变。

常量可以用 define() 函数或 const 关键字来定义。

运算符

大部分与c语言相同,现列举几个c语言里没有的:

并置运算符

并置运算符 (.) 用于把两个字符串值连接起来。

例如:

<?php
$txt1="Hello world!";
$txt2="What a nice day!";
echo $txt1 . " " . $txt2;
?>

上面的代码将输出:Hello world! What a nice day!

a .= b相当于a = a . b。

不等于

php里不等于可以使用与c语言相同的!=也可以使用x <> y,也表示不等于。

还有绝对等于x === y,如果 x 等于 y,且它们类型相同,则返回 true。

不绝对等于x !== y,如果 x 不等于 y,或它们类型不相同,则返回 true。

除了值相等以外,类也会判断是否相同。

逻辑运算符

与可以使用&&或者and,或可以使用||或者or。

还有异或符号x xor y,如果 x 和 y 有且仅有一个为 true,则返回 true。

条件语句

与c语言基本相同。elseif它的else与if中间不用空格。

if 语句 - 在条件成立时执行代码

if…else 语句 - 在条件成立时执行一块代码,条件不成立时执行另一块代码

if…elseif…else 语句 - 在若干条件之一成立时执行一个代码块

switch 语句 - 在若干条件之一成立时执行一个代码块

if ($x > 0) {
    echo "正数";
} elseif ($x == 0) {
    echo "零";
} else {
    echo "负数";
}

数组

数组能够在单个变量中存储多个值:

<?php
$cars=array("Volvo","BMW","Toyota");
echo "I like " . $cars[0] . ", " . $cars[1] . " and " . $cars[2] . ".";
?>

同样类似于c语言。

运行结果为:I like Volvo, BMW and Toyota.

在 PHP 中,array() 函数用于创建数组

$cars=array("Volvo","BMW","Toyota");
$cars[0]="Volvo";
$cars[1]="BMW";
$cars[2]="Toyota";

这两种赋值方式均可。

count($数组名);可以返回数组的长度。

关联数组

$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
$age['Peter']="35";
$age['Ben']="37";
$age['Joe']="43";

类似于c++里stl中的一些东西,构成了键值对。

<?php
$age=array("Peter"=>"35","Ben"=>"37","Joe"=>"43");
echo "Peter is " . $age['Peter'] . " years old.";
?>

运行结果为:Peter is 35 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>";
}
?>

运行结果为:

Key=Peter, Value=35
Key=Ben, Value=37
Key=Joe, Value=43

数组排序

一般数组

sort($数组名)

按照值升序排列。

rsort($数组名)

按照值降序排列。

关联数组

asort($数组名)

根据数组的值,对关联数组进行升序排列。

arsort($数组名)

根据数组的值,对关联数组进行降序排列。

ksort($数组名)

根据数组的键,对关联数组进行升序排列。

krsort($数组名) 

根据数组的键,对关联数组进行降序排列。

循环

while,do while,for循环与c语言一致。

唯一要注意foreach循环。foreach 循环用于遍历数组。

foreach ($array as $value)
{
    要执行代码;
}

每进行一次循环,当前数组元素的值就会被赋值给 $value 变量(数组指针会逐一地移动),在进行下一次循环时,您将看到数组中的下一个值。

foreach ($array as $key => $value)
{
    要执行代码;
}

每一次循环,当前数组元素的键与值就都会被赋值给 $key 和 $value 变量(数字指针会逐一地移动),在进行下一次循环时,你将看到数组中的下一个键与值。

<?php
$x=array("Google","Runoob","Taobao");
foreach ($x as $value)
{
    echo $value . PHP_EOL;
}
?>

运行结果为:

Google
Runoob
Taobao

函数

语法:

<?php
function functionName()
{
    // 要执行的代码
}
?>

和JavaScript很相似,以function开头表示这是一个函数后面跟着它的名字。

其它与c语言类似,有可以有传入值,通过return返回值。

变量函数

变量函数是指在 PHP 中,将一个变量作为函数名来调用的函数。

$func = 'foo';
$func();        // 调用 foo()函数

$func = 'bar';
$func('test');  // 调用 bar()函数

$func = 'echoit';
$func('test');  // 调用 echoit()函数

魔术常量

__LINE__用于显示文件中的当前行号。

__FILE__用于显示文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。

__DIR__显示用于文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。

__FUNCTION__在函数类返回该函数被定义时的名字(区分大小写)。

__CLASS__在类里面返回该类被定义时的名字(区分大小写)。

__TRAIT__实现代码复用,优先顺序是当前类中的方法会覆盖 trait 方法,而 trait 方法又覆盖了基类中的方法。

__METHOD__显示类的方法名,返回该方法被定义时的名字(区分大小写)。

__NAMESPACE__得到当前命名空间的名称(区分大小写)。

命名空间

用来解决重名问题。

默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。

<?php  
// 定义代码在 'MyProject' 命名空间中  
namespace MyProject;  
 
// ... 代码 ...  

同一个文件中可以有不同的命名空间。建议使用大括号括起来。

<?php
namespace MyProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}

namespace AnotherProject {
    const CONNECT_OK = 1;
    class Connection { /* ... */ }
    function connect() { /* ... */  }
}
?>

超级全局变量

$GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问。

 $GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y']; 

相当于z = x + y。

$_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。具体查每样信息的语法可以百度查询。

PHP $_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>

PHP $_POST 被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“post”。

<html>
<body>
 
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
Name: <input type="text" name="fname">
<input type="submit">
</form>
 
<?php 
$name = $_POST['fname']; 
echo $name; 
?>
 
</body>
</html>

PHP $_GET 同样被广泛应用于收集表单数据,在HTML form标签的指定该属性:"method=“get”。

面向对象

− 定义了一件事物的抽象特点。类的定义包含了数据的形式以及对数据的操作。

对象 − 是类的实例。

成员变量 − 定义在类内部的变量。该变量的值对外是不可见的,但是可以通过成员函数访问,在类被实例化为对象后,该变量即可成为对象的属性。

成员函数 − 定义在类的内部,可用于访问对象的数据。

继承 − 继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

父类 − 一个类被其他类继承,可将该类称为父类,或基类,或超类。

子类 − 一个类继承其他类称为子类,也可称为派生类。

多态 − 多态性是指相同的函数或方法可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。

重载 − 简单说,就是函数或者方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互相称之为重载函数或者方法。

抽象性 − 抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。

封装 − 封装是指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。

构造函数 − 主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。

析构函数 − 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。析构函数往往用来做"清理善后" 的工作(例如在建立对象时用new开辟了一片内存空间,应在退出前在析构函数中用delete释放)。

使用new运算符创建对象。

$runoob = new Site;
$taobao = new Site;
$google = new Site;

构造与析构函数

在c++中构造函数与类同名,析构函数是构造函数名前加上一个~,但在php里构造函数与析构函数有固定的名字:

\_\_construct与\_\_destruct

构造函数:

function __construct( $par1, $par2 ) {
   $this->url = $par1;
   $this->title = $par2;
}

析构函数:

 function __destruct() {
       print "销毁 " . $this->name . "\n";
   }

继承

继承使用extends,php不支持多继承。

class Child extends Parent {
   // 代码部分
}

方法重写和访问权限基本与c++相同,不多赘述。

接口interface

使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。

接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。

接口中定义的所有方法都必须是公有,这是接口的特性。

要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。

<?php

// 声明一个'iTemplate'接口
interface iTemplate
{
    public function setVariable($name, $var);
    public function getHtml($template);
}


// 实现接口
class Template implements iTemplate
{
    private $vars = array();
  
    public function setVariable($name, $var)
    {
        $this->vars[$name] = $var;
    }
  
    public function getHtml($template)
    {
        foreach($this->vars as $name => $value) {
            $template = str_replace('{' . $name . '}', $value, $template);
        }
 
        return $template;
    }
}

常量

可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。

 const constant = '常量值';

抽象类

任何一个类,如果它里面至少有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的。

定义为抽象的类不能被实例化。

类似于多态。

<?php
abstract class AbstractClass
{
 // 强制要求子类定义这些方法
    abstract protected function getValue();
    abstract protected function prefixValue($prefix);

    // 普通方法(非抽象方法)
    public function printOut() {
        print $this->getValue() . PHP_EOL;
    }
}

class ConcreteClass1 extends AbstractClass
{
    protected function getValue() {
        return "ConcreteClass1";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass1";
    }
}

class ConcreteClass2 extends AbstractClass
{
    public function getValue() {
        return "ConcreteClass2";
    }

    public function prefixValue($prefix) {
        return "{$prefix}ConcreteClass2";
    }
}

$class1 = new ConcreteClass1;
$class1->printOut();
echo $class1->prefixValue('FOO_') . PHP_EOL;

$class2 = new ConcreteClass2;
$class2->printOut();
echo $class2->prefixValue('FOO_') . PHP_EOL;
?>

static与final关键字

声明类属性或方法为 static(静态),就可以不实例化类而直接访问。静态属性不可以由对象通过 -> 操作符来访问。

  public static $my_static = 'foo';

如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。

调用父类构造方法

PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用 parent::__construct()

java里使用的是super,php使用用parent。

 parent::__construct(); 

—END—

题外话

根据腾讯安全发布的《互联网安全报告》,目前中国网络安全人才供应严重匮乏,每年高校安全专业培养人才仅有3万余人,而网络安全岗位缺口已达70万,缺口高达95%。

在这里插入图片描述

我们到招聘网站上,搜索【网络安全】【Web安全工程师】【渗透测试】等职位名称,可以看到安全岗位薪酬待遇好,随着工龄和薪酬增长,呈现「越老越吃香」的情况。

在这里插入图片描述

我们看一看招聘网站技术向网络工程师的招聘要求,平均薪资水平相当可观:

在这里插入图片描述

零基础入门渗透测试/网络安全

【----帮助网安学习,以下所有学习资料文末免费领取!----】

> ① 网安学习成长路径思维导图
> ② 60+网安经典常用工具包
> ③ 100+SRC漏洞分析报告
> ④ 150+网安攻防实战技术电子书
> ⑤ 最权威CISSP 认证考试指南+题库
> ⑥ 超1800页CTF实战技巧手册
> ⑦ 最新网安大厂面试题合集(含答案)
> ⑧ APP客户端安全检测指南(安卓+IOS)

大纲

首先要找一份详细的大纲。

在这里插入图片描述

学习教程

第一阶段:零基础入门系列教程

img

该阶段学完即可年薪15w+

第二阶段:技术入门

弱口令与口令爆破
XSS漏洞
CSRF漏洞
SSRF漏洞
XXE漏洞
SQL注入
任意文件操作漏洞
业务逻辑漏洞

该阶段学完年薪25w+

img

阶段三:高阶提升

反序列化漏洞
RCE
综合靶场实操项目
内网渗透
流量分析
日志分析
恶意代码分析
应急响应
实战训练

该阶段学完即可年薪30w+

面试刷题

img
在这里插入图片描述

最后,我其实要给部分人泼冷水,因为说实话,上面讲到的资料包获取没有任何的门槛。

但是,我觉得很多人拿到了却并不会去学习。

大部分人的问题看似是“如何行动”,其实是“无法开始”。

几乎任何一个领域都是这样,所谓“万事开头难”,绝大多数人都卡在第一步,还没开始就自己把自己淘汰出局了。

如果你真的确信自己喜欢网络安全/黑客技术,马上行动起来,比一切都重要

资料领取

上述这份完整版的网络安全学习资料已经上传网盘,朋友们如果需要可以微信扫描下方二维码 ↓↓↓ 或者 点击以下链接都可以领取

点击领取 《网络安全&黑客&入门进阶学习资源包》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值