前端学习从入门到高级全程记录之38 (PHP基础Ⅰ)

学习目标

那么,从本期开始我们就要一起学习PHP的相关知识了。

1 服务端开发基础

1.1 建立你的第一个网站(目标)

前端开发 最终还是属于 Web 开发 中的一个分支,想要成为一名合格的前端开发人员,就必须要 充分理解 Web 的概念。

构建一个专业的网站是一项巨大的工作!对于新手我们应该从小事做起,也就是说咱们不可能立马就要求自己能够 开发出跟淘宝一样的电商平台,但是对咱们来说建立一个属于自己的 Blog 网站并不难(其实再大的系统也是由一 些基础功能叠加出来的),所以咱们就从这个话题开始学习。

1.2 如何建立一个 Blog 网站

提问:到底什么是网站?

  1. 可以在浏览器上通过一个地址直接访问使用
  2. 用于提供一种(或多种)特定服务的一系列具备相关性的网页组合的整体
  3. 例如:博客、门户、电商、在线教育等

有了明确的目标过后,我们需要规划具体的业务方案,学习特定的技能,完成各项功能,解决各种过程中出现的问 题。

在这里插入图片描述

1.2.1 之前学习了什么

在之前的学习过程中,我们很专注,没有关心这些东西在整体中是什么角色,起到什么作用。这里我们是时候总结 一下我们之前学过了的内容:

网页开发技术(硬性)

  1. HTML —— 网页内容结构(GUI)
  2. CSS —— 网页外观样式(GUI)
  3. JavaScript —— 编程语言(可以用于调用浏览器提供的 API)
  4. Web APIs —— 网页交互(界面功能)
  5. jQuery —— 便捷手段(糖果而已,不是必要的)

编程能力 / 编程思想 / 解决问题的思路(软性)
1.我要做什么(我要得到什么),我目前有什么(我能拿到什么)

至此,我们已经可以独立完成网页开发了,具体能完成的东西就是一个一个的网页,而且还能给这个页面加上一些 动态的交互。但是这距离成为一个网站还有一些路要走。
在这里插入图片描述

1.2.2 还需要学习什么?

想要完成完整的 Web 网站,还需要学习什么?

  1. 搭建 WEB 服务器(提供网站服务的机器)
  2. HTTP(浏览器与服务端的通讯协议)
  3. 服务端开发(动态网页技术)
  4. 数据库操作(服务端存储数据方式)
  5. AJAX(浏览器与服务端的数据交互方式)

1.3 搭建 Web 服务器

  1. 服务器(提供服务)指的就是一台安装特定的软件的公共计算机,用于专门用于提供特定的服务。 按照服务类型的不同,又划分为:Web 服务器、数据库服务器、文件服务器等等。
  2. 客户端(使用服务)指的是在一次服务过程中使用这个服务的设备(网络端点)。 目前咱们最常见的客户端就是浏览器

我们手头上的这些网页,如果想要成为一个网站,首先要完成的第一件事就是有一台公共的 Web 服务器,把这一 系列的页面放到这台 Web 服务器上,让用户可以通过服务器的地址访问到这些网页。

思考:为什么不把这些网页放在我们自己电脑上呢?

那么,哪里有这样的服务器呢?

我们手头上的电脑都可以是一台服务器,因为服务器是一个相对的概念,只要能提供服务就可以是一个服务器(提 供服务的时候就是服务端,使用服务的时候就是客户端)。

既然服务器就是安装特定的软件的计算机,那么要让自己的成为 Web 服务器就是要安装一个 Web 服务器软件。

1.3.1

Nginx ········································ 反向代理

Apache ····································· PHP

IIS ·············································· ASP.NET

Tomcat ····································· Java

1.3.2 安装 Web 服务器软件

这里我们选择一个比较常用的 Web 服务器软件:Apache HTTP Server。

如果使用的是安装版,与其他软件相同,安装无外乎就是一路点下一步,只是需要注意安装目录路径中不要 有中文。

由于最新的 Apache 已经不提供 Windows 的安装版本了,所以我们这里使用的是解压版。

下载地址:https://www.apachelounge.com/download/
使用说明:https://httpd.apache.org/docs/current/platform/windows.html

