视频:https://www.bilibili.com/video/BV18x411H7qD?p=3
基础
Web分为两类:静态网站和动态网站。流程:浏览器发起访问->DNS解析域名->服务器电脑->服务软件
1、静态网站访问原理:
必备工具:1、有两台电脑,PC(个人电脑),里面需要有浏览器;另外一台为服务器(需要有服务软件,假设为APACHE),软件没有数据,故需在里面添加文件夹(准备访问的文件/网页)2、下面蓝线代表两个在同一个互联网下。
访问流程:1、在浏览器中需输入URL(uniformed resource location,统一资源定位,即互联网的绝对路径);2、第一部需要经过URL的解析(DNS,DNS内部包含本地DNS与网络DNS,,访问本地DNS无需通过网络,可提高效率。如果本地DNS无法转化IP,就需要网络DNS)。3、DNS将转换后的IP地址返回给浏览器。4、浏览器通过IP地址找到服务器。5、(虽然找到了服务器,但服务器里面资源很多,如何找自己想要的APACH?)这就需要利用端口,APACHE的端口为80。6、访问APACHE后,即可找到要访问的内容(IP地址后的/index.html也称为URI(uniformed resource identify,统一资源标志。目标机器上相对某个文件夹的相对路径,,,注/即为根目录,相对根目录所以其为相对路径)).7、Apache根据URI读取文件,读取文件的内容(注意只是读取)。8、Apache读取文件后,返回结果。9、浏览器看之前,需要经过浏览器解析,才可展示给用户。(所有人访问的时候,都访问的一样的index文件,若要改变显示的信息,就需要改变index,比较麻烦)
2、动态网站访问
区别:相对静态网站访问多了几个步骤:需要服务器端解析;需要数据库
在访问内容时,Apache不能识别PHP(只能识别html),需通过PHP引擎读取PHP代码。读取PHP代码之后需要进行解析,解析过程中可能需要数据库。PHP引擎通过数据库,找到内容以后再返回给Apache。(注意,PHP引擎得到的内容是PHP代码,但交给Apache的是HTML内容,,,因为浏览器只能解析html文件)
3、C/S、B/S

软件设计结构:C/S、B/S
C/S:Client客户端/Server服务端,用户需要安装客户端产品才能访问服务器,且只能访问一种软件(自己的)
B/S:Browser浏览器/Server服务端,用户只需要安装浏览器,就可以访问所有的服务器(B/S架构服务)。
4、MySQL访问流程
Mysql是一款C/S架构的软件,需要通过客户端来访问服务端
运行:1、启用MySQL客户端:mysqi.exe
2、mysql.exe通过cmd运行(安装配置环境变量后可这样运行)
操作:由于qq服务器不在自己的电脑(即客户端与服务器可分离),故MySQL客户端访问服务器需进行寻找匹配:连接认证
a、连接:IP端口和确认。。。如果是本地,均可省略
命令:-h 主机地址 -hlocalhost(或IP) localhost是主机名 -P 端口 -P3306(MySQL服务器的端口默认是3306)
b、认证:通过用户名和密码进入服务器。
-u 用户名 -uroot*(不可省略,匿名用户除外) *-p 密码 -proot
退出命令行:\q
注意:通常连接认证的时候不建议密码明文,可在输入-p之后回车,系统会再次让输入密码,此时为密文。
5、PHP连接MySQL数据库
PHP本身不具备操作MySQL数据库的能力,需要借助MySQL扩展来实现。
1、PHP加载MySQL扩展:php.ini文件中。(不要用记事本打开)
2、PHP中所有扩展都是在ext的文件夹中,需要指定扩展所在路径:extension_dir。
3、php.ini已经被Apache重载,故需要重启才可。
6、设定系统时区
7、配置虚拟主机
一台服务器若只能部署一个网站,则非常浪费。故需通过其他渠道实现一台主机上部署多个网站。
虚拟主机:Virtual machine,并不存在的主机,但可提供真实主机所实现的功能。虚拟主机是将计算机中不同的文件夹进行不同的命名,然后可实现让服务器(Apache)根据用户的需求从不同的文件夹(网站)中读取不同的内容。
分类:在Apache中,可将虚拟主机划分为两类
1、基于IP的虚拟主机,一台电脑上有多个IP,每个IP对应一个网站。
原理:电脑默认只有一个IP,因为通常只有一个网卡,但有的电脑可配置多个网卡,每个网卡可绑定一个IP地址。
2、基于域名的虚拟主机:一台主机只有一个IP,但IP下课制作多个网站,但需给每个网站不同的名字。
基础语法
初步语法
PHP是一种运行在服务器端的脚本语言,可以嵌入到HTML中。(HTML是通过浏览器解析,PHP是通过PHP引擎解析,那么嵌入到里面以后如何区分什么时候通过什么来解析?)
PHP代码标记:可通过多种标记来区分PHP脚本
ASP标记 <% php 代码 %>; 短标记 Php 代码 ?> 以上两种基本弃用,如使用,需在配置文件中开启
脚本标记 :也不经常用

