学习目标
那么,从本期开始我们就要一起学习PHP的相关知识了。
1 服务端开发基础
1.1 建立你的第一个网站(目标)
前端开发 最终还是属于 Web 开发 中的一个分支,想要成为一名合格的前端开发人员,就必须要 充分理解 Web 的概念。
构建一个专业的网站是一项巨大的工作!对于新手我们应该从小事做起,也就是说咱们不可能立马就要求自己能够 开发出跟淘宝一样的电商平台,但是对咱们来说建立一个属于自己的 Blog 网站并不难(其实再大的系统也是由一 些基础功能叠加出来的),所以咱们就从这个话题开始学习。
1.2 如何建立一个 Blog 网站
提问:到底什么是网站?
- 可以在浏览器上通过一个地址直接访问使用
- 用于提供一种(或多种)特定服务的一系列具备相关性的网页组合的整体
- 例如:博客、门户、电商、在线教育等
有了明确的目标过后,我们需要规划具体的业务方案,学习特定的技能,完成各项功能,解决各种过程中出现的问 题。
1.2.1 之前学习了什么
在之前的学习过程中,我们很专注,没有关心这些东西在整体中是什么角色,起到什么作用。这里我们是时候总结 一下我们之前学过了的内容:
网页开发技术(硬性)
- HTML —— 网页内容结构(GUI)
- CSS —— 网页外观样式(GUI)
- JavaScript —— 编程语言(可以用于调用浏览器提供的 API)
- Web APIs —— 网页交互(界面功能)
- jQuery —— 便捷手段(糖果而已,不是必要的)
编程能力 / 编程思想 / 解决问题的思路(软性)
1.我要做什么(我要得到什么),我目前有什么(我能拿到什么)
至此,我们已经可以独立完成网页开发了,具体能完成的东西就是一个一个的网页,而且还能给这个页面加上一些 动态的交互。但是这距离成为一个网站还有一些路要走。
1.2.2 还需要学习什么?
想要完成完整的 Web 网站,还需要学习什么?
- 搭建 WEB 服务器(提供网站服务的机器)
- HTTP(浏览器与服务端的通讯协议)
- 服务端开发(动态网页技术)
- 数据库操作(服务端存储数据方式)
- AJAX(浏览器与服务端的数据交互方式)
1.3 搭建 Web 服务器
- 服务器(提供服务)指的就是一台安装特定的软件的公共计算机,用于专门用于提供特定的服务。 按照服务类型的不同,又划分为:Web 服务器、数据库服务器、文件服务器等等。
- 客户端(使用服务)指的是在一次服务过程中使用这个服务的设备(网络端点)。 目前咱们最常见的客户端就是浏览器
我们手头上的这些网页,如果想要成为一个网站,首先要完成的第一件事就是有一台公共的 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 服务,访问你机器上的网站。这种情况下你 的机器就是服务器,别人的机器就是客户端。
注意:
-
确保配置文件语法检查通过
-
确保 80端口没有被其他程序占用
-
确保防火墙允许80端口的请求,或者干脆关掉防火墙
-
如果出现 Forbidden 情况,确保配置文件http.conf中 247 行(DocumentRoot之后)的Directory配置的与DocumentRoot路径相同
-
我们在开发阶段大多数都是自己访问自己机器上的网站,那这种情况下,我们既是服务端又是客户端。对于 新手来说,最常见的问题就是分不清楚哪是客户端应该有的,哪是服务端应该有的。这种时候一定要保持清 醒,客户端局限在浏览器窗口,代码以及 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 命令监视本机端口使用情况:
参考链接:
-
https://baike.baidu.com/item/%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AB%AF%E5%8F%A3
-
https://baike.baidu.com/item/%E7%AB%AF%E5%8F%A3 http 默认的端口 80 https 默认的端
-
http默认的端口是80
-
https默认的端口是443
1.4.8 URL
URL(Uniform Resource Locator),统一资源定位符,通俗点来说就是表示网络当中某一个网页的完整访问地 址,它具有一定的格式:
1.5 请求响应流程
-
用户打开浏览器
-
地址栏输入我们需要访问的网站网址(URL)
-
浏览器通过 DNS 服务器获取即将访问的网站 IP 地址
-
浏览器发起一个对这个 IP 的请求
-
服务端接收到这个请求,进行相应的处理
-
服务端将处理完的结果返回给客户端浏览器
-
浏览器将服务端返回的结果呈现到界面上
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这种动态文件,它无法执行,所以就当成是一个静态文件直接返回了。
解决方法:
-
在服务器上安装 PHP,解压 php 到纯英文路径目录中
-
在 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 语法
编程语言常见的语法
- 变量 —— 用于临时存放数据的容器
- 顺序结构 —— 先干什么再干什么
- 分支结构 —— 如果怎样就怎样否则怎样
- 循环结构 —— 不断的做某件相同的事
- 函数 —— 提前设计好一件事怎么干,然后想什么时候干就什么时候干
- 运算符 —— 数学运算和字符串拼接
- 字面量 —— 在代码中用某些字符组成,能够表达一个具体的值 这些字符之间表示数据的方式叫做字面量
PHP 也是另外种编程语言,作为另外一种编程语言,PHP 也具备着绝大多数语言都有的特点,例如变量、条件分 支、循环、函数等等,不同的是每个语言都会有自己的语法规定。这里不用太过担心,这些语法规定与之前学习的 编程语言大同小异,对我们来说不会有太大的压力。
- 变量
- 双引号字符串和单引号字符串的差异
- 指令式的语法
- foreach
- 函数作用域问题
- 字符串拼接
2.2.1 变量
变量是编程语言中临时存放数据的容器。
PHP 中申明一个变量是用一个美元符号后面跟变量名来表示。变量名同样是区分大小写的。
PHP 中变量无需声明类型,变量的类型根据值的类型来推断。
<?php
$foo; // 申明一个变量,变量名为 `foo`,未对其进行赋值
$bar = 'baz'; // 申明一个变量,将一个值为 `baz` 的字符串赋值给它
echo $foo; // 输出一个变量名为 `foo` 的变量 fn($bar); // 将一个变量名为 `foo` 的变量作为 `fn` 的实参传递
2.2.2 数据类型
常见的 PHP 数据类型与 JavaScript 基本一致:
- string(字符串)
- integer(整型)—— 只能存整数
- float(浮点型)—— 可以存带小数位的数字
- boolean(布尔型)
- array(数组)
- object(对象)
- NULL(空)
- Resource(资源类型)
- 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
四种方式的对比:
require | require_once | include | include_once | |
---|---|---|---|---|
被载入文件如果不存在是否影响继续运行 | Y | Y | N | N |
多次调用是否会重复执行被载入的文件 | Y | N | Y | N |
总结来说:
横向分为两类:require 和 include 两种,区别在于 require 会因为载入文件不存在而停止当前文件执行,而
include 不会。
纵向分为两类:xxx 和 xxx_once,区别在于代码中每使用一次 xxx 就执行一次载入的文件,而 xxx_once 只 会在第一次使用是执行。
使用层面:
include 一般用于载入公共文件,这个文件的存在与否不能影响程序后面的运行 require 用于载入不可缺失的文件 至于是否采用一次载入(once)这种方式取决于被载入的文件
4.常用API
任何编程语言本身并没有太多的能力,具体的能力大多数都来源于 API。
4.1 字符串处理
宽字符集需要开启 php_mbstring 扩展
4.1.1. 开启 PHP 扩展
- 将PHP目录中的 php.ini-development 复制一个 修改为 php.ini
- 修改扩展文件所在目录 extension_dir
- 修改文件中的部分选项(; 是注释符)
- 在 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不是目的,最终目的是学习这个服务器、网站的思想。下期将会运用这些基础语法练习例子。