安装方式如下,先解压到纯英文路径的文件夹,然后执行以下命令:

1	# 注意:需要使用管理员身份运行命令行!!!
2	# 切换到 Apache 解压路径中的 bin 目录
3	$ cd <解压目录>/bin
4	# 安装 Apache 服务,‐n 参数是指定服务名称
5	$ httpd.exe ‐k install ‐n "Apache"
6	# 如果需要卸载 Apache,可以执行以下命令
7	$ httpd.exe ‐k uninstall ‐n "Apache"

执行安装命令过后会报一个错,原因是默认的配置文件有问题,需要先调整一下配置文件 正常启动服务。
在这里插入图片描述
找到 Apache 解压目录中的 conf 目录下的 httpd.conf 文件,定位到 37 行,将 改为解压目录,我这里解压到路径是C:/Develop/apache ,所以我这里修改
在这里插入图片描述
修改完以后,执行以下命令重新测试配置文件是否通过。

1	$ httpd.exe ‐t

这里仍然报错:
在这里插入图片描述
通过错误信息得知,这里是因为另外一个地方配置的目录不存在导致的,所以接着调整 246 行的DocumentRoot 选项:
在这里插入图片描述
随即,我们发现这个配置文件中有很多默认配置选项中的路径都是 压的目录路径。

然后重新执行httpd.exe -t 测试配置文件,这时候应该提示Syntax OK 。

如果有关于 ServerName 的警告提示,不用管它,暂时还不会影响我们接下来的使用和操作。

接着运行以下命令重新启动 Apache 服务:

1	# 注意:需要使用管理员身份运行命令行!!!
2	$ httpd.exe ‐k start ‐n "Apache" 3	# 重新启动 Apache 服务
4	$ httpd.exe ‐k restart ‐n "Apache"
5	# 停止 Apache 服务
6	$ httpd.exe ‐k stop ‐n "Apache"

回到浏览器中,地址栏输入:http://localhost/,回车访问,这时正常应该看到 It works!
在这里插入图片描述
当然,这里可能描述的不是太详细,大家可以百度相关内容,自行安装。

1.3.3 提供 Web 服务

启动 Apache,让别人可以使用你机器上安装的 Apache 提供的 Web 服务,访问你机器上的网站。这种情况下你 的机器就是服务器,别人的机器就是客户端。

注意:

  1. 确保配置文件语法检查通过

  2. 确保 80端口没有被其他程序占用

  3. 确保防火墙允许80端口的请求,或者干脆关掉防火墙

  4. 如果出现 Forbidden 情况,确保配置文件http.conf中 247 行(DocumentRoot之后)的Directory配置的与DocumentRoot路径相同

  5. 我们在开发阶段大多数都是自己访问自己机器上的网站,那这种情况下,我们既是服务端又是客户端。对于 新手来说,最常见的问题就是分不清楚哪是客户端应该有的,哪是服务端应该有的。这种时候一定要保持清 醒,客户端局限在浏览器窗口,代码以及 Apache 相关的文件和配置都是放在服务端的。

1.4 网络基础概念(必要)

1.4.1 IP 地址

Internet Protocol Address

设备在某一个网络中的地址,目前最常见的格式: [0-255].[0-255].[0-255].[0-255] 即为四个 0-255 的数字组 成。

作用就是标识一个网络设备(计算机、手机、电视)在某一个具体的网络当中的地址。

127.0.0.1 是本地回环地址

1.4.2 单个网络情况

在单个局域网下,结构非常简单,就是我们所连接的网络设备(网关)给我们分配了一个地址,在这个范围之内我 们都可以通过这个地址找到我们的这个设备。

如果设备没有连接任何网络情况下,我们会有一个本地回环地址 127.0.0.1

在这里插入图片描述

1.4.3 多个网络情况

但是当一个设备同时处于多个网络下(比如同时连接了有线网卡和无线网卡),就会变得稍微复杂一点:
在这里插入图片描述
例如:

小明这个同学同时报名了两个课程,在 A 班级小明是班长,所有 A 班级的同学都管他叫班长(叫班长就能找 到他)。而在 B 班级小明是课代表,所有 B 班的同学都管他叫课代表(叫课代表就能找到他)。

同样的一个人在不同的环境有不同的身份,这些身份只有特定的环境才生效。