标准标记:

PHP注释:行注释://(双斜杠)或# 块注释:/* */
PHP语句分隔符:
1、在PHP中,代码以行为单位,系统需要通过判断行的结束,通常都用;表示结束。
注注注:PHP中标记结束符?>有自带语句结束符的效果,最后一行PHP代码可以没有语句结束符。
2、PHP中代码的书写并不是全嵌入到HTML中,而是单独存在,所以可以不用标记结束符?>
变量
1、变量是用来存储数据的; 2、变量是存在名字的;
3、变量是通过名字访问数据的; 4、变量的数据是可以改变的。
变量的使用
1、定义:在系统中增加对应的变量名字(在内存中开发一块地)
2、赋值:将数据赋值给变量(在定义时直接初始化)
3、可通过变量名访问数据
4、变量可从内存中删除
// 定义时不需要关键字,但必须使用$符号 |
变量命名规则
1、变量名字必须以”$”开头;
2、变量名可由数字、字母、下划线命名,但必须以字母和下划线开头
3、允许中文变量;
预定义变量
即提前定义的变量,由系统定义的变量,存储许多要用到的数据(预定义变量都是数组)。
可变变量
如果一个变量保存的值刚好是另外一个变量的名字,则可直接通过访问一个变量得到另外一个变量的值:但需在变量前多加一个$符号
$a = 'b'; // a变量的内容正好是b变量的名称,故称a为可变变量 |
变量传值
将一个变量赋值给另一个变量:值传递、引用传递
值传递:将变量保存的值复制一份,并将该值给另外一个变量保存(两个变量无关系)
引用传递:将变量保存值所在的内存地址传递给另外一个变量,两个变量同指一块内存(名字不一样而已)。
分区
注:c++中,栈区由编译器自动释放,存储局部变量和函数参数;代码区存放函数的二进制代码,由操作系统管理;全局区存放全局变量、静态变量、常量;堆区由程序员分配释放。
值传递
// 值传递 |
讲解运行步骤:
1、代码装载:从脚本文件中将代码读取出来,进行编译,将编译结果存放到代码段(二进制)。
2、代码执行:从代码段中一行一行执行代码。
3、脚本执行结束:系统会回收所有内存(栈区、代码区):因为数据段与栈区有关系,回收栈后,数据段的内容无意义,相当于回收。

引用传递
// 引用传递 |
常量
常量与变量一样,均是用来保存数据的。
常量的基本概念
const/constant:是在程序运行中,不可改变的量(数据);常量一旦定义,通常不可更改。
常量定义的形式
定义方式
1、使用定义常量的函数:define(’常量名’,常量值)——类似于c++的 #define
2、const
|
常量命名规则:
1、常量不需要使用”$”符号,一旦使用被认为是变量
2、变量名可由数字、字母、下划线命名,但必须以字母和下划线开头(const定义)
3、常量的名字通常是以大写字母为主(与变量以示区别)
4、变量命名的规则比变量要松散,可以使用一些特殊字符(define函数)
5、变量通常不区分大小写,但可以区分(define函数的第三个参数)
系统常量
魔术常量:由双下划线+常量名+双下划线组成,其值会随着环境变化而变化,用户无法改变。
数据类型
数据类型:data type,在PHP中指的是数据本身的类型,而不是变量的类型。PHP是一种弱类型语言,变量本身没有数据类型。
PHP八大数据类型
类型转换
很多情况需要指定数据类型,需要将外部数据类型(当前PHP获得的数据)转换成目标数据类型。
两种转化方式:
1、自动转化:系统根据自己的需求判断,自己转化(用的较多、但效率较低)。
2、强制转换(手动):在变量之前增加一个(),并在括号里面写上对于的类型,其中NULL特殊,需用unset。
转换说明:
1、以字母开头的字符串,永远为0;
2、以数字开头的字符串,取到碰到字符串为止。(不会同时包含两个小数点)
|
整数类型
|
浮点数类型
问:为什么浮点数和整型均占用四个字节,为什么比整型表示的范围大?
整型数据的32位均通过*2转化为十进制。而浮点型中,前八位的后七位为指数,所以表示的范围要大。
另,实际使用时,尽量不用浮点型数字做精确判断,且计算机中凡是小数基本上均不准确。
|
运算符
|
流程控制
分类:顺序结构、分支结构(if分支与switch分支)、循环结构
|
流程控制替代语法

上述书写中(tr 代表表格的一行,td代表表格的一列),大括号很容易丢失,所以PHP有了一种替代机制,让其可以不用书写大括号。
for(;;){ => : }=>endfor;

文件包含
文件包含:在一个PHP脚本中,将另外一个文件包含进来,合作完成一件事情。
文件包含作用
1、要么使用被包含文件中的内容,实现代码共享,向上包含(索要)
2、要么自己的东西可被使用,向下包含(给予):自己有某个东西需要别的脚本显示。
最大的作用是分工协作,共同完成一件事情。
文件包含四种形式
|
文件加载原理
PHP代码执行流程:
1、读取代码文件(相当于PHP程序);
2、编译:将PHP代码转化成字节码(二进制),生成opcode(php可解析的代码);
3、针对引擎来解析opcode,按照细节码进行逻辑运算;
4 转化成对应的html代码。
1、在文件加载(include 或 require)时,系统会自动嵌入对应的include位置
2、在PHP中,被包含的文件是单独编译的。。
若编译过程中报错,则会失败,不执行。但若是被包含文件有错误,则系统执行到include语句时,才回报错。
include 和 require区别

include会执行多次,导致报错(重复定义变量)。。而include_once不会出现这种情况。
require和include区别在于:若未包含文件,则报错形式不一样。(require包含错误文件,则include后不再执行;include未包含文件,会警告,但是仍会执行后面的。)
文件加载路径
文件加载时需指定文件路径,才能保证PHP正确找到对应的文件。
1、绝对路径(从磁盘根目录开始—本地绝对路径;从网站根目录开始—网络绝对路径–相对于/的路径,,/相当于绝对路径)
2、相对路径:从当前文件所在目录开始的路径。。.或者./表示当前文件夹。。../上级目录
绝对路径和相对路径加载区别:绝对路径相对效率偏低(因为要从跟目录开始找,但相对安全,路径固定)
|
文件嵌套包含