纸上得来终觉浅,绝知此事要躬行!多尝试,多思考才能更好的理解这个问题。

1.4.4 域名

由于 IP 地址都是没有规律的一些数字组成的,很难被人记住,不利于广泛传播,所以就有人想出来要给 IP 起名字
(别名)。

域名是需要花钱注册的
1.4.5 DNS

通过宽带运营商提供的服务器解析一个域名背后对应的 IP,这个过程叫做 DNS 寻址,帮你完成 DNS 寻址过程的 服务器叫做 DNS 服务器。

1.4.6 hosts 文件

操作系统在发起对 DNS 服务器的查询请求之前,会优先检查本机的 hosts 文件。如果这个文件中包含了对当前需 要解析的域名的配置,则不再发起对 DNS 服务器的请求,直接使用 hosts 文件中的配置。

文件所在路径:
Windows:C:\Windows\System32\drivers\etc\hosts

macOS: /etc/hosts

注意:
本机的 hosts 文件配置只能到影响本机的 DNS 寻址 只有以管理员权限运行的编辑器才有权利修改 hosts 文件

1.4.7 端口

计算机本身是一个封闭的环境,就像是一个大楼,如果需要有数据通信往来,必须有门,这个门在术语中就叫端 口,每一个端口都有一个编号,每台计算机只有 65536 个端口(0-65535)。

一般我们把“占门”的过程叫做监听

可以通过在命令行中运行: netstat -an 命令监视本机端口使用情况:
在这里插入图片描述
参考链接:

  1. https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E5%8F%A3

  2. https://baike.baidu.com/item/%E7%AB%AF%E5%8F%A3 http 默认的端口 80 https 默认的端

  3. http默认的端口是80

  4. https默认的端口是443

1.4.8 URL

URL(Uniform Resource Locator),统一资源定位符,通俗点来说就是表示网络当中某一个网页的完整访问地 址,它具有一定的格式:
在这里插入图片描述

1.5 请求响应流程

在这里插入图片描述

  1. 用户打开浏览器

  2. 地址栏输入我们需要访问的网站网址(URL)

  3. 浏览器通过 DNS 服务器获取即将访问的网站 IP 地址

  4. 浏览器发起一个对这个 IP 的请求

  5. 服务端接收到这个请求,进行相应的处理

  6. 服务端将处理完的结果返回给客户端浏览器

  7. 浏览器将服务端返回的结果呈现到界面上

1.6 配置 Apache

配置文档:http://httpd.apache.org/docs/current/

配置文件中行首的 # 指的是注释

注意:以下所记录的行号仅供参考,不同版本的配置文件可能不尽相同。

1.6.1 监听端口

监听端口可以随意修改为任意一个未被其他程序监听的端口,可以通过设置配置文件httpd.conf中的Listener 指令后面的数字修改。
在这里插入图片描述

1.6.2 网站根目录

网站根目录就是存放我们网站文件的最顶层目录,通常 URL 中域名后面的第一个斜线对应(映射)的就是网 站根目录。

默认文档指的是我们在访问某一个目录时(没有指定具体的文件),默认访问的文件叫做默认文档 注:动态网站情况会比较特殊,需要单独考虑,不一定是这个规则。

默认 Apache 的网站根目录是安装目录中的 htdocs文件夹,为了方便对网站文件的管理,一般我们会将其设置在
一个自定义目录中(如果你不介意其实不修改也无所谓)。

如果需要设置网站根目录,可以通过修改配置文件httpd.conf 中的网站根目录选项切换。
在这里插入图片描述
其中,红框第一行的意思是:网站根目录地址,第二行是设置此目录的权限是否可被访问。

1.6.3 默认文档

当客户端访问的是一个目录而不是具体文件时,服务端默认返回这个目录下的某个文档(文件),这个文档 就称之为默认文档

配置文件httpd.conf的pirectoryIndex,默认文档可以配置多个(有前到后依次去找,找到为止,如果没找到任何一个则启用目录浏览):
在这里插入图片描述

1.6.4 虚拟主机

如果一台机器上只有一个网站的话,没有任何问题,但是如果想要在一台机器上部署多个站点,就必须通过配置虚 拟主机的方式解决。