嵌套包含容易出现相对路径出错的问题。
函数
将实现某一功能的代码块封装到一个结构中,从而实现代码的复用。
函数定义语法(与c的差别在于可在任意位置调用子函数)
/* |
函数参数
|
函数返回值

作用域(与c差别在于全局变量不能直接被函数调用)
作用域:通常是指变量可以被访问的区域。
在PHP中,作用域严格分为两种,以及内部定义的一种
1、全局变量:所属全局空间,在PHP中只允许在全局空间使用,函数内部不可用。(c++可使用)
2、局部变量:函数内部的变量
3、超全局变量:预定义变量(系统定义的),没有访问限制,能够帮助局部去访问全局变量。
php |
想在函数内部访问全局变量,可通过$GLOBALS,也可使用引用传值。
另,还有一种方式既可从全局访问局部、也可从局部访问全局。即,global关键字:
1、若使用global定义的关键字在外部存在,那么系统在函数内部定义的变量直接指向外部变量所指向的内存空间(同一个变量)。
2、若其定义的变量在外部不存在,系统会自动在全局空间定义一个与局部变量同名的全局变量。
本质为:在函数的内部和外部,对一个同名变量使用同一块内存地址保存数据。
php |
静态变量
静态变量:static是在函数内部定义的变量,使用static关键字修饰,用来实现夸函数共享数据的变量(注:跨函数是指同个函数多次调用)。

静态变量原理:系统在进行编译的时候,就已经对static这一行进行了初始化:即为静态变量赋值。。。而在执行时,会跳过初始化这一行。
可变函数(未写全)
|
匿名函数
|
伪类型
PHP中不存在的类型,只是为了方便查看操作手册。(可当作模板,只是为了泛化数据类型)
伪类型有两类:mixed混合的,只要是php中的类型即可;numbe数值的
常用系统函数
|
错误处理
错误处理:指系统或用户在对某些代码进行执行的时候,发现有错误,就会通过错误处理的形式告诉程序员。
错误分类
1、语法错误:书写代码不符合PHP语法规范,会导致代码在编译中不允许,故也不会执行(parse error);
2、运行时错误:代码编译通过,但在执行时会出现一些条件不满足从而导致的错误。(runtime error取空数组的第几位数)
3、逻辑错误:写代码不规范、但逻辑性错误,导致虽可正常运行,但得不到预期结果。
错误代号
系统代号在PHP中均被定义为了系统常量,故可直接使用:
1、系统错误(系统使用的代号):
E_PARSE:编译错误,代码不会运行
E_ERROR:fatal error致命错误,会在出错的位置断掉
E_WARNING:warning警告错误,不影响执行,但可能得不到预期结果
E_NOTICE:notice,通知错误、不影响代码执行
2、用户错误(用户使用的代号):E_USER_ERROR、E_USER_WARNING、E_USER_NOTICE用户在使用自定义错误出发的时候,会使用道德错误代号。
3、E_ALL:代表所有错误
所有E开头的错误常量都由一个字节(8位)存储,且每一种错误占用一个位,故可进行位操作。
排除通知级别notice:E_ALL & ~E_NOTICE 。。假设ALL全为1,那么与NOTICE取反再取与就可把其剔除
只要警告和同志:E_WARNING | E_NOTICE
错误触发
程序运行时触发:主要针对代码的语法错误和运行时错误。
人为触发:知道某些逻辑可能会出错,从而使用对应的代码编号来判断
|

错误显示设置(未全)
字符串类型
字符串定义语法
|
转义字符串
字符串转义:在计算机通用协议中,有一些特定方式定义的字母,系统会特定处理;反斜杠+字母
':在单引号字符串中显示单引号 " 在双引号字符串中显示双引号 \r:回车 \n:换行 \t:四个空格 $
区别:上述转义符中,单引号只能识别'。而双引号中不能识别';
双引号中变量识别规则:
1、变量本身系统能够与后面的内容区分;即应该保证变量的独立性,不要使系统难以识别。
2、使用变量专业标识符,即给变量加一组{};
结构化字符串变量的规则
1、结构化定义字符串对应的边界符有条件
1.1 上边界符和后面不能有任何东西(包括注释)
1.2 下边界符必须顶格
1.3 下边界符后面只能跟分号
2、结构化定义字符串内部均是字符串本身(包括空格、换行、注释等)
字符串长度问题
|
字符串相关函数
数组(元素下标均和c++不一样)
数组:数据的组合,指将一组数据(多个)存储到一个指定的容器中,并用变量指向该容器,然后可用变量一次性取得该容器的所有数据。
定义语法
|
PHP数组特点
1、可以整数下标或者字符串下标
若数组下标均为整数,则称为索引数组
若数组下标均为字符串,则称为关联数组。
混合下标的话称为混合数组
2、数组元素的顺序以放入顺序为准,与下标无关
3、数字下标的增长特性:从0开始自动增长,若中间手动加入较大的下标,则后面则会从当前最大下标+1增长。
4、特殊值下标的自动转换
|
5、PHP数组中类型元素没有限制。
6、PHP中数组元素没有长度限制。c++ vector
补充:PHP中数组是很大的数据,故会存储在堆区。
多维数组


数组遍历
Foreach语法
|
foreach遍历原理
for循环遍历
|
while配合each和list遍历数组


由于不存在下标1,而list只能从0开始依次查找,故上述会报错。

数组相关的函数
|



编程思想
递推算法
利用特定关系得出中间推论,直至得到结果的算法。。。分为顺推和逆推两种
顺推:通过最简单的条件,逐步推演结果。
逆推,通过结果找到规律,从而推到已知条件。
递归算法
把问题转化为规模缩小了的同类问题的子问题。然后递归调用函数以表达问题的解。
简化问题,找到最优子问题。
递归的本质是函数调用:一个函数需要开辟一块内存,递归会出现同时调用多个函数,故占用很多内存。
冒泡排序
1、比较相邻元素,若前一个比后一个大,则交换。
2、对每一对相邻元素进行1操作,直至最后一对。此时最后一个因为最大值。
3、除最后一个外,重复以上操作
4、重复以上操作,直至排序完成。
|
选择排序
1、假设第一个元素为最小元素,记下下标
2、寻找右侧剩余元素,若有更小的,则记下更小的下标
3、一行对比完成后,交换第一个和最小的元素
4、重新开始以上操作
|
插入排序
1、认定一个第一个元素已经排好序;
2、取出第二个元素作为待插入元素;
3、将待插入元素与已排好元素比较;
4、若小于已排好元素,则说明前面排序未在正确位置,应该向后移动,让新元素插入进去
5、重复以上操作,直到该元素插入完毕
6、重复操作,直至所有元素完毕
|
快速排序法:
|
|
归并排序
|
1、将数组拆分成两个数组
2、重复步骤1,将数组拆分成最小单元
3、然后二路归并
4、重复步骤直至完成
|
查找算法
|