由于后期对虚拟主机的配置操作非常常见,所以我们一般将虚拟主机的配置单独放到一个配置文件中,然后 在主配置文件中引入,避免破坏主配置文件中的其他配置。

Include conf/extra/httpd-vhosts.conf 配置的作用就将另外一个配置文件引入(使其生效)

具体的操作方式就是在主配置文件httpd.conf的500行取消注释。
在这里插入图片描述
然后找到 Apache 的虚拟主机配置文件,添加一个如下的虚拟主机配置节点,然后重新启动 Apache。

这个文件中有两个默认的示例配置,可以注释掉
在这里插入图片描述
如果真的要使用baixiu.com这个域名的话,就只能通过修改hosts文件达到目的,原因很简单:这个域名不是我们自己的,我们没有办法修改这个域名在公网上的 DNS。

注意:

如果使用了虚拟主机,则默认必须全部使用虚拟主机,即之前的默认网站也必须通过虚拟主机方式配 置,否则访问不到。参考:(http://skypegnu1.blog.51cto.com/8991766/1532454)
如果虚拟主机的端口使用的不是   80 ,则需要在主配置文件中添加一个对这个端口的监听:

在这里插入图片描述

1.7 静态网站与动态网站

至此,我们已经可以把这些静态页面放到服务器上了,客户端也可以通过域名请求这个网站,但是对于我们来说,
Apache 能够完成的事情过于简单,无外乎就是找到你请求对应的文件 → 读取文件 → 将文件内容响应给客户端浏 览器(文件原封不动的给你)。无法满足让网页内容动起来(随着数据动态变化)的需求。

于是乎,就有人提出了服务端动态网页的概念,这种实现这种概念的技术有很多种:JSP、ASP.NET、PHP、Node 等等。

这些技术的原理就是:不再将 HTML 固定写死,每次用户请求时,动态执行一段代码,临时生成一个用户想要的
HTML 页面。

在这里插入图片描述

动态网站指的也就是每次请求时服务端动态生成 HTML 返回给用户的这种网站。

这里我们选择 PHP 作为我们了解服务端动态网页开发的技术方案,注意:我们学习的重心不在 PHP,而是了解服 务端开发,以及某些其他对前端开发有帮助的东西。

1.7.1 配置PHP支持

PHP 文件的扩展名就是 .php

我们可以尝试在刚刚配置的网站中添加一个扩展名为demo.php的文件,然后到浏览器中访问它。echo的意思就是输出。

<!‐‐ demo.php ‐‐>
<?php echo 'Hello PHP'; ?>

结果出乎意料,并没有显示我们想要的Hello PHP,而是将我们的代码原封不动的返回给浏览器了。
在这里插入图片描述
原因很简单:Apache 只能处理静态文件请求,对于后缀名为 .php这种动态文件,它无法执行,所以就当成是一个静态文件直接返回了。

解决方法:

  1. 在服务器上安装 PHP,解压 php 到纯英文路径目录中

  2. 在 Apache 中添加支持 PHP 的配置,在 Apache 添加 PHP 处理模块

1	# php support
2	LoadModule php7_module C:/Develop/php/php7apache2_4.dll

<IfModule mine_module>节点中添加.php扩展名解析

1	# parse .php files
2	AddType application/x‐httpd‐php .php

默认文档配置节点<IfModule dir_module>中添加index.php

默认文档指的是在访问一个目录而不是具体文件名时,默认执行的文件名

<IfModule dir_module>    
DirectoryIndex index.html index.php </IfModule>

最后重启Apache

1.7.2 Apache 与 PHP

对于很多初学者来说,很容易把 Apache 和 PHP 混在一起 混为一谈,其实他们两者各自有各自负责的领域,各自 的职责,但是我们在使用 PHP 做动态网站开发时,两者就会产生联系,具体如下:
在这里插入图片描述

你可以理解为:Apache 是一家没有太多能力的公司,只能处理一些简单的业务(静态网站),
但是心很大想 做更多的事(动态网站),所以就想到了外包,所有额外的业务都需要外包给其他程序,
而 PHP 就是理解为 一个专门能够处理 php  业务的外包公司

2.PHP

详细参考文档:http://php.net/manual/zh/index.php

2.1 起步

PHP 是什么? 
PHP 写在哪? 
PHP 能做啥?

超文本标记是用普通文本描述富文本的一种方式

PHP(PHP: Hypertext Preprocessor)是一种被广泛应用的脚本语言,它可以被嵌入到 HTML中,尤其适合做动 态网站开发开发。

我们接下来会在 PHP 中看到的许多代码特性和其他编程语言类似,例如:变量、函数、循环,等等。 代码语法看 起来不同,但是在概念上是基本类似的。

我们使用 PHP 的目的就是能让静态网页变成动态网页,能称之为动态网页的核心就是让 HTML 上的内容不再被写 死,而是通过在 HTML 中嵌入一段可以在服务端执行的代码,从而达到动态网页的目标。

例如:我们需要有一个网页,这个网页每次打开都可显示当前的年月日,如果采用 HTML 处理:

1	<!DOCTYPE html>
2	<html lang="en">
3	<head>
4	<meta charset="UTF‐8">
5	<title>当前日期</title>
6	</head>
7	<body>
8	<h1>2020‐01‐01</h1>
9	</body>
10	</html>

我们必须每天到服务器上修改这个网页,从而让它保持显示最新日期,但是有了 PHP 这种能够在服务端执行的脚 本语言就可以很轻松实现:

1	<!DOCTYPE html>
2	<html lang="en">
3	<head>
4	<meta charset="UTF‐8">
5	<title>当前日期</title>
6	</head>
7	<body>
8	<h1><?php echo date('Y‐m‐d'); ?></h1>
9	</body>
10	</html>

从以上这个最最简单的基础案例就能看出:PHP无外乎为了可以在网页中动态输出最新内容的一种技术手段。

2.1.1 PHP标记

http://php.net/manual/zh/language.basic-syntax.phpmode.php

<?php 可以让代码进入PHP模式
?> 可以让代码退出"PHP模式"
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF‐8">
<title>这是一个包含 PHP 脚本的网页</title>
</head>
<body>
<h1>这是一个包含 PHP 脚本的网页</h1>
<p>这里原封不动的输出</p>

<?php
// 这里是 PHP 代码,必须满足 PHP 语法
$foo = 'bar'; echo $foo;
?>


<p>这里也不变</p>

<p><?php echo '<b>这还是 PHP 输出的</b>'; ?></p>
</body>
</html>

类似于在 HTML 中使用 JavaScript,但是不同的是 JavaScript 运行在客户端,而 PHP 运行在服务端。 只有处于 PHP 标记内部的代码才是 PHP 代码,PHP 标记以外都原封不动。

省略结束标记

如果 PHP 代码段处于整个文件的末尾,建议(必须)删除结束标记,这样不会有额外的空行产生。

2.1.2 输出内容方式

echo:

<?php
2	// echo 是 PHP 中的一个特殊的“指令”,
3	// 不一定需要像函数那样通过 `()` 去使用
4	// 注意:echo 后面紧跟着一个空格
5	echo 'hello php';
6	echo 'hello', 'world';
7	// => `helloworld`

print:

<?php
2	// print 与 echo 唯一区别就是只能有一个参数
3	print 'hello php';
4	// print 'hello', 'world';
5	// => Parse error: syntax error ...

var_dump:

<?php
2	// var_dump 是一个函数,必须跟上 () 调用
3	// 可以将数据以及数据的类型打印为特定格式
4	var_dump('hello php');
5	// => 'string(9) "hello php"'

还有一些输出函数(可以通过查手册自学,用到再说),例如: exit()  /    print_r() 等等
2.1.3 与 HTML 混编

普通嵌入

<p><?php echo 'hello'; ?></p>

语句混编

<?php if ($age >= 18) { ?>  
<p>成年人</p> <?php } else { ?>  
<p>小朋友</p> 
<?php } ?>

更常见的用法:

<?php if ($age > 18): ?> 
 <p>成年人</p> 
 <?php else: ?> 
 <p>小朋友</p> 
 <?php endif ?>

2.1.4 注释

你可以在代码中添加注释,从而增强我们代码的可阅读性。PHP 中注释有两种方式(与 JavaScript 相同):

单行注释:

<?php
// 这是一条单行注释
# 井号也可以做注释(不要用,有点生僻)
$foo = 'hello';

多行注释:

<?php
/*
......
这里可以添加任意行数的注释内容
......
*/
$foo = 'hello';

2.2 语法

编程语言常见的语法

  1. 变量 —— 用于临时存放数据的容器
  2. 顺序结构 —— 先干什么再干什么
  3. 分支结构 —— 如果怎样就怎样否则怎样
  4. 循环结构 —— 不断的做某件相同的事
  5. 函数 —— 提前设计好一件事怎么干,然后想什么时候干就什么时候干
  6. 运算符 —— 数学运算和字符串拼接
  7. 字面量 —— 在代码中用某些字符组成,能够表达一个具体的值 这些字符之间表示数据的方式叫做字面量

PHP 也是另外种编程语言,作为另外一种编程语言,PHP 也具备着绝大多数语言都有的特点,例如变量、条件分 支、循环、函数等等,不同的是每个语言都会有自己的语法规定。这里不用太过担心,这些语法规定与之前学习的 编程语言大同小异,对我们来说不会有太大的压力。

  1. 变量
  2. 双引号字符串和单引号字符串的差异
  3. 指令式的语法
  4. foreach
  5. 函数作用域问题
  6. 字符串拼接
2.2.1 变量

变量是编程语言中临时存放数据的容器。

PHP 中申明一个变量是用一个美元符号后面跟变量名来表示。变量名同样是区分大小写的。

PHP 中变量无需声明类型,变量的类型根据值的类型来推断。

<?php 
$foo; // 申明一个变量,变量名为 `foo`,未对其进行赋值 

$bar = 'baz'; // 申明一个变量,将一个值为 `baz` 的字符串赋值给它 

echo $foo; // 输出一个变量名为 `foo` 的变量 fn($bar); // 将一个变量名为 `foo` 的变量作为 `fn` 的实参传递

2.2.2 数据类型

常见的 PHP 数据类型与 JavaScript 基本一致:

  1. string(字符串)
  2. integer(整型)—— 只能存整数
  3. float(浮点型)—— 可以存带小数位的数字
  4. boolean(布尔型)
  5. array(数组)
  6. object(对象)
  7. NULL(空)
  8. Resource(资源类型)
  9. Callback / Callable(回调或者叫可调用类型)

字符串

PHP 有多种创建字符串的方式:单引号、双引号等。

单引号字符串
不支持特殊的转义符号,例如 \n 如果要表示一个单引号字符内容,可以通过 ’ 表达 如果要表示一个反斜线字符内容,可以通过 \ 表达

双引号字符串
支持转义符号 支持变量解析

<?php 
// ====== 单引号 ====== 
echo 'hello\nworld'; 
// => `hello\nworld` 
echo 'I\'m a better man'; 
// => `I'm a better man` 
echo 'OS path: C:\\Windows'; 
// => `OS path: C:\Windows`   
// ====== 双引号 ====== 
echo "hello\nworld"; 
// => `hello 
// world` 
$name = 'zce'; 
echo "hello $name"; 
// => `hello zce`

字符串函数
http://php.net/manual/zh/ref.strings.php

http://www.w3school.com.cn/php/php_string.asp

数组
PHP 中数组可以分为两类:

索引数组:与 JavaScript 中的数组基本一致。

<?php
// 定义一个索引数组
$arr = array(1, 2, 3, 4, 5); var_dump($arr);

// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = [1, 2, 3, 4, 5];
var_dump($arr2);

关联数组

有点类似于 JavaScript 中的对象

<?php
// 注意:键只能是`integer`或者`string`
$arr = array('key1' => 'value1', 'key2' => 'value2'); var_dump($arr);

// PHP 5.4 以后定义的方式可以用 `[]`
$arr2 = ['key1' => 'value1', 'key2' => 'value2']; var_dump($arr2);

数据类型转换
参考:http://php.net/manual/zh/language.types.type-juggling.php

<?php
2	$str = '132';
3	// 将一个内容为数字的字符串强制转换为一个整形的数字
4	$num = (int)$str;
5	// 将一个数字强制转换为布尔值
6	$flag = (bool)$num;

2.2.3 运算符

数学运算符,逻辑运算符与 JavaScript 基本一致,无额外特殊情况。 字符串连接(拼接)采用的是比较特殊的

1	<?php
2	$name = 'zce';
3	// 拼接 `hey ``zce`
4	$message = 'hey ' . $name; 5	// 相当于 +=
6	$foo .= $message
2.2.4 语句

分号分割
if、switch、while、for、 foreach、function…

2.2.5 流程控制

顺序结构
分支结构

if … else switch … case

循环结构
for
while
foreach — 专门用来遍历数组

<?php
$arr = array('name' => 'zhangsan', 'age' => '18');

foreach ($arr as $key => $value) {
echo $key . ' ' . $value;
}

指令式的 if、for、foreach、while 单独掌握

<?php
// 指令式就是将开始 { 换成 : 结束 } 换成 endif; if ($i > 0) :
echo 'ok'
endif;

// for foreach while 也是一样
for ($i = 0; $i < 10; $i++) : echo $i;
endfor;

2.2.6 函数

定义与使用函数的方式与 JavaScript 相同:

<?php
// 函数名不区分大小写
function foo ($name, $title) { echo "$name ($title)";
}

// 调用
foo('zce', 'UFO');
Foo('zgd', 'SBO'); // 大小写不区分

注意:使用方式有点差异(函数名不区分大小写),但是不要这么搞!!!

建议在 PHP 中采用下划线式(snake_case)做命名规则,不管是函数还是变量

3.特性

3.1 变量作用域

关于变量作用域这一点,PHP 与绝大多数语言也都不同:默认函数内不能访问函数所在作用域的成员。

在 JavaScript 中,我们可以在函数作用域中使用父级作用域中的成员:

var top = 'top variable'

function foo () {
var sub = 'sub variable'
console.log(top)
// => `top variable`


function bar () { console.log(top)
// => `top variable` console.log(sub)
// => `sub variable`
}
}
foo()

而在 PHP 中:

<?php
$top = 'top variable';

function foo () {
$sub = 'sub variable';
echo $top;
// => 无法拿到
function bar () { echo $top;
// => 无法拿到
echo $sub;
// => 无法拿到
}
bar();
}
foo();

如果需要访问全局变量,可以通过global关键字声明:

<?php
$top = 'top variable';

function foo () {
// 声明在当前作用域中获取全局作用域中的 `$top` global $top;

$sub = 'sub variable';


echo $top;
// => `top variable`


function bar () {
// 声明在当前作用域中获取全局作用域中的 `$top``$bar` global $top, $bar;

echo $top;
// => `top variable`


echo $sub;
// => 任然无法拿到,因为 `$sub` 不再全局范围,而是在 `foo` 函数中定义
}
bar();
}
foo();

3.2 超全局变量

http://www.w3school.com.cn/php/php_superglobals.asp

PHP 中的许多预定义变量都是“超全局的”,这意味着它们在一个脚本的全部作用域中都可用。在函数或方法中无需 执行 global $variable; 就可以访问它们。

这些超全局变量是:

  • $GLOBALS — 引用全局作用域中可用的全部变量
  • $_SERVER — 获取服务端相关信息
  • $_REQUEST — 获取提交参数
  • $_POST — 获取 POST 提交参数
  • $_GET — 获取 GET 提交参数
  • $_FILES — 获取上传文件
  • $_ENV — 操作环境变量
  • $_COOKIE — 操作 Cookie
  • $_SESSION — 操作 Session

本节会介绍一些超全局变量,并会在稍后的章节讲解其他的超全局变量。

3.2.1 $GLOBALS

$GLOBALS 这种全局变量用于在 PHP 脚本中的任意位置访问全局变量(从函数或方法中均可)。 PHP 在名为 $GLOBALS[index] 的数组中存储了所有全局变量。变量的名字就是数组的键。 下面的例子展示了如何使用超级全局变量 $GLOBALS:

<?php
$x = 75;
$y = 25;

function foo () {
$GLOBALS['z'] = $GLOBALS['x'] + $GLOBALS['y'];
}
foo(); echo $z;
// => 100

3.3 常量定义与使用

常量跟变量一样也是一个数据容器,但是不同的是一旦申明过后就不允许被修改。

3.3.1 定义常量
<?php
2	// 定义常量使用的是内置的 `define` 函数
3	// 第一个参数是常量的名称,建议采用全大写字母命名,多个单词下划线分隔
4	// 第二个参数是常量中存放的数据,可以是任意类型
5	// 第三个参数是常量名称是否区不分大小写,默认 false 区分大小写
6	define('SYSTEM_NAME', '阿里百秀');
7	define('SYSTEM_ENABLE', true);

3.3.2. 使用常量
<?php
2	// 直接通过常量的名称访问常量
3	// 与变量不同的是不需要用 $
4	echo SYSTEM_NAME;
5	echo SYSTEM_ENABLE;

3.4. 载入其他文件

通常情况下,当一个文件中的代码过长,自然会想到要拆分到多个文件中。随着开发经验的积累,慢慢的会发现, 除了文件过程应该拆分文件,更应该做的事情是根据用途去划分。

不管你是怎样想的,核心问题都是一样:怎么将代码拆分到多个文件中?

PHP 中引入其他 PHP 文件有四种方式:

  • require
  • require_once
  • include
  • include_once

四种方式的对比:

requirerequire_onceincludeinclude_once
被载入文件如果不存在是否影响继续运行YYNN
多次调用是否会重复执行被载入的文件YNYN

总结来说:

横向分为两类:require 和 include 两种,区别在于 require 会因为载入文件不存在而停止当前文件执行,而
include 不会。
纵向分为两类:xxx 和 xxx_once,区别在于代码中每使用一次 xxx 就执行一次载入的文件,而 xxx_once 只 会在第一次使用是执行。

使用层面:

include 一般用于载入公共文件,这个文件的存在与否不能影响程序后面的运行 require 用于载入不可缺失的文件 至于是否采用一次载入(once)这种方式取决于被载入的文件

4.常用API

任何编程语言本身并没有太多的能力,具体的能力大多数都来源于 API。

4.1 字符串处理

宽字符集需要开启 php_mbstring 扩展

4.1.1. 开启 PHP 扩展

  1. 将PHP目录中的 php.ini-development 复制一个 修改为 php.ini
  2. 修改扩展文件所在目录 extension_dir
  3. 修改文件中的部分选项(; 是注释符)
  4. 在 Apache 配置文件中申明一下 php.ini 的所在目录

4.1.2. 字符串处理函数

字符串截取

  • string substr ( string $string , int $start [, int $length ] )
  • string mb_substr ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )

字符串长度

  • int strlen ( string $string )
  • mixed mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )

大小写转换

  • string strtolower ( string $string )
  • string strtoupper ( string $string )

去除首尾空白字符

  • string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )
  • string ltrim ( string $str [, string $character_mask ] )
  • string rtrim ( string $str [, string $character_mask ] )

查找字符串中某些字符首次出现位置

  • mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
  • int mb_strpos ( string $haystack , string $needle [, int $offset = 0 [, string $encoding = mb_internal_encoding() ]] )

字符串替换

  • mixed str_replace ( mixed $search , mixed $replace , mixed KaTeX parse error: Expected 'EOF', got '&' at position 16: subject [, int &̲count ] )

重复字符串

  • string str_repeat ( string $input , int $multiplier )
    字符串分割
  • array explode( string $input, string $char )

在这里插入图片描述

4.2 数组处理

获取关联数组中全部的键 / 值

  • array_keys() / array_values()
    判断关联数组中是否存在某个键
  • array_key_exists()
    去除重复的元素
  • array_unique()
    将一个或多个元素追加到数组中
  • array_push() $arr[] = ‘new value’
    删除数组中后一个元素
  • array_pop()
    数组长度
  • count()
    检测存在
  • in_array()

4.3. 时间处理

  • 时间戳: time()
    从 Unix 纪元(格林威治时间 1970-01-01 00:00:00)到当前时间的秒数

  • 格式化日期: date()
    获取有格式的当前时间 格式化一个指定的时间戳 可以通过 strtotime() 将有格式的时间字符串转换为时间戳

4.4. 文件操作

在这里插入图片描述
参考:http://www.w3school.com.cn/php/php_ref_filesystem.asp

总结

本期主要学习了Apache的配置、PHP的配置、PHP的语法。但我们学习PHP不是目的,最终目的是学习这个服务器、网站的思想。下期将会运用这些基础语法练习例子。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值