免费注册 登录
收起/展开

7天学会PHP

文档类型:pdf 上传时间:2018-06-15 文档页数:523页 文档大小:14.58 M 文档浏览:9948次 文档下载:3次 所需积分:0 学币 文档评分:3.0星

7天学会PHP内容摘要: 目 录01. 为什么选择本书学习PHP1.1 为什么学习PHP?1.2 PHP是什么1.3 零基础也能学习1.4 为什么有些人学不会02.PHP的环境安装2.1开发环境是什么?2.2 windows环境安装2.3 Linux环境安装2.4 其他开发环境2.5 写代码的工具选择03. PHP基本语法3.1 PHP基本语法3.1.1 写出你的第一段PHP代码3.1.2 读过初中你就会变量3.1.3 echo 显示命令3.1.4 注释的功能很强大3.2 数据类型并不神秘3.2.1 整型就是整数3.2.2 布尔就是易经的知识3.2.3 字符串3.2.4 浮点型3.2.5 重要:if和else语法3.2.6 NULL类型3.2.7对象以后会学3.2.8 数组会有单纯的一个章节3.2.9 资源类型3.2.10 眼前了解回调类型即可3.2.11 查看和判断数据类型3.2.12 数据类型的自动转换和强制转换3.3 常量和变量3.3.1 用常量限制用户跳过某些文件3.3.2 可变变量3.3.3 外部变量3.3.4 环境变量3.3.5 变量引用3.4 PHP表达式与运算符3.4.1 算术运算3.4.2 赋值运算- 2 -本文档使用 看云 构建3.4.3 自加、自减运算3.4.4 比较运算3.4.5 逻辑运算3.4.6 位运算3.4.7 运算符优先级3.4.8 三元运算符和其它运算符04. PHP中的流程控制4.1 if条件结构流程4.1.1 if语句4.1.2 嵌套if...else...elseif结构4.1.3 if语句多种嵌套4.2 分支结构switch语句的使用4.3 循环语句的使用4.3.1 while循环4.3.2 do...while循环的区别4.3.3 for循环控制语句4.3.4 goto语法4.3.5 declare 语法05.PHP的函数基本语法5.1 自定义函数5.2 自定义函数高级调用5.2.1 回调函数5.2.2 变量函数5.2.3 匿名函数5.2.4 内部函数5.2.5 变量作用域5.2.6 参数的引用5.2.7 递归函数5.2.8 静态变量5.3 使用系统内置函数5.4 文件包含函数5.5 数学常用函数5.6 日期常用函数5.6.1 获取时期时间信息函数5.6.2 日期验证函数5.6.3 获取本地化时间戳函数5.6.4 程序执行时间检测5.7 字符串常用函数06.PHP数组与数据结构6.1 数组的定义- 3 -本文档使用 看云 构建6.2 数组的操作6.2.1 数组的计算6.2.2 for循环遍历索引数组6.2.3 foreach遍历关联数组6.2.4 list、each函数遍历数组6.2.5 常用操作数组函数6.3 数组的常用函数07. PHP中的正则达达式7.1 正则表达示的定界符7.2 正则表达示中的原子7.3 正则表示中的元字符7.4 正则达达示中的模式修正符7.5 写正则的诀窍和常用正则7.6 用正则写一个UBB文本编辑器08.文件系统8.1 读取文件8.2 创建和修改文件内容8.3 创建临时文件8.4 移动、拷贝和删除文件8.5 检测文件属性函数8.6 文件常用函数和常量8.7 文件锁处机制8.8 目录处理函数8.9 文件权限设置8.10文件路径函数8.11 小小文件留言本8.12 修改配置文件的实例09.PHP文件上传9.1 文件上传需要注意php.ini文件9.2 文件上传的步骤9.3 文件上传表单注意事项9.4 按照数组和步骤完成文件上传9.5 多文件上传9.6 文件上传进度处理10.PHP图像处理10.1 学习前的准备工作10.2 用图片处理函数画一张图10.3 生成验证码10.4 图像缩放和裁剪技术10.5 图片水印处理- 4 -本文档使用 看云 构建11.错误处理11.1 禁止显示错误11.2 错误报告级别11.3 错误记录日志11.4 自定义错误处理函数12.MySQL 入门12.1 请进入《MySQL入门》13. PHP操作mysql数据库13.1 数据库连接步骤13.2 通过步骤做一个用户注册13.3 通过步骤做一个列表显示13.4 把用户做个分页13.5 批量和指定删除用户13.6 修改用户信息13.7 数据显示乱码终极解决办法14.会话管理和控制14.1 Cookie概述14.2PHP中的Cookie14.3 session概述14.4 PHP中使用session14.5 SESSION应用实例15.通过cURL来做小偷程序15.1 curl的使用步骤15.2 自定义get方法抓取网页15.3 使用post发送数据16. 用PHP写一个论坛16.1 web2.0始于论坛16.2 需求:开发前你要知道他的样子16.3 核心业务流程16.3.1 用户注册流程16.3.2 普通用户和管理员登陆流程16.3.3 发贴流程16.3.4 回复流程16.3.5 版块管理流程16.3.6 版主业务流程16.3.7 金币奖励和消耗流程16.4 数据库表设计16.5 文件和代码规范16.6 核心功能说明16.6.1 项目目录结构说明- 5 -本文档使用 看云 构建16.6.2 公共文件的使用16.6.3 模板引擎讲解16.6.4 用户注册、登陆功能讲解16.6.5 发帖功能讲解16.6.6 回帖功能讲解16.6.7 项目安装模块讲解附录1. 版权声明附录2 . 学习PHP常用的英文单词- 6 -本文档使用 看云 构建01. 为什么选择本书学习PHP翻开这本书,你很幸运!>本书由于作者是五笔打字打得特别快,并且工作很忙。难免会有错别字。遇问题 ,留言即会更正。网上喷子多,开源免费的东西,不喜勿喷。你将得到:1. 本书完全免费2. 在官网获得视频支持3. QQ群学习帮你解决问题4. 认识很多大牛5. 大量不定期的在线答疑6. 大量的代码实例下载7. 还有机会获得李文凯的亲笔签名... ...为什么选择这本书?1. 适合0基础和入门学习,简单易懂2. 所有的知识为实际工作中最实用的知识3. 大量的实例4. 现实生活的代码全都步骤化了5. 全面兼容PHP7本书是一本开放开源的书,我们将不断的更新。本书QQ群PHP进阶群(新手勿进):385027889PHP进阶群(初学者群):37509174101. 为什么选择本书学习PHP- 7 -本文档使用 看云 构建1.1 为什么学习PHP?回答本书的几个问题吧。你到底,为什么要学习PHP?1. 全国都缺PHP人才,非常好就业,PHP现在的工资水平很高,刚毕业可以拿到5000-9000每个月,特别优秀还可以破万。并且有非常多的就业机会。2. PHP入门简单,学习简单易入手。3. 很多人反馈上完大学的C语言课程、java课程不会写任何东西。诚然,中国的大学都以C语言作为主要的入门语言。但是,我们认为PHP是最简单,也是最合适入门的语言。4. 你将学习到编程的思路,更加程序化的去处理问题。处理问题,将会更加规范化。5. 如果你要创业,如果你要与互联网人沟通。未来互联网、移动互联网、信息化将会进一步围绕在你身边。你需要与人沟通,打交道。6. 还有机会进入BAT(百度、阿里、腾讯),BAT这些企业他们在用PHP。国内和国外超一线的互联网公司,在超过90%在使用PHP来做手机API或者是网站。连微信等开放平台中的公众号的服务端也可以使用到PHP。7. 大并发,还能免费。一天1个亿的访问量怎么办?PHP拥有大量优秀的开发者,在一定数据量的情况下完全能满足你的需求。国内外一线的互联网公司,很多将自己的大并发方案开源了。你可以免费获得很多成熟的、免费的、开源的大并发解决方案。8. 开源更加节约成本也更加安全。windows很多都要收取授权费用,而使用linux的LAMP架构或者LNMP架构会更加安全。全球的黑客在帮你找漏洞。全球的工程师在帮忙修复漏洞。你发现一个其他人已经消灭10个。1.1 为什么学习PHP?- 8 -本文档使用 看云 构建1.2 PHP是什么PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。全球市场分析目前PHP在全球网页市场、手机网页市场还有为手机提供API(程序接口)排名第一。在中国微信开发大量使用PHP来进行开发。北京、上海的用人需求北京2015年10月份中某一天用人低峰的招聘量:上海2015年10月份中某一天用人低峰的招聘量:1.2 PHP是什么- 9 -本文档使用 看云 构建1.2 PHP是什么- 10 -本文档使用 看云 构建1.3 零基础也能学习学习PHP前很多人担心PHP是不是能真的学会。学习PHP学历要求不高,数学水平要求也不高,只需要会下面这些,你就可以跟着PHP学院,开始愉快、高薪的PHP学习之旅:有一台电脑初中及以上文化水平必须会打字(五笔、拼音均可)会word(微软的office办公软件中的文字编辑软件)会上网(QQ,写邮件,玩微信,看小说,看电影,注册网站帐号,网上购物等)有一颗坚持的心如果会一点html就更好了.学习HTML可以去看我们开源的另外一本HTML入门书籍。不会HTML怎么办?也可以学习我们免费的HTML入门视频。1.3 零基础也能学习- 11 -本文档使用 看云 构建1.4 为什么有些人学不会互联网进入到人们生活中的方方面面了,世界首富比尔盖茨多次提到青少年编程,而编程是一种思维习惯的转化。作为写了10几年程序的人,我听到过一些说编程不好学的抱怨。从目前见到的数据统计,主要是因为在大学开设的课程中遇到了C语言,学完后还不知道能干什么。很多人大学上完也就这么糊涂、恐惧的就过来了。只有很少的不到1%的人学不会,这部份往往是专业的艺术家,在艺术家里面极少一部份人外,他们的思维模式和我们遇到的大多数人不太一样,并且不进行编程思维的训练,所以学不会。而造成这个原因主要是因为社会、文化、背景、生活圈子多方面造成的。而不是因为笨。那我们绝大多数的人是哪些原因学不会的呢?1. 不相信自己能学会这一块很多人可能不相信,涉及到很深的心理学知识。与心理暗示、诅咒的原理一样。如果不相信自己能够学好,心里潜意识的念头里如果总是:PHP很难,我学不会。那么这个人肯定很难学会。把不相信自己能学会的负面情绪和观念给抛掉。只要你每天练习代码并相信自己。你肯定能学会,并且能学得很好,代码写的很成功,成为大牛!2. 懒人的天性有善有恶,而学不好程序的人,身上的一个通病,只有一个字就是————懒!基本语法,需要去背函数需要去默写3. 自以为是一看就会,一写就错。以为自己是神童。4. 英文单词计算机里面常用的英文单词就那么一些。不要找英语的借口。本书会把英语单词都会跟你标注出来。看到不会的,就去翻一翻。5. 不坚持学着学着就放弃了。6. 不去提问,不会提问,不去思考1.4 为什么有些人学不会- 12 -本文档使用 看云 构建解决问题前,先去搜索搜索解决不了再去提问PHP学院为大家准备了视频,也为大家准备了问答中心。大多数的人,不把问题详述清楚,不把错误代码贴完整。张嘴就来提问。我想神仙也不知道你的问题是什么吧?问题发出来前。换位思考一下自己看不看得懂这个问题。7. 你还需要自我鼓励在学习过程中,你会否定自己。其实任何人都会。大多数人都会遇到跟你一样的困难。只不过他们在克服困难,而一些人在逃避困难。学累的时候,放松一会儿。再去多读几遍。不断的告诉自己,你就是最棒的!学会交流和倾诉而非抱怨,并且不断的自我鼓励1.4 为什么有些人学不会- 13 -本文档使用 看云 构建02.PHP的环境安装欲为大树,莫与草争这一篇的标题,是一个故事。也是给很多正在学习的朋友一个提醒。刚开始入门的你,别把学习困难卡在了环境问题上。很多朋友,在学习过程中看了一些不太好的书。告诉你要安装xxx,绕了一大圈最后选择了放弃。在开始学习前,要把问题和关键放在如何学习写代码和如何写好代码上面。关于环境的问题,能运行你现在写的代码就行了。02.PHP的环境安装- 14 -本文档使用 看云 构建2.1开发环境是什么?PHP是一门开发语言。而开发语言写出来的代码,通常需要在指定的软件下才能运行。因此,我们写好的代码需要(运行)显示出来看到,就需要安装这几个软件来运行代码。我们把运行我们写代码的软件和运行代码的软件统一的称为开发环境。新手学习前常遇到的环境问题很多朋友最开始学习的时候,听说某个环境好就安装某些软件。由于缺乏相关知识,所以没有主见。陷入人云亦云的怪圈里。今天换这个,明天换那个。验证真理的唯一标准,请始终保证一点:>环境能满足你的学习需求。不要在环境上面反复纠结,耽误宝贵的学习时间。我们认为环境只要能满足学习要求即可。等学会了后,再去琢磨一些更加复杂的互联网线上的、生产环境中的具体配置。2.1开发环境是什么?- 15 -本文档使用 看云 构建2.2 windows环境安装所谓服务器:不要把它想的太过于高深,不过就是提供一项特殊功能(服务)的电脑而已。显示网页的叫网页(web)服务器(server)。帮我们代为收发电子邮件(Email)的服务器叫邮件服务器。帮我们把各个游戏玩家连接在一起的叫游戏服务器。帮我们存储数据的叫数据库服务器... ...我们现在使用的一部手机的性能比10年前的一台电脑和服务器的性能还要强劲、给力。而我们的学习过程当中完全可以把自己使用的这一台windows电脑作为服务器来使用。原来如此,一讲就通了吧?我们大多数人使用的电脑通常是windows操作系统的电脑。而我们的讲解主要在windows电脑上进行。你不需要去理解所谓高深的电脑知识、操作系统原型等。在这一章节当中,你只需要像安装QQ、杀毒软件一样,点击:下一步、下一步即可完成本章的学习。在最开始学习时,我们强烈建议初学者使用集成环境包进行安装。什么是集成环境包?我们学习PHP要安装的东西有很多。例如:网页服务器、数据库服务器和PHP语言核心的解释器。我们可以分开安装各部分,也可以合在一起安装一个集成好的软件。将这些合在一起的一个软件我们就叫作:集成环境包。这个过程需要修改很多配置文件才能完成。并且每个人的电脑情况不同,权限不同,经常容易操作出错。很容易因为环境问题影响到学习的心情,我们的学习计划在初期非常的绝对化:请使用集成环境包完成最开始的学习。等你学好PHP NB后,你爱用啥用啥,网上成堆的文章教你配置各种环境。选用什么样的集成环境包?2.2 windows环境安装- 16 -本文档使用 看云 构建集成环境包比较多。以下的这些全是各种英文名。只不过代表的是不同集成环境包的名字,不用去深纠。如下所示:1. AppServ2. PHPStudy3. APMserv4. XAMPP5. WAMPServer... ...等等对于我们才入门的学习者来说,选择集成环境包的原则:1. 更新快,版本比较新2. 操作简单易于上手3. 选择项不要过多因此,我们下面使用的集成环境包是:XAMPP。当然,如果你对此块很熟悉了,也可以自行选择选择集成环境包。你可以在PHP学院官网下载。下载地址为:http://down.phpxy.com/tools/xampp-win32-1.8.3-0-VC11-installer.exe可以以在官方网址下载:https://www.apachefriends.org/zh_cn/index.html (因为某些特殊的原因,有时可能在国内无法访问。)也可以在百度中搜索:XAMPP 这个5个字文字母进行下载。XAMPP安装过程演示如果你会安装,可略过本章。1,下载安装包到电脑桌面上。2.2 windows环境安装- 17 -本文档使用 看云 构建2,双击打开,显示开始安装的引导界面。2.2 windows环境安装- 18 -本文档使用 看云 构建3,请按照图中所示,将一些不需要的选项给去掉。例如:Tomcat等2.2 windows环境安装- 19 -本文档使用 看云 构建4,我们通常不把XAMPP 放在电脑C盘目录下面,因为操作系统的文件放在通常放在C盘。如果电脑坏了,重作系统的时候,容易造成我们的代码丢失。我们需要修改一下路径:2.2 windows环境安装- 20 -本文档使用 看云 构建5,点击后面的文件夹样式的小图标,选择D盘。2.2 windows环境安装- 21 -本文档使用 看云 构建6,点击新建文件夹,写上文件夹的名称为xampp,然后点击确定。2.2 windows环境安装- 22 -本文档使用 看云 构建7,文件夹选择完成,我们点击next(下一步)2.2 windows环境安装- 23 -本文档使用 看云 构建8,将后面的勾按照图中红框所示给去掉。(注:这主要是安装其他PHP程序使用的一个功能,我们学习过程中不需要使用。)2.2 windows环境安装- 24 -本文档使用 看云 构建9,提示我们准备完成,点击next(下一步),即可开始安装。2.2 windows环境安装- 25 -本文档使用 看云 构建10,这个时候开始安装了,这是开始安装的进度条。2.2 windows环境安装- 26 -本文档使用 看云 构建11,点击finish(完成)。完成XAMPP的安装。2.2 windows环境安装- 27 -本文档使用 看云 构建恭喜你!到了这一步,XAMPP——PHP的集成运行环境安装成功了!安装后的其他注意事项1,看到右下角的这个图标了吗?这是XAMPP的快捷方式。点击一下,试试。2.2 windows环境安装- 28 -本文档使用 看云 构建2,点击后就显示出来了这个界面。这个界面大家暂时不用深入进行学习。只需要知道。Stop是停止,Start是开始即可。你可以试试。3,在XAMPP控制面版(上图)。我们点击右侧的:Explorer这个小按钮。就会显示这个界面了。这个界2.2 windows环境安装- 29 -本文档使用 看云 构建面是Xampp的软件安装目录的载图。我们以后需要把我们以后写的PHP代码、网页代码和图片等文件全放在这个里面哟。(如图中所示:htdocs这个目录)4,这是进入D:\xampp\htdocs目录后的效果。再重复一次:我们以后需要把我们以后写的PHP代码、网页代码和图片等文件全放在这个里面哟。5,另外有一个注意项:【请勿必将:“隐藏已知文件类型的扩展名”前面的钩给去掉。】2.2 windows环境安装- 30 -本文档使用 看云 构建为什么呢?因为我们PHP文件的后缀只能是xxx.php。而很多朋友,最开始喜欢鼠标右键建立一个记录本文件后,把名字改成xxx.php。可是怎么都不变,并且怎么也不显示。这是因为windows操作系统把xxx.php.txt文件后面的已知文件扩展名.txt隐藏掉了。可以针对我说的这个特点,在电脑上进行一下实验。尝试一下看看效果,有助于你的理解。选择:工具、文件夹选项。如下图所示:2.2 windows环境安装- 31 -本文档使用 看云 构建针对以上的说明,我们新建一个abc.php文件做一个实验看看效果。这是隐藏已知文件类型的扩展名的时候:这是将隐藏已知文件类型的扩展名的时候:2.2 windows环境安装- 32 -本文档使用 看云 构建6,我们打开浏览器(IE、chrome、360安全浏览器均可)。在地址栏里面输入:http://127.0.0.1 你将会看到一个神奇的界面。我们将网页服务器、数据库服务器、PHP运行环境安装成功啦。以后我们只需要开始写代码即可!附录:操作系统:在附录中也有介绍。再讲解一次,例如我们买了一部联想、小米的手机,而管理这部手机的硬件和应用的特殊软件就叫操作系统。大家谈到的windows XP、win 7、windows 10等也都是操作系统。不过一个安卓系统是管理手机的,而通常windows系统是管理电脑的。仅此而已。英文单词:web 网页2.2 windows环境安装- 33 -本文档使用 看云 构建server 服务器2.2 windows环境安装- 34 -本文档使用 看云 构建2.3 Linux环境安装这一个章节是本书中永远不会写的一个章节,很多人被一些市面上的书籍误导,认为学习PHP前要学习Linux。结果,一看Linux,就对人生和学习失去了希望。我们作为有过10年以上开发经验和内部训经验的专业人士告戒各位:Linux学习与PHP学习没有必然的联系,这是两个不同的知识体系。作为有多年开发经验和教学经验的我们。我们强烈不建议没有接触过Linux的学生,为了学习PHP而去安装Linux环境如果您有经验,我们相信你一定能解决,如果解决不了。请加QQ群和访问官网:PHP学院 学习相关视频或者进行提问。如果您觉得本书很好,可以分享告诉给您的朋友。2.3 Linux环境安装- 35 -本文档使用 看云 构建2.4 其他开发环境对本章不感兴趣,可以略过,只是介绍和说明。其他开发环境有很多:1,比如 苹果电脑的系统 Mac os2,比如 在线环境(你使用了百度、新浪、阿里等云计算环境)3,其他更多... ...当然,你甚至可以使用安卓手机和苹果手机来部署你的开发环境。就像有些人可以在各种复杂的环境,甚至U衣酷的试衣间里M..L。我想,这应该不是正常人类该进行的尝试吧。如果你在使用这些环境遇到了问题,相信你已经有过一定的开发经验和处理问题的经验了,这不是刚开始学习编程该掌握的内容。但是,如果你真遇到了这些问题。你可以上PHP学院官网学习。2.4 其他开发环境- 36 -本文档使用 看云 构建2.5 写代码的工具选择写代码的工具有很多。对于刚开始学习PHP的朋友来说。选择工具有几个原则:1,不要使用带自动提示的工具(例如eclipse、zend studio等PHP开发工具集)2,写完的代码必须要有颜色高亮显示。(不能使用:txt文本编辑器等无代码颜色显示的编辑器)你可能想问,为什么呀?我们发现电视、电影和现实生活中的编程高手,噼里哗啦就写一堆代码,一点都不报错,点击就能运行。而我们对着他们的代码抄袭反倒抄错。这种感觉特别不好!!!——传说中的这些高手,他们都曾经在基础代码上反复练习过,所以他们不会写错。而我们需要到达高手之境界,在学习初期就不能使用先进的工具。这样会浪费我们保贵的练习代码、调试错误的机会。因为先进的编辑器通常有很多先进的功能,例如:1. 代码自动显示错误2. 代码自动换行这些先进的工具,对于开始入门学习的你,不利于新手产生独立解决问题的能力!推荐的开发工具1. NotePad++ (PHP学院官网下载地址:)PHP学院下载地址:http://down.phpxy.com/tools/npp_V6.7.9.2_Installer.1435039587.exe百度下载地址:http://rj.baidu.com/soft/detail/13478.html?ald2. 未安装其他扩展的GVimPHP学院下载地址:http://down.phpxy.com/tools/gvim74.3336883054.exe百度下载地址:http://rj.baidu.com/soft/detail/12314.html?ald这些工具,你只需要下载下来,一直点击下一步,安装到你的电脑上即可。2.5 写代码的工具选择- 37 -本文档使用 看云 构建2.5 写代码的工具选择- 38 -本文档使用 看云 构建03. PHP基本语法我曾经带过很多人,也看过很多人写代码。其中的有些人,在写代码的时候:——觉得自己是天才,一看就懂。而实际过程当中,往往是:>一看就懂,一写就错。所以我们给所有刚入门学习编程(任何语言)的朋友一个总结了十年的经验:>永远不要骗自己,写不出来代码就是不会。凯哥语录:基本语法的训练要像亲吻一样熟练。03. PHP基本语法- 39 -本文档使用 看云 构建3.1 PHP基本语法什么是基本语法?基本语法就是组成编程语言的基本规则,是一些非常具体的规定。对于编程语言当中的基本语法:我们认为跟地球的法则一样,在没有办法打破法则之前就是规定,规则。切记不要犯很多新手一样的毛病——为什么这个基本语法要这样写呢?3.1 PHP基本语法- 40 -本文档使用 看云 构建3.1.1 写出你的第一段PHP代码这句代码非常神奇,一句话能变成一个网页。是我们PHP入门的第一段代码。现在你可以在网页服务器的根目录(D:\xampp\htdocs)当中新建一个文件。文件的名字为:abc.php。在这个abc.php文件中写入如下代码。你可以在浏览器地址栏里面,输入你的服务器地址。我们当前是以自己的电脑作为网页服务器来使用的,你可以在地址中输入:http://127.0.0.1/abc.php你将会看到一个网页,网页内容通常,如下图所示:3.1.1 写出你的第一段PHP代码- 41 -本文档使用 看云 构建3.1.1.2 用中文翻译这句话给你听刚刚我们看到这个代码已然生成了一个网页。不明白其中的意思,现在我一点一点跟大家解释。而,遇到上面的【问号、尖括号】说明PHP代码写完了。再之后的部份,跟我PHP没有关系啦。现在大家看会了?请问:phpinfo() 后面还接了一个分号(;),并且在phpinfo()的上一行和后一行,还有两个回车符。请问这是什么意思呢?现在我告诉你答案:phpinfo是一个函数(功能),这个函数(功能)会显示一个当前电脑(服务器)的详细的PHP信息。在后面会专门为大家讲解phpinfo()这个函数。这个函数必须要大家记住!电脑是一个很笨的东西。他需要我们人为的告诉他,代码写完了。我们用分号(;)来告诉他代码写完了。因此,只要我们写完一段代码,就需要在后面加分号(;)。而前后两行的回车空行,是为了让代码更加好看,避免叠在一起,让人看着不舒服。其实,中间你有多少个回车空行都没有关系的,保证好看就行了。PHP的语法解释器(PHP最核心的部份)不会处理这些空行的。注意事项:php的代码部份全部要用半角的英文、很多人容易写成全角的英文和符号造成PHP代码报错。PHP代码的最后一行可以加也可不加分号。由于很多学习者特别是初学者经常犯一个毛病:写完一行代码不加分号。因此,容易报错。我们通常在公司里面规定:一行代码写完,就必须要加分号。PHP还可以有简洁声明模式,我们在这个阶段以代码练习为主。关于环境配置问题,暂时不建议学习。在后面的章节中,我们会专门进行讲解。以上,非常容易在实际开发中不小心造成错误。我们在写文件abc.php这个文件命名的时候,只用英文半脚(a-zA-Z0-9_-)这些字符来命名文件。文件命名不要用中文,不要用特殊符号,不要中间加空格,严格区分大小。3.1.1 写出你的第一段PHP代码- 43 -本文档使用 看云 构建3.1.1 写出你的第一段PHP代码- 44 -本文档使用 看云 构建3.1.2 读过初中你就会变量大家在读初中的时候呀。老师经常会这么教大家。请问,李磊和韩梅梅同学,假如:x = 5y = 6那么x + y 等于多少呢?大家会义无反顾的回答。x + y 等于11。接下来我们看下面的初中的数学知识,请问x + y 的结果是多少?x = 5y = 6x = 8我估计大家也会义无反顾的回答:x + y 的结果为14。这就是变量!变量的几个特点:1. x = 5 将右边值5,赋值给左边的x2. 第二段x = 8,最后x + y 的结果等于14,说明x在从上到下的运算(执行)中,可以被重新赋值。我们在PHP中的变量也是如此。不过有几个特点:1. 必须要以$开始。如变量x必须要写成$x2. 变量的首字母不能以数字开始3. 变量的名字区分大小写4. 变量不要用特殊符号、中文,_不算特殊符号5. 变量命名要有意义(别写xxx,aaa,ccc这种 变量名)错误举列:错误:变量以数字开始错误:变量中有特殊字符,中文错误:变量命名没有意义aaa容易数错,也没有含意错误:变量严格区分大小写 $dog 和 $Dog是PHP学院的变量,尝试将$dog的值改为8.结果D写成了大写。正确举例:正确:变量不能以数字开始,但是数字可以夹在变量名中间和结尾正确:变量不能有特殊符号,但是_(下划线不算特殊符号)注:你会发现代码是从上向下执行的。$ 叫作美元符,英文单词:dollar。PHP的变量必须以美元符开始。说明搞PHP有“钱”图3.1.2 读过初中你就会变量- 46 -本文档使用 看云 构建dollar读音:['dɒlə(r)]解释:美元3.1.2 读过初中你就会变量- 47 -本文档使用 看云 构建3.1.3 echo 显示命令echo 是在PHP里面最常用的一个输出、显示功能的命令。我们可以让他显示任何可见的字符。你可以对着做做实验。等下一章,我们讲数据类型的时候,我会教大家输出中文和用PHP显示网页内容。单词:echo读音: ['ekoʊ]解释:发出回声;回响。功能解释:输出、显示3.1.3 echo 显示命令- 48 -本文档使用 看云 构建3.1.4 注释的功能很强大所谓注释,汉语解释可以为:注解。更为准确一些。因为代码是英文的、并且代码很长,时间长了人会忘。所以我们会加上注释。注释的功能有很多:1. 对重点进行标注2. 时间长了容易忘快速回忆,方便查找3. 让其他人看的时候快速看懂4. 还可以生成文档,代码写完相关的文档就写完了,提高工作效率5. 注释、空行、回车之后的代码看起来更优美6. 注释可用来排错。不确定代码中哪一块写错了,可以将一大段注释,确定错误区间7. 注释中间的部分的内容,电脑不会执行它先给大家看看我们觉得优美的代码,整齐、规范、说明清楚、一看就懂。(不需要理解代码的含义):再看看我们眼中觉得丑陋的代码,对齐丑陋不说,并且没有功能说明(不需要理解代码的含义):3.1.4 注释的功能很强大- 49 -本文档使用 看云 构建我们了解了注释的好处,接下来我们来说PHP的注释,注释分别:单行注释(只注释一行)多行注释(注释多行)单行注释// 表示单行注释号也表示单行注释,用的比较少* 多行注释/*多行注释 这里是注释区域代码*/单行注释举例:注:通过上例我们知道,注释通常写代码上面。多行注释举例:3.1.4 注释的功能很强大- 50 -本文档使用 看云 构建注:通过上面的例子我们发现,我们要写上很多注释的时候,使用多行注释。* * * * *注:暂时不讲解如何通过专门的工具生成注释3.1.4 注释的功能很强大- 51 -本文档使用 看云 构建3.2 数据类型并不神秘数据类型并不神秘人类世界对万事万物都有种类划分,例如:哺乳动物人、猫、马、鸭嘴兽....等等蔬菜西红柿、波菜、茄子....等等水果西瓜、桃子、苹果....等等上面这些都有类型,那数据为什么不能有类型呢?数据类型:就是对数据分类的一个划分而已。3.2 数据类型并不神秘- 52 -本文档使用 看云 构建3.2.1 整型就是整数我一直在讲,不要被名词的含义所吓唬住。到底什么是整型呀?所谓整型,就是大家数学中所学的整数。整型——整数也,英文称之:integer。英文简写:int整型分为:1. 10进行2. 8进制 (了解,基本不用)3. 16进制(了解,基本不用)整型(整数)在计算机里面是有最大值和最小值范围的。【了解知识点,开发中不常用】大家经常听说32位计算机,也就是32位计算机一次运算处理的最大范围为-232至232-1。64位计算机呢?——-264至264-1。10进制声明:8进制声明:以0开始,后面跟0-7的整数(了解知识点)16进制声明:以0x开始,后面跟0-f的,0x的abcdef不区分大小写。(了解知识点)3.2.1 整型就是整数- 53 -本文档使用 看云 构建本章学习重点,学会如何声明10制制整数即可。了解8制制和16进制的声明,实在不会也不要紧。思维误区:容易去考虑8进制和16进制到底是怎么产生的。3.2.1 整型就是整数- 54 -本文档使用 看云 构建3.2.2 布尔就是易经的知识布尔类型是一个非汉语的解释,在英文当中的泊来之物。所谓布尔类型,汉语翻译过来之后,更好的解释是用道家中易经的语言来进行解释,即为:阴/阳男/女真/假对/错存在/不存在0/1等等.... ...是人类繁衍过程中,我们对逻辑判断的一种总结。例如电视剧里面经常讲到的一句话:**如果那个漂亮妹子(帅哥)被我泡到手了,我死都愿意。**用计算机的代码完全可以写出这句话:如果我泡到了漂亮妹子则:我愿意去死如果没有泡到则:我不愿意去死在我们的思维过程当中,始终在遵循上述的思考模式来思考问题。因此,前辈们为我们进行了总结,在计算机里面把这种判断和思考方式,叫作布尔判断。为这种思考方式专门做了一个数据类型,即为布尔类型。布尔类型就是:真和假。在英文把真和假翻译过来就是:true(真)false(假)因此,我们在PHP代码里面可以这样声明。3.2.2 布尔就是易经的知识- 55 -本文档使用 看云 构建英文单词true读音:[tru:]解释:真正地; 确实地; 正确地; 正当地;false读音:[fɔ:ls]解释:虚伪的; 不正的boole英文全称:boolean读音:[bu:l]解释:布尔类型、布尔数学体系注:true和false外面不要加引号。类型转换,后面的课程当中我们来讲解。布尔值=false整数值=0浮点数=0.0空字符串空数组没有变量成员的对象。变量值为空NULL例如:$a= false; //$a设置为假$b=NULL: //$b设置为null$c=NULL; //$c设置为null除了上述情况以外,其余情况值将会被转换为true,一般来说,1为true,0为false。这些转换将在以后的判断语句中经常遇到。3.2.2 布尔就是易经的知识- 56 -本文档使用 看云 构建3.2.2 布尔就是易经的知识- 57 -本文档使用 看云 构建3.2.3 字符串字符串就是所有我们可见和不可见的字符,就是我们日常当中说的话,就是我想说:“李文凯好帅”或者“凤姐,我爱你!”。字符串,就是我想表达的一切让人看到的字符。例如可以看到的字符:我愿变成童话你,你爱的那个王子,有房有车有票子。^@@@#@my name is xiaoshenyang以上可以见到的文字,HTML标签、特殊字符和英文等等,我们都认为是字符串。注:不可见字符暂时不讲解,因为,文本中无法表现,下面的实验中逐渐注意即可。为了有更清晰的表现,也可以观看本书配套的PHP学院出品关于字符串的视频。在PHP语言中声明字符串有三种方式:1. 用单引号声明2. 用双引号声明3. 用字界符声明(需要输入非常大段的字符串时使用)1.单引号声明用英文半脚的单引号,将字符串包起来1. 双引号声明字符串在字符串两边加双引号。3.字界符声明1).在变量后面的等号写三个小于号(<<<)。2).然后在<<<后面写上字符(建议英文大写字符)。如下例中的:ABC3).然后换行写上任意想写的字符4).写完后,顶行。在行最开始处,再写上<<<后面的字符和分号。如下例中的:ABC;###那双引号和单引号有什么区别呢?**【重要知识点】PHP面试题中,高概率面试题(建议背诵并实验三遍以上)**1. 双引号解析变量,但是单引号不解析变量。2. 在双引号里面插入变量,变量后面如果有英文或中文字符,它会把这个字符和变量拼接起来,视为一整个变量。一定要在变量后面接上特殊字符,例如空格等分开。3. 如果在双引号里面插变量的时候,后面不想有空格,可以拿大括号将变量包起来。4. 双引号解析转义字符,单引号不解析转义字符。但,单引号能解析\' 和\\5. 单引号效率高于双引号,尽可能使用单引号6. 双号和单引号可以互插!!!双引号当中插入单引号,单引号当中插入变量,这个变量会被解析。7. 神奇的字符串拼接胶水——(.)点,用来拼接字符串。8. 我们将定界符声明字符串视为双引号一样的功能来看待。####实验举例**1.双引号解析变量,但是单引号不解析变量**在浏览器中打开,运行的结果如下:![2015-07-26/55b4931eef9c5](http://box.kancloud.cn/2015-07-26_55b4931eef9c5.png)通过上边的例子,我们发现。双引号中间的变量够执行显示,我们将$str这个字符串两边的双引号,改为单引号试试,再看一次执行结果:![2015-07-26/55b4938bea073](http://box.kancloud.cn/2015-07-26_55b4938bea073.png)发现$shouji 直接显示出来了,而不是双引号的显示结果。通过上例,我们证明了:双引号执行变量,而单引号不执行变量。我们得到一个重要结论:> 双引号需要解析变量,因此双引号的效率没有单引号高。我们如果为了更高的效率,我们通常使用单引号。**2. 在双引号里面插入变量,变量后面如果有英文或中文字符,它会把这个字符和变量拼接起来,视为一整个变量。可以在后面接上特殊字符,例如空格等分开。**但是,我们在$str 声明的这个字符串中将$huaqiangu 后面接个空格再接aaaa,代码如下:大家发现执行显示的结果不再是空白页面,而是这个页面中有内容了。如下:3.2.3 字符串- 60 -本文档使用 看云 构建![2015-07-26/55b4f5794a6ad](http://box.kancloud.cn/2015-07-26_55b4f5794a6ad.png)我们把代码再改改:大家打开一次页面,执行了一次代码看看结果是不是变为了:> 花千骨!aaaa因此,证明了我们的第二项观点。**3. 如果在双引号里面插变量的时候,后面不想有空格,可以拿大括号将变量包起来。**那,如果我不想在后面有空格有,有特殊符号,就想直接显示变量$huaqiangu呢?——我们的解决办法是用大括号把变量包起来。代码如下:于是,大家会发现花千骨后面没有了特殊符号,也没有空格了,达到了我们想要的显示结果,演示效果如下:![2015-07-26/55b4f6de368e1](http://box.kancloud.cn/2015-07-26_55b4f6de368e1.png)**4. 双引号解析转义字符,单引号不解析转义字符。但,单引号能解析\' 和\\**第4个字符串的注意事项比较难以观察,转义字符有一些,但最常用的有:\n 回车\t 缩进我们来通过实验先来理解\n和\t是什么。3.2.3 字符串- 61 -本文档使用 看云 构建做这一块的实验中有一个注意事项,显示网页是看不出来效果的,如下:![2015-07-26/55b4f88038913](http://box.kancloud.cn/2015-07-26_55b4f88038913.png)为什么看不出来\n和\t代表什么含义,也看不出来双引号解析了\n和\t呢?——因为,你没有**点击鼠标右键查看源代码**。我们来点击一下,再看看效果。第一步:显示网页源代码![2015-07-26/55b4f916e79c5](http://box.kancloud.cn/2015-07-26_55b4f916e79c5.png)第二步:查看HTML源代码显示的结果:![2015-07-26/55b4f949219d9](http://box.kancloud.cn/2015-07-26_55b4f949219d9.png)大家来对比字符串变量:> $string = "每天PHP学院\n给梦想\t一个机会";\n在PHP学院的后面,在源代码里显示的结果是跟按了回车键一样的效果。\t在给梦想和一个机会中间。显示的结果是有几个空格的效果。\t相当于我们在电脑上按了一个tab键效果。但是,我们同样执行一下上面的代码,但是$string双引号改为用单引号:执行一次看看效果:![2015-07-26/55b4fa4556af4](http://box.kancloud.cn/2015-07-26_55b4fa4556af4.png)你会发现——单引号中间的\t和\n直接显示出来了,而没有变成按一次回车键和按一次tab键后的效果。因此:> 双引号执行转义字符而单引号不执行转义字符。**5. 转义字符\(反斜线的使用)**如果我们声明一个变量$beizi,我们想要在$beizi声明的双引号中间加上一个双引号显示输出怎么办?如果真如上述所写代码,代码会报错。报错结果如下:3.2.3 字符串- 62 -本文档使用 看云 构建因为字符串:“多于绝大多数的人出生就是杯具,但是"我们在不断的让人生变为喜剧”必须写在双引号中间。而双引号中间还有一个双引号。也就是意味着字符串声明提前结束了,在“但是”处结束了。后面"我们在不断的让人生变为喜剧",电脑不认识。这真是一个杯具!那么办?答:我们需要将双引号原有的意义去掉。再双引号前面加上一个\(反斜线,计算机的专业名词叫转义字符),就可以了。你可以再执行一下上面的代码,发现不再报错了。同理可推,单引号当中要插入一个单引号显示出来的时候,也可以在单引号声明的字符串中的单引号前面加上\(反斜线,转义字符),将单引号的意义(限定字符区间)去掉。**6. 双号和单引号可以互插!!!双引号当中插入单引号,单引号当中插入变量,这个变量会被解析。**代码如下:执行结果如下:![2015-07-26/55b4ff2d043ac](http://box.kancloud.cn/2015-07-26_55b4ff2d043ac.png)3.2.3 字符串- 63 -本文档使用 看云 构建**7. 神奇的字符串拼接胶水——(.)点,用来拼接字符串。**上面这段代码是,我们曾经说过双引号能够解析变量,有一个问题:> 效率没有纯单引号的高那么问题1:我想改为效率最高的方式应该怎么办?问题2:我有多个字符串,要拼接在一声怎么办?那,我们需要使用到神奇的胶水:(.)点,用来拼接字符串。因此,刚刚的问题一的代码我们可以改为:**8. 我们将定界符声明字符串视为双引号一样的功能来看待。**你可以执行发现$weilai,$mimang,\t\n都可以执行,双引号单引号都能显示。这就是定界符的特点。#### 再声明一次:字符串的声明每一项都必须记住,非常常用。并且面试题出现的概率非常高!* * * * *不可见字符:主要是计算机规定的一些特殊符号。例如:回车(\n)、缩进(\t)等。双引号执行变量,所以3.2.3 字符串- 65 -本文档使用 看云 构建3.2.3 字符串- 66 -本文档使用 看云 构建3.2.4 浮点型所谓浮点类型,可以理解为:我们数学里面的小数。【注意】关于精度、取值范围和科学型声明不是学习的重点。因为此块在实际开发中用的特别少。我们将此块的知识点的学习标注为,了解级别。声明方式分为两种:1. 普通声明2. 科学声明普通声明浮点数我们将文件保存到XAMPP的htdocs目录下,保存文件名为:float.php。在浏览器地址栏,输入:http://127.0.0.1/float.php,执行看看结果,如下:echo 直接输出了12121.3132,而var_dump 输出了0.8873,还显示了变量$fl的类型为float。var_dump() 是一个函数。向括号()中间插入变量。这个函数,会打印出来数据类型,还会对应显示变量的长度和值。var 是指变量的英文 : variablefloat读音:[floʊt]中文解释:计算机中的浮点类型3.2.4 浮点型- 67 -本文档使用 看云 构建variable读音:[ˈveriəbl]中文解释:变量dump读音:[dʌmp]中文解释:倾倒; 倾销;3.2.4 浮点型- 68 -本文档使用 看云 构建3.2.5 重要:if和else语法这是一个非常重要的章节,也是PHP当中的一个重要的语法。【注意】我对这个语法的定义级别为:默写级别。也就是你需要,闭着眼睛,都能够写出来的东西。英文中的解释:if读音:[ɪf]中文解释:如果else读音:[ɛls]中文解释:否则我们将if和if...else组合成了四种基本语法,每一种都必须背下来。3.2.5 重要:if和else语法- 69 -本文档使用 看云 构建很多人喜欢买彩票,我们拿买彩票的过程来写个if的例子。在《3.2.2布尔就是易经的知识》这一章中跟大家做了一个猥琐的举例:例如电视剧里面经常讲到的一句话:**如果那个漂亮妹子(帅哥)被我泡到手了,我死都愿意。**我们拿流程图来看就是如下的样子:3.2.5 重要:if和else语法- 70 -本文档使用 看云 构建用计算机的代码完全可以写出这句话:如果我泡到了漂亮妹子则:我愿意去死如果没有泡到则:我不愿意去死如果按流程图来看的话就是这样:3.2.5 重要:if和else语法- 71 -本文档使用 看云 构建上面的这个例子,我们完全可以用if...else...翻译成代码:在if...else中,我们再写一个可以用大括号括起来,多句话的例子:3.2.5 重要:if和else语法- 73 -本文档使用 看云 构建3.2.6 NULL类型空在英文里面表示是null,它是代表没有。空(null)不是false,不是0,也不是空格。【重点】知道null产生的三种情况,学习empty 和 isset两个函数的区别。主要有以下三空情况会产生空(null)类型:1. 通过变量赋值明确指定为变量的值为NULL2. 一个变量没有给任何值3. 使用函数unset()将变量销毁掉我们用代码来演示一下。接下来我们来讲解两个跟null相关的函数,这两个函数非常常用,我们将级别定义为【默写级别】。empty()可以向括号中间传入一个变量。这个变量的值如果为false或者为null的话,返回true。上述实验证明,$apple为null。将apple放至empty中间。结果执行了真区间。isset()可以向括号中间传入一个或者多个变量,变量与变量间用逗号分开。只要有一个变量为null,则返回false。否则,则返回true。3.2.6 NULL类型- 74 -本文档使用 看云 构建unset()这个函数的功能是毁掉变量。unset(变量)括号中间插入想要毁掉的变量名,这个变量就会被毁掉。英文说明unset读音:[ʌn'set]解释:复原3.2.6 NULL类型- 75 -本文档使用 看云 构建3.2.7对象以后会学对象类型大家这这里不用学习。因为以后会有几个专门的章节来学习,你会觉得很爽的:本章重点:1. 知道对象是一个复合类型2. 对象的英文叫object,var_dump一个变量的时候看到的类型为object的,这个变量就是对象类型所谓复合类型:就是在一个类型中可以同时存入字符串、浮点、整型、布尔等object读音:[ˈɒbdʒɪkt]解释:对象、物体、目标3.2.7对象以后会学- 76 -本文档使用 看云 构建3.2.7对象以后会学- 77 -本文档使用 看云 构建3.2.8 数组会有单纯的一个章节数组类型我们也不在这里学习,因为以后会也有一个章节来进行讲解。本章重点:1. 知道数组是一个复合类型2. 数组的英文叫array,var_dump一个变量的时候看到的类型为array的,这个变量就是数组类型3. 会一个最简单、最基本的数组声明【默写】接下来我们声明一个数组,了解数组里面可以插入多个值就行。array读音:[ə'reɪ]解释:数组、队列3.2.8 数组会有单纯的一个章节- 78 -本文档使用 看云 构建3.2.9 资源类型资源类型很多初学者觉得比较难以理解。因为资源类型打印出来只能够看到一个英文的resource。其他的什么在电脑上都不能显示出来,而他有客观存在。其实,资源类型很简单。我们针对词来进行说明。电脑里面的资源是指:1. word,excel等文件2. 有人收藏的美女图片和我们的自拍照片等图片3. 音乐4. 某些人爱看的AVI小电影5. 打开的网页6. 数据库... ...我们打开一个图片,用PHP来操作它,我们就是操作的一个资源。我们打开的数据库连接,我们需要连接数据库,数据库就是我们操作的资源。包括网络连接,连接后发送邮件,我们也可以认为是一个资源。本章重点:理解资源就提操作我们可见和不可见的文件、网络和数据。我们在以后的章节中,操作图片和网络的时候大家会有更为深刻的印象。英文解释resource读音:[ˈri:sɔ:rs]解释:资源3.2.9 资源类型- 79 -本文档使用 看云 构建3.2.10 眼前了解回调类型即可callback,英文中的call是叫,back是返回,回来的意思。callback 汉译过来的意思即为:回调。(执行完成,再调一次某个功能执行一次)我们在讲解函数类型和对象的时候,我们会演示讲解回调函数。call读音:[kɔl]解释:呼唤,喊叫; 召唤,叫来,召集back读音:[bæk]解释:后退; 倒退;3.2.10 眼前了解回调类型即可- 80 -本文档使用 看云 构建3.2.11 查看和判断数据类型我们知道了一个数据的类型,才能进行下一步操作。后面的时候,大家可以学习到更多的知识——自定义功能(函数)。我们来做一个场景模拟:(注:眼前不用会写这个函数,以后会教大家)假设,我们可以写一个智能的功能(函数),它让有一个功能,就是打开一个装有学生成绩的电子表格。这个函数非常先进。1. 只有一个人的时候,就返回一个人的成绩,成绩是整型或者浮点型变量。2. 有2个或两个以上人的时候,返回一个数组类型变量,数组中装有多个人的成绩3. 如果没有人的时候,则返回布尔值的变量,变量值为false通过上面的一个场景模拟,我们知道了,一个函数(功能)有可能返回不同的数据类型。因此,我们可以根据不同的类型来做不同的事情。判断数据类型很重要,我们需要严格掌握。【默写级知识点】显示类型的函数、得到类型的函数、判断类型的函数查看数据类型1. gettype(传入一个变量) 能够获得变量的类型2. var_dump(传入一个变量) 输出变类型和值判断数据类型3.2.11 查看和判断数据类型- 81 -本文档使用 看云 构建我们使用is_* 系列函数。 is_types这一系列的函数,来进行判断某个东西是不是某个类型。如果是这个类型返回真,不是这个类型返回假。is_int 是否为整型is_bool 是否为布尔is_float 是否是浮点is_string 是否是字符串is_array 是否是数组is_object 是否是对象is_null 是否为空is_resource 是否为资源is_scalar 是否为标量is_numeric 是否为数值类型is_callable 是否为函数//把sca的值换成整型、浮点、布尔和字符串试试$sca = true;//如果为标量,执行真区间if(is_scalar($sca)){echo '执行真区间';}else{echo '执行假区间';}3.2.11 查看和判断数据类型- 82 -本文档使用 看云 构建//换成echo,is_int试试,为什么echo执行假区间呢?if(is_callable('var_dump')){echo '执行真区间';}else{echo '执行假区间';}注:istypes 很好记。is 在前后面跟类型即可。标量:整型(int) 浮点(float)、布尔(bool)、字符串(string)混合类型: 数组(array)、对象(object)特殊类型:空(null)、 资源(resouce)、回调(callback)为什么最后的实验中echo执行假区间呢?答:因为echo 不是函数,是基本语法。大家眼前可以不用理解函数和基本语法的区别。了解和不了解在实际开发中没有影响。知道有这个知识点就行。3.2.11 查看和判断数据类型- 83 -本文档使用 看云 构建3.2.12 数据类型的自动转换和强制转换PHP在PHP 5.x阶段都是完全的弱类型的编程语言。所谓弱类型,就是在声明变量的时候,不需要指定变量的类型。我要声明一个整型的变量,我不用在前面非得写上类型,再写变量。而PHP 7 的性能有很大的提高。实际测试的结果,PHP 7的性能与PHP5.6相比,提升了性能接近200%。在PHP 7 中有些地方,我们可以强制指定类型,也可以不用强制指定类型来声明变量。我们接来下来讲强制类型转换和自动类型转换两个部份。【默写级别】布尔值的自动类型转换、强制类型转换的英文单词布尔值的自动类型转换自动类型转换,就是数据类型在某些情况下,自动会变为其他的类型参与运算。自动类型转换的发生时机是:运算和判断的时候某些值会自动进行转换。下面的情况是布尔值判断时的自动类型转换:1,整型的0为假,其他整型值全为真2, 浮点的0.0,布尔值的假。小数点后只要有一个非零的数值即为真。3,空字符串为假,只要里面有一个空格都算真。4,字符串的0,也将其看作是假。其他的都为真5,空数组也将其视为假,只要里面有一个值,就为真。6,空也为假7, 未声明成功的资源也为假我们针对以上针理的规则一项一项来做实验看看结果。1,整型的0为假,其他整型值全为真3.2.12 数据类型的自动转换和强制转换- 84 -本文档使用 看云 构建2, 浮点的0.0,布尔值的假。小数点后只要有一个非零的数值即为真。3,空字符串为假,只要里面有一个空格都算真。4,字符串的0,也将其看作是假。其他的都为真5,空数组也将其视为假,只要里面有一个值,就为真。3.2.12 数据类型的自动转换和强制转换- 85 -本文档使用 看云 构建6,空也为假7, 未声成功的资源也为假其他类型的自动类型转换自动类型转换在运算时也可以发生。跟所有我们总结的规律和观点一样:先总结、后实验。只有标量在运算时会产生以下的自动类型转换:总结:1. 布尔值的true参与运算是会变成整型或者浮点的12. 布尔值的false参与运算是会变成整型或者浮点的03. 字符串开始处是整型或浮点类型的字符,会转成对应的类型参与运算强制类型转换强制类型转换有三种方式:1. 用后面的三个函数可以完成类型转换,intval()、floatval()、strval()2. 变量前加上()里面写上类型,将它转换后赋值给其他变量3. settype(变量,类型) 直接改变量本身我们来进行实验:intval()、floatval()、strval()转换3.2.12 数据类型的自动转换和强制转换- 87 -本文档使用 看云 构建变量前加上()里面写上类型,将它转换后赋值给其他变量settype(变量,类型) 直接改变量本身【你试试】以下是强制类型转换时的特点,每一项你做实验看看对不对:1. 空转为整型会为整型的02. 空转为浮点会为浮点的03. 空转为字符串会为空字符串‘’4. 浮点的123.0转为字符串会为字符串1235. 浮点的123.2转为字符串会为字符串的123.26. 浮点即使小数点再大,它都会被干掉,会舍掉小数点后面的值7. 如果字符串转为整型的时候,如果数值在前面,会将前面的数值拿出来做为整型的转换值。8. settype(变量,'null'); 等价于 unset()一个变量9. $目标变量 = (类型)$操作变量 只会改变目标变量的类型,不会改变原变量的类型,Settype是改变原值3.2.12 数据类型的自动转换和强制转换- 88 -本文档使用 看云 构建set读音:[sɛt]解释:设置type读音:[taɪp]解释:类型、方式3.2.12 数据类型的自动转换和强制转换- 89 -本文档使用 看云 构建3.3 常量和变量3.3.1 用常量限制用户跳过某些文件3.3.2 可变变量3.3.3 外部变量3.3.4 环境变量3.3.5 变量引用3.3 常量和变量- 90 -本文档使用 看云 构建3.3.1 用常量限制用户跳过某些文件常——汉语字面为:长久,经久不变。常量那就好翻译了:长久不变的值。【重点知识】知识级别我们定义为:默写级常量的使用范围非常广泛。我们在以后,定义我们的工作目录、定义一些特点的帐户密码、版本号等我们都会使用到常量。所以这一块的知识,非常重要。常量在代码中的定义、书写方式:define(常量名,常量值)注:1. 常量值只能为上一章中我们讲到的标量。2. 常量名可以小写,但是通常大写3. 常量名可以不加引号,但是通常加上引号。4. 在字符串中调用常量的时候,必须在引号外面5. 常量名建议只用字母和下划线我们用代码来实验一下:1.定义和调用一次常量试试2.注意项目实验此外,系统还为我们准备了一些内置的常量。这些常量都是规定好的。我们先熟悉几个,还有更多的系统常量等我们学习完上册,入门后再慢慢的增加和学习。常量名 说明LINE 当前所在的行FILE 当前文件在服务器的路径FUNCTIOIN 当前函数名CLASS 当前类名METHOD 当前成员方法名PHP_OS PHP运行的操作系统PHP_VERSION 当前PHP的版本TRAIT Trait 的名字,php5.4新加DIR 文件所在的目录NAMESPACE 当前命名空间的名称(区分大小写)defined()函数来做安全机制此处知识,可以先不用掌握。等学习完函数后,再来看本部分代码也可以。defined()我们来学习这种用法,主是是为了防止其他人绕过安全检查文件。函数:defined(常量)功能:向函数的括号后面传入常量,如果常量定义了就返回true,否则返回false【情景模拟】假设,我们的这套在线电子商城的软件需要付钱,检查是否付费是通过对软件授权检查来完成的,而文件version.php中就有检查授权的功能,我们在软件中规定,没有授权检查文件version.php就不能使用这个软件。所有的代码都包含了version.php。并且为了防止有人盗版,我还可以把version.php的代码进行了加密。我们有两个文件:1. 一个文件中间有版本号,版本声明和授权声明。文件名为version.php2. 一个文件中有具体的业务功能。例如:用户注册、登陆等,文件名为users.php我们该怎么做呢?——也就是说不包含 version.php文件就不让,执行users.php之后的代码。3.3.1 用常量限制用户跳过某些文件- 92 -本文档使用 看云 构建我们来进行实验:version.php文件users.php实验结果可知:version.php必须要包含 ,不然不会显示后面的echo '用户注册';include读音:[ɪnˈklud]解释:包含version读音:[ˈvɜ:ʃn]解释:版本user读音:[ˈjuzɚ]解释:用户复数:usersdefine读音:[dɪˈfaɪn]解释:规定3.3.1 用常量限制用户跳过某些文件- 93 -本文档使用 看云 构建函数:include('传入文件路径和文件名')功能:这个函数的功能是传入指定路径的文件,让PHP包含进来执行注意:在后面的章节中会专门讲解和实验include3.3.1 用常量限制用户跳过某些文件- 94 -本文档使用 看云 构建3.3.2 可变变量可变变量,这个词解释的太过于高大上。看起来很有“bigger”。它还有一个叫法,叫作变量的变量。我们认为这些叫法上都不太科学。毕竟都是翻译过来的舶来之物。可变变量其实就是——已声明的变量前,再上变量符。举例说明:上面的过程说明:$shu的值为字符串的'biao'。我在$shu前再加上一个$(美元符号),可以理解成为以下的变形过程:$$shu${$shu} 分成两块来看${'biao'} 把变量$shu解释成了biao$biao 而$biao也是一个变量对应的值是:鼠标你可以自己写几个可变变量玩玩,请问以下的代码运行结果是多少?3.3.2 可变变量- 95 -本文档使用 看云 构建3.3.2 可变变量- 96 -本文档使用 看云 构建3.3.3 外部变量PHP的外部变量是PHP 在使用过程中规定好的一些变量。这个变量的规定是这样规定的,就这样使用。我们先讲解几个最常用的例子,我们将下面的表单命名为user.html:上现是很基础的一段HTML代码,在这段代码的主要意思是把用户和密码,采用get方法,将数据发送给reg.php(在上面代码的第6行规定的)。reg.php想办法接收用户传过来的username和pwd这两个值。我们得出我们的第一个外部变量:$_GET。$_GET 的主要作用是将得到get传值的数据。我们写一个reg.php,用$_GET来接收值试试:你可以输出值看一下结果。通过上面的实验我们知道了,通过$_GET这个外部变量,可以得到从表单输入的值。大家在实验的时候会发现地址栏上面有一个特点:3.3.3 外部变量- 97 -本文档使用 看云 构建根据上图,观察特点:1. reg.php后面跟了一个?(问号)2. 表单里面的username变在了地址栏里面3. 表单面username的值输入的是liwenkai,在username后面跟了个=(等号)输入的值4. username(名字)=liwenkai(值) 后面的密码是password(名字)=NoAlike(值),中间有&(and符)分开密码是可见的,那怎么样保证安全呢。让我在注册的过程当中,密码不在地址栏里面被人看到呢?这个时候我们需要使用到post传值,post传值是在地址栏中不可见的。同样上面例子的代码我们进行修改,html代码如下:PHP的代码里面的$_GET全改为了$_POST:观察特点reg.php后的?(问号)不见了。后面的username和password也不见了。那他怎么传递数据的呢?他是通过我们看不见的浏览器的请求头文件传递的数据。所以在URL(网址)栏不可见。注:附录中有如何通过火狐浏览器的firebug查看传递结果的演示过程。这一块都是HTTP协议规定的传送方式。除此之外,我们还有$_REQUEST来接收数据。现在我们这样处理:将php代码段中的$_POST全改为$_REQUEST,代码如下:把网页user.html里面的这一行中的method,改为get执行一次,再改为Post再运行一次,看看结果:3.3.3 外部变量- 99 -本文档使用 看云 构建通过上面的实验你会发现$_REQUEST即可以接收get传值也可以接收post传值。另外,我们总结一些外部变量,要求知识点的学习级别:了解含义,默写这个单词的写法和作用。全局变量名 功能说明$_COOKIE 得到会话控制中cookie传值$_SESSION 得到会话控制中session的值$_FILES 得到文件上传的结果$_GET 得到get传值的结果$_POST 得到post传值的结果$_REQUEST 即能得到get的传值结果,也能得到post传值的结果请再记一句话:以上这些变量全是超全局的。(以后会讲解超全局的含义)。注:1.我们认为从用户输入过来的所有数据都不是可信的。本书的下半部分会专门讲解限制和过滤2.在提交数据的时候,我们常用的方法有get和post。可以这样理解,get传值在url中可见,而post传值在url中不可见。而post传值在url中不可见,是通过浏览器的header头部分将数据发送给指定服务器的。需要通过专门的工具才能看到post发送的值为什么。你可以下载火狐浏览器(firefox)的插件(firebug)来查看。火狐浏览器的图标:打开firebug:3.3.3 外部变量- 100 -本文档使用 看云 构建查看header头传递数据(网络,点击POST reg.php 选择Post),就看到了传递的名字和传递的数据值:3.3.3 外部变量- 101 -本文档使用 看云 构建1. 若真是使用get传密码,密码在地址栏里面显示过后。浏览器的历史记录会自动记录访问过的地址。恶意用户会通过查看你的浏览器的历史记录,得到你曾经输入的密码。因此,不能使用get方式来作密码的传输方式。get读音:[get]3.3.3 外部变量- 102 -本文档使用 看云 构建解释:得到,计算机里是指一种传送数据的方式post读音:[poʊst]解释:计算机里指一种数据传递方式request读音:[rɪˈkwɛst]解释:请求submit读音:[səbˈmɪt]解释:提交,呈送action读音:[ˈækʃən]解释:行动、活动3.3.3 外部变量- 103 -本文档使用 看云 构建3.3.4 环境变量环境变量我们主要用的有$_SERVER和$_ENV两个环境变量。不过,$_ENV逐渐被PHP的新版本给废弃了。【重点】知道在哪儿查看环境变量的名字(key)和值(value),记住并默写几个常用的环境变量。查看环境变量,我们在学习PHP的第一天就学习过:其实环境变量不是不用背的,我了解在哪儿能够找到环境变量的key(键)和值即可。我们学了phpinfo();打印出来了一批乱乱的东西,我们今天来学习其中的环境变量部份。你在执行phpinfo();的这个网址中,将网页向下拉动翻页,看看能不能找到截图中的部份:3.3.4 环境变量- 104 -本文档使用 看云 构建_SERVER['中间的值'],是需要我们了解意思的。如果我们需要显示我们当前访问的这个phpinfo();页面文件放在哪儿,就可以执行:我们来了解一些常用的环境变量的键名和值对应的意思:3.3.4 环境变量- 105 -本文档使用 看云 构建键名 含义$_SERVER["REQUEST_METHOD"] 请求当前PHP页面的方法$_SERVER["REQUEST_URI"] 请求的URI$_SERVER["SERVER_SOFTWARE"] 用的是哪一种服务器$_SERVER["REMOTE_ADDR"] 客户的IP地址$_SERVER["SERVER_ADDR"] 当前服务器的IP地址$_SERVER["SCRIPT_FILENAME"] 主前请求文件的路径$_SERVER["HTTP_USER_AGENT"] 当前访问这个网址的电脑和浏览器的情况$_SERVER["HTTP_REFERER"] 上级来源(用户从哪个地址进入当前网页的)$_SERVER["REQUEST_TIME"] 当前的时间URI 和URL都是网址,但是URL带有了主机地址部份,而URI不带主机地址部份,例如:http://www.phpxy.com/abc.php?username=liwenkai上面是一个URL(统一资源定位符),而URI是不带主机和(http://)协议的部份:abc.php?username=liwenkaitime读音:[taɪm]解释:时间file读音:[faɪl]解释:文件name读音:[neɪm]解释:名字sowftware读音:[ˈsɔ:ftwer]解释:软件address(简写addr)读音:[ˈædres]解释:地址remote读音:[rɪˈmoʊt]解释:远程,遥远的3.3.4 环境变量- 106 -本文档使用 看云 构建server读音:[ˈsɜ:və(r)]解释:服务,服务器method读音:[ˈmɛθəd]解释:方法port读音:[pɔ:rt]解释:端口3.3.4 环境变量- 107 -本文档使用 看云 构建3.3.5 变量引用变量引用很多老师喜欢来用C语言的指针来去讲解。我们作为有这么多年开发和教学经验的人来说——大多数学习PHP的人来说根本不了解C语言。使用C语言一指针来讲解变量引用,我们觉得画蛇添足。并且,不利于没有C语基础的朋友们学习。关于变量引用的知识点,请以我们的讲解为理解的基准!我们来对比两段代码的执行结果:第一段代码,没有任何区别。跟我们原有的PHP代码一模一样:第二段代码:为什么两个结果都变成6了呢?我经常跟大家这样来举例。我们可以这样来想象:一个变量名,对应了一个数据值。如下图:3.3.5 变量引用- 108 -本文档使用 看云 构建而加上&(and 符后),把变量指向同一个存值空间了,如下图:3.3.5 变量引用- 109 -本文档使用 看云 构建也就是不论$fo或$bar的值如何发生变化,$fo变$bar也变,$bar发生变化,$fo也会发生变化。举个不靠谱的例子,方便你来理解:你家有只小狗,叫作李文凯。又有一只小狗叫作狗蛋。有一天,你把狗蛋给吃了。把狗蛋这个名字给了李文凯那么,你不论是打狗蛋一下,还是打李文凯一下都是打的同一条狗。注:如果你理解、了解、熟悉C语言的指针。可自行用指针方式来理解,不在本文的讨论范围内。3.3.5 变量引用- 110 -本文档使用 看云 构建3.4 PHP表达式与运算符3.4.1 算术运算3.4.2 赋值运算3.4.3 自加、自减运算3.4.4 比较运算3.4.5 逻辑运算3.4.6 位运算3.4.7 运算符优先级3.4.8 三元运算符和其它运算符3.4 PHP表达式与运算符- 111 -本文档使用 看云 构建3.4.1 算术运算算数运算符,就是大家小学所学绝大多数知识:符号 说明 举例+ 加号 $x + $y- 减号 $x - $y| 乘号,乘以 | $x $y/ 除号,除以 $x / $y% 取余也叫取模、求模 $x % $y与我们数学所学一样,也有优先级:先乘除,后加减。如果你想更明确的改变优先级,那就用()【小括号】,将想要优先的运算给括起来。3.4.1 算术运算- 113 -本文档使用 看云 构建3.4.2 赋值运算赋值运算,我们已经学过了。我们在数学里面把 = (一个等号)叫作赋值运算符,即:把等号右边的值,赋值给等号左边的变量,左边的变量就为右边的值。代码是从上到下运行的,因此赋值就可以从上至下的反复赋值:上例中x被反复赋值为不同的类型的值了。上面我们已经学习过了很多次了。那么PHP的赋值运算符还有几个:符号 举例 等价式+= $x += $y $x = $x + $y-= $x -= $y $x = $x - $y= | $x = $y $x = $x * $y/= $x /= $y $x = $x / $y%= $x %= $y $x = $x % $y.= $x .= $y $x = $x . $y上面的例子和等价式都有明确的说明。$x += $y 等价于 $x = $x + $y以上的全部记住即可。都是一些语法上的规定。3.4.2 赋值运算- 115 -本文档使用 看云 构建3.4.3 自加、自减运算自加自减,就是把自己加1,或者减1。如果你学习过其他编程语言。你会发现,此处的用法又是计算机里面的一个规定。可以这样用,用起来更加简洁。符号 说明$x++ 先赋值后加$x-- 先赋值后减++$x 先加后赋值--$x 先减后赋值上面的用法其实挺简单的,按照上面的例子。我们分成步骤去,按过程去判断即可。我们来对比一下先加后赋值,如下:你再做实验,试试$x-- 和 --$x的结果是这样吗?请回答,下面$water + $paper的结果为多少?3.4.3 自加、自减运算- 117 -本文档使用 看云 构建3.4.4 比较运算比较运算符,在大家小学的时候就学了很多,有:说明 符号大于 >小于 小于 = (电脑打不出 所以用>=)小于等于<= (电脑打不出所以用 <=)不等于!= (不等的另外一种写法)电脑打不出等于 ==(赋值是=号,所以==规定为等于)全等(判断类型等于) ===全不等(判断类型不等于) !==我们来回顾一下小学时候学的知识:x = 5y = 63.4.4 比较运算- 118 -本文档使用 看云 构建xy 是错的,因为x为5,y为6所以x大于y这个判断式是错的我们小学的时候就学过类似于这样的判断题。而电脑里面的对错,就是bool(布尔)数据类型的真(true)和假(false)。那,我们是不是可以用之前所学的if...else来判断类型呢? $y){//真区间echo '变量x 大于 变量y,成立';}else{//假区间echo '变量x 大于 变量y,不成立';}?>我想,如果小学毕业的你。小于、小于等于、大小等于、不等于都会做实验了,请你实验几次。并且,完全能够默写!接下来的一个重点是演示,等于(==)和全等于也叫判断类型等于(===)。我们来写一段代码,大家看看两段代码就是符号PHP学院,为什么结果有这么大的差距呢?下面这段代码执行出来的结果,运行了真区间。下面这段代码执行出来的结果,运行了假区间。我们对比区别发现:下面这段代码是===(三个等号,我们说他还有一个名字是判断类型等于)。而$x为整型的5.$y为字符串类型的5.类型不同,所以执行的是假区间。而上面一段代码,是两个等号不判断类型,所以执行的是真区间。3.4.4 比较运算- 120 -本文档使用 看云 构建3.4.5 逻辑运算逻辑运算符比较简单,是我们人类进行逻辑思考时的一种方式。讲出很多屌丝男士的心愿:某一个女人,要不长得漂亮、要不有钱我就娶她。如果一个条件都没有,那就算了。上面的这种不评价好坏的心理状态,只是来说明这就是典型的计算机思维。美丽这个条件成立(true) 或者 财富这个条件成立(true),则执行娶她的行为和动作。否则,就不娶这个女孩。那我们把这些逻辑关系进行了归纳和总结,下面表格中的:$x为条件一,$y 为条件二。进行说明:逻辑与,中文解释为并且。可理解为,$x 并且 $y 都为真(true)的时候执行。逻辑或,中文解释为或者。可以理解为,$x或者$y其中一个为真(true)的时候执行。逻辑非,中文解释取反。如果$x的执为假(false),进行一次非操作。非假(false)就为真了,就可以执行真区间了。反推true,则执行假区间了。逻辑异或,如果$x和$y相同则为false,不相同则为true。举例 说明 详细说明$x and $y 逻辑与(并且关系) $x 和$y 为真则返回真$x && $y 同上 同上$x or $y 逻辑或 $x,$y均为false时为假,其他情况全为真同上 同上!$x 逻辑非 取反,即true变为false,false变为true$x xor $y 逻辑异或 相同取false,相异为true那我们来举几个例子来试试,你自己也要记得多做几次实验(可结合3.4.4这一章中的比较运算符自己写几个例子哟)。逻辑与:逻辑或:逻辑非:【重点知识】短路短路就是采用一个懒人模式来思考问题。逻辑与的特性是:两边为true即为true,其他情况均为假。逻辑或的特性是:两边为假均为假,其他情况全为真。我们现在把自己想象成一个懒汉,非常非常懒。来思考逻辑与和逻辑或。可不可以这样理解:逻辑与:如果前面第一个条件为false了,后面就可以不用执行了。用代码表示:if($x && $y) 如果$x已经为false了,后面的$y 就没有执行必要了。逻辑或:前面第一个条件为true了,后面就不用执行了。3.4.5 逻辑运算- 122 -本文档使用 看云 构建用代码表示:if($x || $y) 如果$x已经为true了,后面的$y 就没有执行必要了。我们写段代码来证明一下:代码如下,将两个&符改为一个&符试试:我们来看看短路的逻辑或:改成一个 | 再看看执行结果3.4.5 逻辑运算- 123 -本文档使用 看云 构建通过上例我们知道了&&与&的区别,||和 |的区别。我们也了解了什么是短路。那我们在什么地方可以用到短路呢?有一些奇怪的写法,我们必须了清楚。其实就是基础语法的再应用。回顾3.3.1最后一段内容: $b 右移将 $a 中的位向右移动 $b 次(每一次移动都表示“除以2”)。以上的符号,均为二进制的运算。二进制大家绝大多数情况下不会遇到,遇到了补一下二进制这一块的知识就会了。变量 二进制值$x 0101$y 1000异或结果 11013.4.6 位运算- 125 -本文档使用 看云 构建异或解释:如果x,y两个值不相同,则异或结果为1。如果x,y两个值相同,异或结果为0。由此可推1101为$x和$y异或出来的结果,1101用二进制转10进制工具转换后的结果就为13。在线二级制转十进截图:3.4.6 位运算- 126 -本文档使用 看云 构建3.4.7 运算符优先级本章的学习级别为了解级别。因为绝大多数人都不会去记运算符的优先级。我们在小学的时候,优先级是先乘除后加减。想要改变运算的优先级加括号即可。重点:不用记优先级,确定不了的时候号上括号把优先级标出来即可3.4.7 运算符优先级- 127 -本文档使用 看云 构建3.4.8 三元运算符和其它运算符此外还有一些特殊的运算符和符号,我们先来进行讲解。可能以后我们需要用到。符号 说明$x? 真代码段:假代码段 判断是否为真假 ? 真情况 : 假情况;``(反引号) 反引号中间插代命令,执行系统命令,等价于shell_exec函数@ 单行抑制错误,把这一行的错误不让它显示出来了,效率低不建议使用=> 数组下标访问符-> 对象访问符instanceof 判断某个对象是否来自某个类,如果是的返回true,如果不是返回false三元运算符,相当于是if...else结构。不过三元运算符的写法更加简洁,语法格式如下:$x? 真代码段(只能写一句代码):假代码段(只能写一句代码);代码如下:反引号就更加特殊了,我们经常需要显示IP地址,在PHP里面可不可能显示我们windows的IP地址呢?用反引号,就可以执行我们的命令(不过有些虚拟服务器是禁止执行这些的命令脚本的):上面的代码你执行看看效果,是不是显示出来了你机器的IP地址和一堆和IP相关的参数?@符是指单行抑制错误,以后的章节我们还会讲解到。此处为了解级别。3.4.8 三元运算符和其它运算符- 128 -本文档使用 看云 构建数组下标访问符,以后也会有一章讲解,此处了解一下就可以了:'新浪' ,'sohu' => '搜狐');?>对象访问符->和instanceof 都是了解级别,以后也有专门的章节进行讲解: username = 'PHP学院';echo $obj -> username;?>上面的所有例子中,除了三元运算符、@符、反引号外。其他的学习级别均为了解,在以后讲解的时候。知道有这个符号即可。3.4.8 三元运算符和其它运算符- 129 -本文档使用 看云 构建04. PHP中的流程控制流程控制就是人类社会的做事和思考和处理问题的方式和方法。通过本章,你将会发现采用计算机的思维去考虑问题,我们在做事的过程当中会更加严谨。我们通过一个一个的场景来去推理流程:有一个高富帅,他姓王。他的名字叫——王思聪(cong)。王思聪同学计划要投资一个项目。如果这个项目计划开始,为了这个投资项目每周往返一次北京和大连。什么时候王思聪同学不再往返呢?项目失败后或者万达(da)集团临时除知除外,他就可以不再这么每周往返了。王思总同学呢,有一个好习惯,就是每次往返的时候,害怕自己到底一年往返了多少次。王同学都会在自己的记事本上记上往返的次数,第一次就写上一,第2次就写上2... ...直至最后项目停止。王思总同学家里头特别有钱,所以他的行程方式和正常人的又有些不同。不仅有更多的方式,而且王同学还迷信。他的出行方式呢有6种,如下:1,司机开车2,民航3,自己家的专机4,火车动车5,骑马6,游轮每次王思总同学,都自己会在骰子上写上1,2,3,4,5,6。摇到哪种方式,王同学就会采用哪种方式进行往返两地。并且呢,王同学是生活极度充满娱乐化和享受生活的人。他抵达北京或者大连的时候不同,他抵达后做的事情都不同,如下:半夜到达,先去夜店参加假面舞会早上抵达,爱在酒店泡个澡中午到达,会吃上一份神户牛肉晚上到达,总爱去找朋友去述说一下心中的寂寞王思总同学在出行和项目中也是极度有计划性。他给自己的生活秘书和工作秘书分别指派了出差的行程:生活上:先查天气,下雨带雨具和毛巾。不下雨要带防晒霜04. PHP中的流程控制- 130 -本文档使用 看云 构建雨具、毛巾和防晒霜的情况要提前检查,如果没有要及时买工作上:要提前沟通去大连前的工作计划,准备好了要及时检查,检查合格,要提前打印现来。及时没有及时准备好的情况下,要列出主要的项目沟通议题。本章中的知识点说明【默写】if...elsewhileforswitch...casebreak,continue,exit【了解】gotodo...while【跳过学习的知识点】declare注:为了提高流程控制的趣味性,上面的故事全属恶搞,我们用流程控制的思想和注释去实现上面的代码,加强对流程控制的理解04. PHP中的流程控制- 131 -本文档使用 看云 构建4.1 if条件结构流程if和else 语句,在之前的3.2.5章节中已经做了说明。我们配合王思聪同学的例子,再次进行说明,方便大家对此章节的理解。本章的知识点为:【默写级】基本语法,不能有半点马乎,完全是语法规范规定的,不这么写就错!王思聪同学决定是投资项目的这个过程就可以这样理解:在之前我们也讲过,因此if的结构可以根据人类思维推理出来两种结构://if单行判断if(布尔值判断)只写一句话;后续代码//if多行判断if(布尔值判断){可以写多句话;}后续代码4.1 if条件结构流程- 132 -本文档使用 看云 构建4.1.1 if语句我们为了加强大家对代码的理解,我们串了一个故事恶搞了一个王思聪同学。在4.1和3.2.5这两个章节中我们都介绍到了if和if...else结构。并且我们讲解的很清楚。我们现在来用if...else结构来写一个小东西,加强大家对逻辑的理解。我们配合之前的知识点来写一个计算器: + - x / % 作业:写一个平年、闰年计算器。写一个form表单,通过get将年份给传来过来,判断传进来的年份是否为数值类型。并且要求,如果是闰年就提示这是闰年,如果是平年就提示这一年是平年。平年闰年规则:年份能被4整除,但是不能被100整除。 或者能被400整除,即为闰年,其他情况全为平年4.1.1 if语句- 134 -本文档使用 看云 构建4.1.2 嵌套if...else...elseif结构还记得本章开篇我们讲了一个王思聪同学的例子:王同学是生活极度充满娱乐化和享受生活的人。他抵达北京或者大连的时候PHP学院,他抵达后做的事情都PHP学院,如下:半夜到达,先去夜店参加假面舞会早上抵达,爱在酒店泡个澡中午到达,会吃上一份神户牛肉晚上到达,总爱去找朋友去述说一下心中的寂寞我们来了解一下他的语法规则【知识点要求:默写】上述结构表示:如果判断语句1的值为真,则执行语句体 1。执行完成后进入后续代码段。否则转入后面的判断语句2(elsif),判断语句2若为真,则执行语句体 2。否则转入后面的判断语句n(elsif),判断语句2若为真,则执行语句体 n。如果均不匹配则执行else语句。这种循环嵌套可以不含else语句,即只含有if、elseif语句。注:elseif()也可以写成else if()我们把上面的代码用流程图的形式表示清楚就如下图了:4.1.2 嵌套if...else...elseif结构- 135 -本文档使用 看云 构建我们可以把王思聪同学的例子通过PHP代码表示出来,代码表示结果如下: 6 && $dida 10 && $dida =19 && $dida 22 && $dida = 1 && $dida 作业:写一个网页cj.html,向panduan.php页面以post方式提交分数段。分数段不同,显示的结果也不同,要求如下:1. 0----60以下,不及格2. 60---70及格了,要努力3. 70---80 还不错4. 80---90 上清华有希望5. 90---100 你这辈子没希望了6. 100 更没希望了7. 100分以上 爱因斯坦转世啊,思密达!8. 不是一个数值类型或者小于0 请输入正确的分数,不然就放李文凯啦4.1.2 嵌套if...else...elseif结构- 137 -本文档使用 看云 构建4.1.3 if语句多种嵌套王思聪同学我们在最开始的故事中讲到了他有两个秘书:一个生活秘书、一个工作秘书。王思聪同学在出行和项目中也是极度有计划性。他给自己的生活秘书和工作秘书分别指派了出差的行程:生活上:先查天气,下雨带雨具和毛巾。不下雨要带防晒霜雨具、毛巾和防晒霜的情况要提前检查,如果没有要及时买工作上:要提前沟通去大连前的工作计划,准备好了要及时检查,检查合格,要提前打印现来。及时没有及时准备好的情况下,要列出主要的项目沟通议题。类似于上面的这种情况判断,我们就需要用到if...elseif...else反复嵌套的结构了。在if语句中可以嵌套一个或多个if语句,以实现对多个参数的判断,这就是if语句的多种嵌套。其结构形式如下:我们用流程图来表示如下:4.1.3 if语句多种嵌套- 138 -本文档使用 看云 构建注意:1. 我们在代码段1,2,3,4中可以再加入判断。根据实际情况还可以再加入嵌套2. 注意缩进,缩进的作用只是使代码富有层次感,美观易读,对目标代码的生成毫无影响。我们把王思聪同学的生活要求,我们可以用代码用嵌套结构表示出来。我们使用到了三层嵌套结构,代码如下: 20 或者 $foo == 30)switch里面在变量最好是 整型,字符串,因为布尔判断更适合if...else..我们用流程图来表示的话结果就如下图所示:上节课中我们用到了rand函数,那我们现在来用rand实现王思总同学的问题选择:4.2 分支结构switch语句的使用- 142 -本文档使用 看云 构建上面的代码我们只需要简单修改,就可以实现我们在微信上面玩的一个小游戏简单的家务骰子和剪刀石头布。你想想?你再做做实验:我们可以把 case 1 代码段中的break去掉,你再试试,什么效果?我们再来写一个简单的星期判断,写法也可以变的怪一些哟:我们可以为while循环补一段专门的代码逻辑图:4.3 循环语句的使用- 145 -本文档使用 看云 构建4.3 循环语句的使用- 146 -本文档使用 看云 构建4.3.1 while循环在循环的开章,我们讲到了循环的逻辑和语法,通过以上的训练。你能轻易的掌握循环的知识点。while是一个布尔型循环,while(布尔判断)的值为true就执行大括号括起来的代码。如果为假就停出去,执行后续代码。现在,我们增加一点难度,来做隔行变色。隔行变色,是我们在网页中经常使用到的表现。要求重点掌握。我们来看看效果:那我们现在要写一个0-99的隔行变色的表格该怎么写呢?【要求默写】1. 定义初始值,输出表格标签 和 表格中的列标签以上代码需要多练习,不断的实验才能想象出来。上面的部份,需要默写来锻炼逻辑。可不可以循环里面再嵌套一次循环(双层循环),来实现隔行变色的表格效果呢?【要求默写】基本实现逻辑如下1. 先输出表格标签2. 通过第一层循环再输出行标签3. 在第一层循环里面再插入一层循环输出标签4.3.1 while循环- 148 -本文档使用 看云 构建上面的代码,你自己加上隔行变色的判断和正常的0-99的数值显示哟?* * * * *你可以学完循环后,再学习一些基本的算法。以后PHP学院的视频中我们会多多的进行讲解。这样帮助你面试的成功率更高。注:不要写死循环(没有退出条件的循环)whie(1){echo 1111.'';}4.3.1 while循环- 149 -本文档使用 看云 构建4.3.1 while循环- 150 -本文档使用 看云 构建4.3.2 do...while循环的区别do...while与while的语法结构基本一样,也是一个布尔型循环,功能也基本一样。基本语法规定如下:do {//代码块} while (判断);do...while与while的区别是,它们的值的检查时机不同。do-while 不论while判断是否成立,先执行一次代码代码块循环语句,保证会执行一次(表达式的真值在每次循环结束后检查)。然而我们之前的while循环会检查布尔判断区域,成立则执行。不成立则不执行。我们用代码去验证一下: 0);?>上面代码中,$i 肯定不大于0,也执行了。当然,你还不能理解,实在想不到应用场景也没关系,可以完全跳过此块。do...while用的情况比较少。我们有可能用在资源处理如:文件打开等地方。作业:用do...while单层和双层写一个隔行变色0-99的表格4.3.2 do...while循环的区别- 151 -本文档使用 看云 构建4.3.3 for循环控制语句王思聪同学反复往返与北京和大连,并且在本上记录往返次数。在PHP中还有另外一种实现方式能够实现同样的计数。for 循环是 PHP 中的一种计数型循环,它的语法比较数活多变。这是一个必须要掌握的知识点。for (表达示1; 表达示2; 表达示3){需要执行的代码段}表达式1 是初始化赋值,可以同时赋值多个代码。表达示2 在每次循环开始前求值。如果值为 TRUE,则继续循环,执行嵌套的循环语句。如果值为FALSE,则终止循环。表达示3 在每次循环之后被求值。我们来写个简单的例子,看看:换种写法,我们现判断多个条件试试:for($i=0,$j=10;$i<$j;$i++,$j--){echo $i.'---------'.$j.'';}我们用for循环来打一下9*9的乘法口诀表吧,演示效果如下:在分析思考过程中切记:在代码中是横着输出的4.3.3 for循环控制语句- 152 -本文档使用 看云 构建//99乘法口诀表从1开始,所以声明一个变量$i = 1,让$i小于10,也就是最大值为9for($i = 1 ; $i < 10 ; $i++ ){//1x1=1,2x2等于4,所以第二次循环的最大值为$i的值,因此$j=1, $j在循环自加的过程当中,只能够小于等于$ifor($j=1;$j<=$i;$j++){// 1 x 2 = 2 2 x 2 = 4啦echo $j . 'x' . $i . '=' .($i*$j) . '';}echo '';}我们来试一下break,exit和continue来控制一下9*9乘法口诀表。语句 作用exit exit之前我们讲过了,从当前处停止后续执行break 之前遇到过,跳出循环或者跳出结构体执行后续代码continue 跳出此次循环,下次循环继续我们来演示一下break和continue:$i 等于4,break效果如下:注:上图中第4之后不再执行$i 等于4,continue效果如下:4.3.3 for循环控制语句- 153 -本文档使用 看云 构建注:上图中第4第丢失了,接着从第5年继续执行了作业:用for 的单层循环来控制隔行变色的表格用for的双层循环来控制隔行变色的表格默写99乘法口诀表,并在中间$i、$j的位置实验continue和break;4.3.3 for循环控制语句- 154 -本文档使用 看云 构建4.3.4 goto语法自 PHP 5.3.0 起,还可以使用 goto 来跳出循环。在本章开始的章节,我们讲解到一个故事,王同学每周往返,但有一个特例:项目失败后或者万达(da)集团临时出事除外,他就可以不再这么每周往返了。基本语法通过上例,我们发现直接显示输出了:小鸡炖蘑菇。我们来实现一下霸道王总裁的代码:这个知识点为了解级别,大家不想学习,可以不用学习此块。注:goto 操作符可以用来跳转到程序中的另一位置。该目标位置可以用目标名称加上冒号来标记,而跳转指令是 goto 之后接上目标位置的标记。PHP 中的 goto 有一定限制,目标位置只能位于同一个文件和作用域,也就是说无法跳出一个函数或类方法,也无法跳入到另一个函数。也无法跳入到任何循环或者 switch 结构中。可以跳出循环或者 switch,通常的用法是用 goto 代替多层的 break。4.3.4 goto语法- 155 -本文档使用 看云 构建4.3.4 goto语法- 156 -本文档使用 看云 构建4.3.5 declare 语法在基础阶段,大家应该跳过此处学习。涉及到了函数相关的知识,若你有一定的基础,可以继续下面的学习。4.3.5 declare 语法- 157 -本文档使用 看云 构建05.PHP的函数基本语法函数,在之前的课程当中我们做过介绍。函数的英文叫作:function,而function的解释项中有另外一个含义:功能。函数 就是 功能。调用一个函数就是在调用一个功能。我们之前也了解过一些函数了,例如:is_int、phpinfo()等等。我们都介绍过,他们都具有不同的功能。我们不再这里复述。PHP学院的凯哥(李文凯)经常说过一句话:函数是条狗,哪里需要哪里吼。通过上句话,我们能得到几个不同的规律:1. 需要用一个函数的时候,就吼一声它的名字2. 函数可以反复去吼,吼了它的名字它就过来了。也就是函数可以反复调用我们明白后,那我们接下来来讲解函数的分类,我们将函数分为两大类别:1. 自定义函数2. 系统函数05.PHP的函数基本语法- 158 -本文档使用 看云 构建5.1 自定义函数PHP提供了功能强大的函数,但这远远满足不了需要,程序员可以根据需要自己创建函数。本节就开始学习创建函数的方法。我们在实际开发过程当中需要有很多功能都需要反复使用到,而这些反复需要使用到的功能,我们能定义成功能(函数),就尽可能定义成功能(函数)。使用的时候,吼一下它的名字即可。那我们来学一下自定义函数的语法规定,语法规定如下:function 函数名([参数名1[=值1], 参数名2[=值2], 参数名n[=值n]]){函数中的功能体[return 返回值]}上面的语法规定中发现了如下特点,产生如下语法规定:1. 函数以function开始2. function后面接空格,空格后接函数名3. 函数名与变量命名规则基本一样,但是不同的是:函数名不区分大小写4. 所谓参数其实就是变量5. 函数名后接括号,括号内跟参数,参数全都有[](中括号)括起来了,代表参数可填可不填6. 如果有参数的话,参数后可以接(=)等号,等号接默认值。参数值也是用[](中括号)括起来的,代表选填7. 函数后的参数变量,主要功能是把函数体外的变量值,传入函数体内来使用,函数体的变量和函数体外的变量通常是两个不同的变量。8. 函数中的具体功能(功能体)用大括号括起来,代表这是一个函数的功能区间9. 函数可以有返回值也可以没有返回值,用[](中括号)括起来的,代表选填。10. return后接空格,空格后接返回值,若有return,return后的代码均不执行。11. 函数的执行没有顺序关系,可以在定义处之前的位置调用12. 函数不能被定义两次,即函数不能被重载切记:你也要多写代码来进行实验!我们可以通过实验来一点一点证明这些观点。1. 函数是条狗,哪里调用哪里走liwenkai这个函数,是不是显示出来了三段:我是一条狗?2. 函数名与变量命名规则一样,但是不同的是:函数名不区分大小写以上代码会报错。函数命名与变量命名相同。3. 函数名与变量命名规则一样,但是不同的是:函数名不区分大小写通过上面的代码会发现,会显示出来三行:如果是写代码的男我人我们需要更加承担来自家庭的责任。也就是函数名在调用的时候不区分大小写。函数可以反复叫它的名字,可以反复执行。也体现了重用的特点。4. 函数体的参数若是定义了,未传参数,代码会报错5.1 自定义函数- 160 -本文档使用 看云 构建你也自己写一段出来试试,会不会报错?5. 函数后的参数如果有默认值,参数可以不填,代码也不会报错是不是没有报错呀?并且显示了 10和88出来了。说明,参数如果传了,参数会带入函数中。如果函数没有传参数,会用参数后的默认值。6. 函数后的参数可以写多个自己写写上面的代码,我们是不是传入了多个参数?7. 函数后如果有默认值和无默认值的参数,通常把无默认值的参数写在最前面之前的第3和第4条实验我们发现:默认值是代表这个参数可以不用传值进去。而没有默认值的话,代码会报错,也就是无默认值的参数是必传的。我们来看看下面的例子:通过上例发现执行上面的代码又报错了。也就是上面的语法是不行的。上面的语法我们希望的是,参数$a和参数$b我们不传入任何值。参数$c是必须要传进去的,我们传了8。5.1 自定义函数- 161 -本文档使用 看云 构建可是PHP的语法规定中不准许我们这么写。因此,我们换一种写法,也能达到一样的效果:通过上例实验大家是不是发现,参数$c我传了,代码还没有报错。而参数$a = 20 ,参数 $b = 30 一样带入了代码 $a + $b + $c 了。8. 函数体的变量与函数体外的变量没有关系通过上例发现:形参、与实参没有半点关系。而函数体内的传进去的形参,再怎么变化,都不会影响实参$hello的实际结果。9. 函数体中若有return,return 后的代码不执行发现没?——只输出了111。10. 函数执行完后,return 可把函数体内的值,带带函数体外11. 函数的执行没有顺序关系,可以在定义处之前的位置调用通过上例发现,函数在定义之前还是在定义之后都可以调用。也就是函数可以任意位置调用。11. 函数不能重载你会发现,在上面foo() 函数内部又定义了一个bar函数,这就是内函数数。仔细观察和实验后你会得出如下的结论:1. foo()调用两次会报错2. 如果不调foo()函数无法执行bar函数,因为bar是在foo的内部5.2.4 内部函数- 172 -本文档使用 看云 构建5.2.5 变量作用域我们通过5.1章节的函数定义部份的学习我们知道了几个不同的规矩:1. 函数定义时后括号里面接的变量是形式上的参数(形参),与函数体外的变量没有任何关系。仅仅是在函数内部执行2. 函数内声明的变量也与函数外的变量没关系。但是,我们实际的处理情况中会遇到这样的一个情况:1. 我想在函数体内定义的变量在函数体外用2. 我想把函数体外的变量拿到函数体内来使用这个时候我们就需要用到超全局变量。我们来回顾一下之前的知识点:| 全局变量名 | 功能说明 || -- | -- || $_COOKIE | 得到会话控制中cookie传值 || $_SESSION | 得到会话控制中session的值 || $_FILES | 得到文件上传的结果 || $_GET | 得到get传值的结果 || $_POST | 得到post传值的结果 || $_REQUEST | 即能得到get的传值结果,也能得到Post传值的结果 |我们来通过实验来观察 一下外部变量(超全局变量)的特点,打破本章开头我们总结的规律:我们定义一下global.html页现来写HTML内容:超全局数组实验我们将html的内容通过form表单提交给了glob.php页面,我们现在来写glob.php:5.2.5 变量作用域- 173 -本文档使用 看云 构建通过这个小例子,你会发现超全局的$_POST等这一系列的超全局变量(外部变量)在函数内部也是可以用的。没有本文开始处变量作用域的限制。其实我们所有声明的变量都放到了$GLOBALS这个数组下面,举个例子:通过上例,你会发现$变量名是等价于$GLOBALS['变量名'] 。所有的变量都放到了$GLOBALS里面了。而$GLOBALS也是全局的。因此,我们能够来达到我们的目的:将函数体内的变量(局部变量)在函数外部使用。也可以让函数外的变量到函数里面来使用。1.通过$GLOBLAS来读取外部变量上例中:我们将函数体外的变量通过$GLOBALS拿到了函数体使用。所以,打破了函数外的变量不能在函数体内使用的限定。2.通过$GLOBLAS,在函数内修改外部变量通过上例:我们发现通过$GLOBALS['hongniu'],把$hongniu的值改变掉,所以在最后输出$hongniu的时候,值发生了变化。3.通过$GLOBLAS,在函数内创建全局变量上例中,我们发现$que是不存在的,可以调用函数hello()后,在函数外部可以执行echo $que了,能够看到结果:提神喝茶更好。我们明白了,函数内声明的变量,通过$GLOBALS声明一个变量,也能够显示出来。下面的知识是【了解】级别,我们越来越少的使用这种方式来声明全局变量了。在函数内使用global关键5.2.5 变量作用域- 175 -本文档使用 看云 构建词后面跟一个或多个变量,就把变量变为了全局变量,格式如下:global $变量1[,变量2,....变量n]在global后面可以跟一个或者多个变量,变量用逗号分开。$a = 10;$b = 100;function test(){global $a , $b;echo $a + $b;}//结果是不是显示出来了?test();上例中,你还可以试试在global关键词后面跟着未创建的变量,在函数体内定义变量值,修改变量的值试试。其实与$GLOBALS一样,只是用法不同而已。注意:不可在global 后写 $变量 = 值。global读音:[ˈgləʊbl]解释:全局的,全球的5.2.5 变量作用域- 176 -本文档使用 看云 构建5.2.6 参数的引用在变量这个函数中,我们学习了变量的引用,我们来回顾一下知识:上诉知识点的在变量章节中,变量引用有讲述,是指变量$a和$b指向到了同一个存储位置,来存值。而函数的参数引用,也是这个意思,将形参和实参指向到同一个位置。如果形参在函数体内发生变化,那么实参的值也发生变化。我们来通过实验来看看:通过上例,我们发现实参为$foo,在调用demo的时候,让$foo和$n指向到了同一个存储区域,当$n的值发生变化的时候。那么$foo的值也发生变化。5.2.6 参数的引用- 177 -本文档使用 看云 构建5.2.7 递归函数递归函数,递归只是一个名字,而递归函数的规定:函数体内调用函数自己。这需要一定的思维理解深度,本章学习过程当中,如果你实在是有思维无法跟上的地方,可以跳过本章不用学习。因为,实际工作中,用递归有用到,但是使用量不会很大。递归在实际工作中主要是用在:文件和文件夹操作的时候有使用到。解决办法:万一你的思维跟不上本章,你可以直接了解本块的原理后,用现成的文件和文件夹处理函数或文件处理类就可以。我说几个思维上的盲区:1. 代码是从上到下执行的,所有代码没有exit等停止符,函数必须执行完。2. 如果函数从函数A跳至函数B后,必须把函数B执行完成再执行函数A余下的代码。3. 递归函数必须要能执行完有结束条件,不然函数就会限入死循环。函数会永远的自我执行下去。我们来写一代码码来理解一下:通过上例大家会发现:1. 执行函数A到一半的时候,跑去执行了函数B2. 执行完函数B,先显示出来的是:“俺是狗蛋,执行完了”,接着显示的才是:“我们需要不断的努力,努力到上天都为我们感动”3. 也就是证明了我们所说思维盲区里面的内容,代码从上到下执行,代码必须执行完。我们来写一个简单的递归代码,让函数自己调用自己。 0){//在函数体内调用了dg自己哟dg($n);}else{echo '--------------';}echo '俺是狗蛋,俺还没执行' . $n . '';}dg($n);?>你猜猜显示结果是什么?为什么这样?我们来仔细推理一次:1. 第一次调用dg(),将数字$n = 2传到dg中,先显示出来了22. 然后将$n - 1 $n的值为了13. 接着判断$n 是否大于0,肯定是大于0的,所以调用递归自己,再把自己执行一次。4. 而第二次在执行自己dg()的时候,而最下面的 echo '俺是狗蛋,俺还没执行' . $n . ''; 还没有执行到。等待执行完成后再来执行5.2.7 递归函数- 179 -本文档使用 看云 构建5. $n此时等于1 ,所以显示出来1。6. $n把自己减了一次,$n的结果为07. $n大于0肯定不成立的,所以显示了一条:"--------------"8. 而这个时候该执行:echo '俺是狗蛋,俺还没执行' . $n . '';9. 第二次执行dg()执行完成。第一次dg()的代码还没执行完,将第4点中的余下代码执行完。上面的,我们就将运行结果推导完了,我们接下来,看看效果:5.2.7 递归函数- 180 -本文档使用 看云 构建5.2.8 静态变量如果我想知道函数被调用了多少次怎么办?在没有学习静态变量的时候,我们没有好的办法来解决。静态变量的特点是:声明一个静态变量,第二次调用函数的时候,静态变量不会再初始化变量,会在原值的基础上读取执行。有了这个特点,我们就可以实现,最开始我们的提问:函数调用词数的统计。先执行10次demo()函数试试,再执行10次test()函数试试:demo();demo();demo();demo();demo();demo();demo();demo();demo();demo();/*for($i = 0 ;$i < 10 ; $i++){test();}*/上例中你会发现:test();执行一次数值就会加1,而demo输出的显示结果,始终为0。通过上例你就会发现,本章开始处说明的静态变量的特点。5.2.8 静态变量- 181 -本文档使用 看云 构建5.2.8 静态变量- 182 -本文档使用 看云 构建5.3 使用系统内置函数PHP学院的李文凯,总结了这么两句话:1. 如果代码能赚钱,帮你赚钱最多的是基本语法2. 如果你还在当程序员,你看手册的时候可能比你看老婆的时间还长现在我们就来学习如何使用系统内置函数。子曰:授人以鱼不如授人以渔(送你一条鱼,不如教你捕鱼的办法)。下面我们就来学习捕鱼的办法,在使用系统内置函数前,你必须学会以下几个东西:1. 下载一个最新的手册2. 经常更新手册3. 将PHP手册放在你最容易找到的地方。需要的时候随时可以查手册4. 学会手册中函数的用法你可以访问,下载后放到桌面上,随时需要随时打开查即可:http://down.phpxy.com/book/php_enhanced_zh.chm (每周更新一次)使用函数的重点是三块:1. 了解函数的功能,特别是常用函数的功能2. 了解函数的参数3. 了解函数的返回值我们针对上面的三块,讲解6个函数,这6个函数,概况了函数的基本用法的全部注意事项:1. 直接返回布尔型,如bool copy ()2. 带有MIXED参数的函数如何调用。Mixed表示任何类型的数据。如Array_unshift()3. 参数中带有&符的参数,一定要传一个变量做为参数。函数里面改变了他的值。4. 带有[]的参数,表示可选项。5. 带有…的参数,表示可以传任意多个参数。6. 带有callback的参数,表示回调函数。需要传一个函数进来。Array_map()7. 函数支持的版本你要了解实验1,拿copy()这个函数来举例:返回bool值的,通常为操作是否成功、验证是否通过、检查是否正确等。5.3 使用系统内置函数- 183 -本文档使用 看云 构建我们拿copy这个函数来看:bool copy ( string $source , string $dest [, resource $context ] )这个函数的功能为:拷备一个文件返回值为为:bool型值,就是成功返回true,失败返回false参数为:两个字符串的值,一个是copy的源文件,一个为目标文件。第三个参数可选的,不常用,我们不管它。所以,我们就可以推理出下面的实验了: "huangxiaoming", "c" => "ninzetao");function test_print($item2, $key){echo $key ." ---". strtoupper($item2) . "\n";}echo '';var_dump($shuaige);echo '';array_walk($shuaige, 'test_print');echo '用自定义函数test_print执行后的效果:';5.3 使用系统内置函数- 185 -本文档使用 看云 构建echo '';var_dump($shuaige);echo '';?>通过上例,我们发现数组中的每个参数和值都被修改了。上例大家只需要理解看见传callback的,需要传入函数协助处理就可以。不用理解。我们在下一章的数组部份,学习完数组,大家可以再看看。函数支持的版本号很重要我们来看手册中一个函数的截图:这是一个系统函数,而不是自定义的函数。系统函数手册中存在这个函数,可是为什么无法调用执行这个函数呢?请注意,(PHP 5 >= 5.5.0),你可以phpinfo()看一下你当前的版本。有的时候可能是因为你的版本太低,或者你所在的版本中没有这个函数,会提示函数不存在。有事没事查手册,手册比老婆还要亲。5.3 使用系统内置函数- 186 -本文档使用 看云 构建5.4 文件包含函数在实际开发中,常常需要把程序中的公用代码放到一个文件中,使用这些代码的文件只需要包含这个文件即可。这种方法有助于提高代码的重用性,给代码的编写与维护带来很大的便利。在PHP中, 有require、require_once、include、include- once四种方法包含一个文件。我们来对比他们的不同:函数 包含失败 特点Inlcude返回一条警告文件继续向下执行。通常用于动态包含Require一个致命的错代码就不会继续向下执行。通常包含极为重要的文件,整个代码甭想执行Include_once返回一条警告除了原有include的功能以外,它还会做once检测,如果文件曾经已经被被包含过,不再包含Require_once一个致命的错除了原的功能一外,会做一次once检测,防止文件反复被包含注意:1,少用_once带once,因为它会消耗更多的资源去做检测的工作。2,特高级Include文件只需要编译一次,因为每次包含include都会再执行一次对应的代码,如何减少include再次执行时,需要重新解析的过程。我们来做一几个实验:1,include包含函数的功能。创建一个functions.php文件,里面写上两个函数:在functions.php的同级目录下,我再创建一个user.php文件把functions.php文件包含进来。这样我的函5.4 文件包含函数- 187 -本文档使用 看云 构建数就可以专门放在functions.php里面,哪儿需要用到这些函数的时候,我就从哪儿包含进来:我通过过上例我们知道了include的功能。接下来我们对比include和require:代码中,我们先用include 来包含不存在的test.php文件,再用require包含 不存在的test.php文件:通过上例的对比我们发现:5.4 文件包含函数- 188 -本文档使用 看云 构建1. 如果test.php文件不存在include 会发出警告继续执行demo()和test()函数。2. 而requre则直接报错,demo()和test()函数无法继续执行。我们通过表格知道了:inlcude 和include_once的区别在于,检测是否重复包含。如果重复包含了include_once不会再包含 对应的文件了,而include 则不管这些。有没引入过文件,都再引入一次。同样刚刚的user.php我们再实验一下,我们将functions.php包含两次,分别使用include和include_once:改为include_once再试一次:大家分别执行后会发现——include 这次引入functions.php两次的时候报了如下错误:5.4 文件包含函数- 189 -本文档使用 看云 构建上图中的提示是说,不能重新定义函数demo()。我们在函数定义章节讲过,函数不能定义两次,否则会报错。因为我们将 functions.php包含了两次所以执行了两次,因此报这个错误。而include_once不报错的原因是因为:他检测了functions.php曾经包含过,不再进行包含引入了。而require和require_once的功能,大家用你最最聪明的小脑袋是不是就能推理出来了呢?require_once有两个特点:1. 包含 的文件必须存在,否则停止执行2. 会做重复包含检查哟5.4 文件包含函数- 190 -本文档使用 看云 构建5.4 文件包含函数- 191 -本文档使用 看云 构建5.5 数学常用函数在PHP程序中常常需要进行数据处理运算,这就需要使用数学函数。数学函数是最简单、最常用的系统函数。本章以数学函数为例讲解系统函数的调用方法。我们现在来说我们最常用的数学函数。在讲解数学函数之前,我们来说一项。就是——PHP数数函数特别多,如下链接截图:http://phpbook.phpxy.com/ref.math.html5.5 数学常用函数- 192 -本文档使用 看云 构建这些不用大家全部掌握,你看一遍知道PHP的数学函数里面为大家准备了这么多就可。以后需要的时候,直接来用。大家只需要记最常用的一些即可,我将最常用的列表列给大家:函数名 描述 实例 输入 输出abs()求绝对值$abs = abs(-4.2); //4.2 数字 绝对值数字5.5 数学常用函数- 193 -本文档使用 看云 构建ceil()进一法取整echo ceil(9.999); // 10 浮点数 进一取整floor()舍去法取整echo floor(9.999); // 9 浮点数 直接舍去小数部分fmod()浮点数取余"$x = 5.7;$y = 1.3;$r = fmod($x, $y);//$r equals 0.5, because 4 * 1.3 + 0.5 =5.7 "两个浮点数,x>y浮点余数pow()返回数的n次方echo pow(-1, 20); // 1基础数n次方乘方值round()浮点数四舍五入echo round(1.95583, 2);// 1.96一个数值保留小数点后多少位,默认为0 舍入后的结果sqrt()求平方根echo sqrt(9); //3被开方的数平方根max()求最大值"echo max(1, 3, 5, 6, 7); // 7 echomax(array(2, 4, 5)); // 5"多个数字或数组返回其中的最大值min()求最小值min多个数字或数组返回其中的最小值mt_rand()更好的随机数echo mt_rand(0,9);//n最小/最大,随机数随机返回范围内的值rand()随机数echo rand()最小/最大,随机数随机返回范围内的值pi()获取圆周率值echo pi(); // 3.1415926535898 无 获取圆周率5.5 数学常用函数- 194 -本文档使用 看云 构建5.6 日期常用函数曾经有位大哥说过:只要是有人的地方就有江湖。我说:要记录数据的地方就有时间。我们注册的时间、发消息的时间、访问的时间、登陆的时间、抽奖的时间、中奖的时间、搜索关键词的时间... ...太多太多的时间都在被记录了。而这些东西都需要让PHP协助我们记录到数据库里面。那好,各位美男子和美女子们。我们开始来学习日期函数吧。注:我们为什么不直接用数据库里面的时间,因为在实际开发过程中,我们需要把时间取出来再排序和显示,所以单纯的用数据库里面的时间达不到我们的业务需求。5.6 日期常用函数- 195 -本文档使用 看云 构建5.6.1 获取时期时间信息函数在正式学习日期函数前大家要了解几个概念:1. 时区2. 世界时3. unix时间戳时区这个概念,之前大家听说过很多。我们来啰嗦两句,我们现实生活中使用的实区,在电脑里面也是一样有规定的。1884年在华盛顿召开国际经度会议时,为了克服时间上的混乱,规定将全球划分为24个时区。在中国采用首都北京所在地东八区的时间为全国统一使用时间。世界时不光是天文学家使用格林尼治时间(英文简写:GMT),就是在新闻报刊上也经常出现这个名词。我们知道各地都有各地的地方时间。如果对国际上某一重大事情,用地方时间来记录,就会感到复杂不便.而且将来日子一长容易搞错。因此,天文学家就提出一个大家都能接受且又方便的记录方法,那就是以格林尼治(英国某地区)的地方时间为标准。unix时间戳电脑本身不认识时间,我们在电脑里面设置一个时间方便运算。于是我们规定了一种计算方式,unix时间戳。从Unix纪元(1970 年 1月1日零时)开始到一个时间经过的秒数。我们学了几个概念,那我们现在可以开始来学习时间函数了。1. 设置时区如果,我们是跨国的多语方程序,我们通常是通过在配置文件里面来写好了个时区,每次程序运行的时候。都会读取这个时区的设置,来显示时间。设置时区的函数为:1). date_default_timezone_get()2).date_default_timezone_set()第一个函数我们就不重点讲解了,比较简单。用法如下:string date_default_timezone_get ( void )5.6.1 获取时期时间信息函数- 196 -本文档使用 看云 构建功能如下:取得一个脚本中所有日期时间函数所使用的默认时区示例:这样就显示出来了当前设定的时间。第二个函数是重点:用法如下:bool date_default_timezone_set ( string $timezone_identifier )功能如下:用于所有日期时间函数的默认时区示例:上例的代码对比试试,再将将date_default_timezone_set注释掉,再看看会提示什么。注:时区列表请详见官方手册 http://php.net/manual/zh/timezones.php2.time()获取当前的unix时间戳time()函数的功能是获取当前时间的 Unix 时间戳。以下代码输出当前时间的Unix 时间戳。程序运行结果:14215978583. “亚麻跌”是PHP学习时间处理的关键Y 英文是 year,为年份代表年 ——亚m 英文代表month,为月份代表——麻d 英文代表day,为日期 代表——跌所以我们需要输出前前的年份,月份,日期的话。例如:1997年7月1日,我们就可以用到上面的三个参数。你可以运行一下代码试试,看看是不是显示出来了。后面还有几个参数:H:m:s 代表的是:时分秒h 的英文为:hour 代表小时i的英文为:minute 代表分钟s的英文为:second 代表秒写全了就是:date函数用于将一个时间进行格式化输出,以方便时间的显示或存储。其语法格式如下:string date ( string $forrnat [, int $tirnestamp] )在参数列表中:5.6.1 获取时期时间信息函数- 198 -本文档使用 看云 构建1. $timestamp是一个时间戳,函数将这个时间戳按$format规定的格式输出。2. 如果$timestamp没有输入值,则默认为当前的时间。3. $format是一个时间输出格式的字符串,需要使用规定的字符构造输出格式。date函数的格式参数表:字符 说明 返回值d 月份中的第几天,有前导零的2 位数字 01 到31D 英文星期几,3个字母 Mon到Sunj 月份中的第几天,没有前导零 1 到31l(字母) 英文星期几 Sunday到 SaturdayN 1格式数字表示的星期 1(表示星期一)到7(表示星期天)S 每月天数后面的英文后缀,2个字符 st,nd,rd或者th。可以和jg一起用w 星期中的第几天,数字表示 0(表示星期天)到 6(表示星期六)z 一年中的第几天 0到366W 年份中的第几周,每周从星期一开始 42(当年的第42周)F 月份,完整的文本格式 January 到 Decemberm 数字表示月份,有前导零 01 到 12M 3个字母缩写表示的月份 Jan 到Decn 数字表示月份,没有前导零 1 到 12t 给定月份所应有的天数 28 到 31L 是否为闰年 如果是闰年为1,否则为oo 格式年份数字 例如2007Y 4 位数字完整表示年份 例如1999或2008y 2 位数字表示的年份 例如99或08a 小写的上午和下午值 am或pmA 大写的上午和下午值 AM或PMg 小时,12小时格式,没有前导零 1到12G 小时,24小时格式,没有前导零 0 到 23i 有前导零的分钟数 00 到 59s 秒数,有前导零 00到59e 时区标识U 从Unix纪元开始至今的秒数 长整型数字3. getdate获取当前系统时间getdate用来获取当前系统的时间,或者获得一个时间戳的具体含义。时间戳是一个长整数,表示getdate5.6.1 获取时期时间信息函数- 199 -本文档使用 看云 构建的语法格式如下所示。array getdate ([ int $timestamp = time() ] )函数的返回值是一个根据timestamp得到的包含有时间信息的数组。如果没有参数,则会返回当前的时间。getdate返回的数组,键名包括时间和日期的完整信息。| | |键名 说明 返回值secnods 秒 数字0到 59minutes 分钟 数字0到59hours 小时 数字 0到 23mday 月份中第几天 数字 1到 31wday 星期中第几天 数字0(表示星期天)到6(表示星期六)mon 月份 数字 1 到 12year 年 4 位数字表示的完整年份yday 一年中第几天 数字0到365weekday 星期几的英文 Sunday到 Saturdaymonth 月份的英文 January 到 December0 自从Unix纪元开始的秒数 长整型数字以下代码可以返回getdate 数组的详细信息。print_r可以输出一个数组中所有的键名与值。运行这段代码,结果如下所示。程序输出当前计算机的时间与日期详细信息:Array([seconds] => 1 //秒[minutes] => 10 //分钟[hours] => 17 //小时[mday] => 18 //日[wday] => 0 //星期中的第几天[mon] => 1 //月[year] => 2015 //年[yday] => 17 //年中的第几天5.6.1 获取时期时间信息函数- 200 -本文档使用 看云 构建[weekday] => Sunday //星期[month] => January //月份[0] => 1421597401 //时间戳)理解了getdate函数和返回的数组以后,就很容易取得当前的时间信息了。下面的代码就是用getdate函数取得时间信息,调用返回时间数组的值输出时间信息。运行这个程序,会显示当前时间的详细信息。程序的运行结果如下所示。年 :2015月 :1日 :18时 :17分 :14秒 :11一星期中的第几天 :14一年中的第几天 :11星期名称 :Sunday月份名称 :January时间戳 :14215976515.6.1 获取时期时间信息函数- 201 -本文档使用 看云 构建5.6.2 日期验证函数checkdate可以判断一个输出的日期是否有效。在实际的工作中,我们需要经常用于检测常用于用户提交表单的数据验证。例如:验证用户输入的时间是否正确。函数的语法格式如下:bool checkdate ( int $month , int $day , int $year )下例中,我们就可以用一个代码来进行实验,写出一段真实的例子。试试2011年有没有2月29日。如果是有效的时间就返回真,如果不是有效的时间就返回假。输出结果:bool(true)bool(false)5.6.2 日期验证函数- 202 -本文档使用 看云 构建5.6.3 获取本地化时间戳函数在实际的工作中我们还需要经常用到指定某个时间生成。例如:需要找到昨天到今天此时此刻的注册用户。那么我们需要做两件事情:1. 得到当前的时间unix时间戳。用time()函数就可以直接搞定2. 那么昨天指定时间该怎么生成呢。这个时候我们就需要使用到mktime()函数。简称:make time.创建时间。生成出来的时间最好是unix时间戳。因为是1970年1月1日0时到现在的时间。我们做一个区间判断,就把昨天到今天注册的用户按照时间筛选出来了。我们的mktime()函数可以对一个日期和时间获得一个本地化时间戳。其语法格式如下所示:int mktime (int $hour [, int $minute [, int $second [, int $month [, int $day [. int$year [, int$.is_dstl.l } ] ] 31 )函数的参数分别表示:时、分、秒、月、日、年、是否为夏令时。在使用这个函数时,需要注意所列的参数要与函数的参数含义相同。例如,下面的代码实现了用mktime构造一个时间戳的功能。运行程序结果如下所示:1219036530mktime函数的返回结果是一个Unix时间戳,对用户的含义不大,常常与date函数一起完成时间的转换。例如,下面的代码实现对时间的运算:5.6.3 获取本地化时间戳函数- 203 -本文档使用 看云 构建我们使用的时候还经常需要使用到另外一个函数:strtotime()。它的语法格式如下:int strtotime ( string $time [, int $now = time() ] )它能将将英文文本的日期时间描述解析为 Unix 时间戳。参数:1. 传入一个字符串的时间2. 可选参数为是否传入unix时间戳,如果不传则是当前的unix时间戳。我们来实验一下,看看手册中提供的一些例子:通过上例发现,把一些时间通通加上了或者减去了英文中所表示的指定时间段。5.6.3 获取本地化时间戳函数- 204 -本文档使用 看云 构建5.6.4 程序执行时间检测我们有的时经常需要做程序的执行时间执行效率判断。实现的思路如下:可是大家不要忘了,程序的运行速度太快了。快到只有0.00000几秒的一刹那。那这个时候大家要记录一个特函的函数了:mixed microtime ([ bool $get_as_float ] )microtime()这个函数,能够返回当前 Unix 时间戳和微秒数。参数:如果你传入true的话,将会返回一个浮点类型的时间,这样方便参与运算。我们来模拟一个检测函数执行时间的例子,测试某个函数效率的快慢:在上例中,我们发现我们存入了:1. 整型2. 浮点3. 布尔4. 字符串注:上例中echo pre这个标签的主要目的是为原样输出,格式展示的更好看,更清晰。我们用var_dump()打印出来显示看一下效果:我们仔细观察一下上面的这张图,你会发现以下几个特点:1. array(size = 4) 说明里面有4个元素6.1 数组的定义- 216 -本文档使用 看云 构建2. 0 => int 1 我们知道int是整型的意思,1是一个整型的数值。那前面的0,1,2,3和=>代表什么意思呢?3. 最新前的0,1,2,3代表的是值的读取标识号,我们称之为下标或者键(英文:key)4. => 是一个符号标准叫法叫作:键值对应符。因此,以后再看到 0=> int 1 可以这样来说。 下标访问符0对应整型的1。5. 我们还称数组里面的键值对为元素,元素就是键值对的组合。哦耶! 数组好像还挺好学的,全是一些规律哟。我们通过上例,其实你一不小心的就完成了数组其中的一种声明方式:索引数组的声明哟。所谓索引数组:就是下标全为整型的数组。索引数组的下标必须要从0开始吗?答:这个问题其实不然,索引数组并不一定要从0开始。那如何能够不从0开始呢?答:需要用到大家在上面学的一小块知识哟。就是键值对应符。我们来动手写写。 'NoAlike', 'PHP学院' , '去PHP学院去PHP', 19 => '凤姐和芙蓉我都爱' , '杨幂臭脚我最爱');//打印显示$keleecho '';var_dump($kele);echo '';?>上例中,我们一不小心就写了一个索引数组。不过索引数组的下标不是从0 开始的,而是从10开始的。不过上面的例子中,我们觉得写的不优美,我们可以将代码写的更加优美一些,格式更加清晰一些。 'NoAlike','PHP学院' ,'去PHP学院去PHP',19 => '凤姐和芙蓉我都爱' ,'杨幂臭脚我最爱');//打印显示$keleecho '';var_dump($kele);6.1 数组的定义- 217 -本文档使用 看云 构建echo '';?>这样是不是看得更清楚,一行对应一个数组的值。我们执行一下代码,看一下效果:通过上面的效果,我们来总结规律:1. 索引数组若不强制声明他的下标,他的下标是从0开始的。(我们的第一个数组的值:只有不断努力才能博得未来。这个值的下标为0)。2. 如果我指定过下标他的下标就为我指定的值。如下标为10和下标为19的,都是我指定过的值。3. 若某个值(如NoAlike),强制指定了下标(下标为10)。在它后面加上的值(PHP学院),不指定下标的话。他们的下标增长规律为最大值+1。例如:凤姐和芙蓉我都爱的下标为19.我在后面加上了:杨幂臭脚我最爱。它的下标自动增长为了11。不知不觉,你已经学会了索引数组的创建,神奇吧?真为你感到高兴!向索引数组中增加元素学习完了索引数组的创建,接下来我们学习索引数组的增加、修改和删除。总结:1. 向索引数组中增加元素用: 数组变量名[]、数组变量名[键值]这两种方式来增加元素2. 键值的增长规则与之前的规则一样。都是最大值加1的原则。向索引数组中删除元素我们还拿刚刚的数组来举例:看看效果:6.1 数组的定义- 219 -本文档使用 看云 构建1. 使用unset删除变量的方式来删除数组里面的值。2. 删除了中间的值,并不会让后面的下标向前自动移动。而是原来的值为多少就为多少3. 删除掉其中的某个值,新加入的值不会替换掉原来的位置,依然遵循最大值加1的原则。修改值我们学习最简单的创造、增加和删除。我相信大家一定能够推理出如何修改值了。执行上面的代码,输出看看结果。1.用变量名[键] = 新值。就把数组中的值定的值修改了。索引数组的其他声明方式通过上面的例子,我们学习到了数组的声明。我们来学一下数组的其他声明方式。一、直接用之前未声明的变量,用变量名后面接中括号的方式声明数组。二、每次用array()写的太麻烦了,还可以不用写array哟,更简单。 '刘亦菲','黄圣依','范冰冰'];echo '';var_dump($minren);echo '';?>上面是另外两种PHP学院的写法。当然,你自己喜欢使用哪一种就使用哪一种来声明。关联数组索引数组适当的变一下形就出现了关联数组。只要数组里面有一个为字符串的数组,就为关联数组。通过上例中,我们发现数组的下标只能够为字符串,当然不能够满足我的需求。假设我想声明一个下标为帅对应李文凯这个值。肯定不能满足我的需求。那我们来声明一下关联数组。跟索引数组的声明方式完成一样。不过不同的是,必须要指定字符串的下标和必须要使用键值对应符。 '李文凯','很帅' => '黄晓明','灰常灰常帅' => '宁泽涛',6.1 数组的定义- 221 -本文档使用 看云 构建'有男人味的大叔' => '吴秀波',);//再来玩玩简洁声明$drink = ['美' => '凤姐','很美' => '芙蓉姐姐','verymei' => '杨幂','心中滴女神呀' => '华妃',100 => '孙俪','娘娘',];// 输出 $relaecho '';var_dump($rela);echo '';// 输出$drinkecho '';var_dump($drink);echo '';?>我们来实验一下看看最终的结果是什么样的:6.1 数组的定义- 222 -本文档使用 看云 构建我们通过实验知道:1. 声明关联数组是 键名 => 值2. 在关联数组可以有索引数组的元素3. 关联数组中的索引数组的元素后再声明了无下标的元素,依然是最大值+1原则。(观察上图中的值为孙俪、娘娘的两个元素)。关联数组的增、删、改 '凤姐','很美' => '芙蓉姐姐','verymei' => '杨幂','心中滴女神呀' => '华妃',100 => '孙俪','娘娘',];//追加方式与索引数组是一样的$drink['kx'] = '康熙';//输出试试echo '';var_dump($drink);echo '';//删除一个试试unset($drink['verymei']);echo '';var_dump($drink);echo '';//将芙蓉姐姐 改成:心里美才是真的美$drink['很美'] = '心里美才是真的美';echo '';var_dump($drink);echo '';?>你动手做做刚刚的实验,你会发现操作方式与索引的操作方式一样。只不过下标在读取的时候读取的下标PHP学院了。6.1 数组的定义- 223 -本文档使用 看云 构建其他的关联数组声明方式 $cocacola,);?>通过上例我们发现,在关联数组当中也是可以不用array,直接在变量后面接括号。括号里面插入字符串下标,一样也声明成功。后面插入变量的例子,只不过把字符串变成了变量,当然没有问题。数组当中插入数组数组可以插入整型、浮点、字符串,那么数组当中可不可以插入数组呢?当然可以。在学习数组的时候,我们定义了这样一组名词。1. 一维数组 数组里面没有其他数组,只有单纯的一些变量或者值。2. 二维数组 数组里面插入了单层的一个数组,或者多个数组3. 三维数组 在数组(A)里面插入了一个数组(B),在B数组里面又插入了一层级的数组(C),这种我们就称为三维数组4. 超过三维的,统统都叫多维数组。注:索引数组和关联数组当中都可以再插入其他数组,让数组变为多维的。我们来声明一个一维数组,只有一个维度。索引、关联均可,这个操作大家都很熟。 250];//一维的关联数组$rela = ['beijing' => '北京','shanghai' => '上海','tj' => '天津',];6.1 数组的定义- 224 -本文档使用 看云 构建?>echo '';var_dump($rela);echo '';echo '';var_dump($data);echo '';一维数组大家很熟悉,也不难,就是声明数组嘛。二维也不难,只是在数组里面再插一个或多个数组。二维学好了,多维就学好了。 '办公室',//注意:插入第一个数组哟'family' => array('爸爸','妈妈','yeye' => '爷爷','nn' => '奶奶',),//注意:又插入了一个平级的数组'jiaotong' => array('自行车','摩托车','汽车','飞机',),);echo '';var_dump($person);echo '';?>我们执行一下看看效果:6.1 数组的定义- 225 -本文档使用 看云 构建我们发现变量person 是一个数组类型。有三个元素(size=3)。第一个元素为 office 对应的是一个字符串“办公室”,第二个元素为family 里面是一个数组,这个数组又有4个元素,值分别为:爸爸、妈妈、爷爷、奶奶。第三个元素为jiaotong,里面也为一个数组有4个元素,值分别为:自行车、摩托车、汽车、飞机。好了,二维数组好声明,只要把格式写对了,确定是在一个数组里面再插入一个数组就好。那如何访问:爷爷和爸爸这两个值呢? '办公室',//注意:插入第一个数组哟'family' => ['爸爸','妈妈','yeye' => '爷爷','nn' => '奶奶',],//注意:又插入了一个平级的数组'jiaotong' => ['自行车','摩托车','汽车','飞机',],];//访问“爸爸”这什值echo $person['family'][0];6.1 数组的定义- 226 -本文档使用 看云 构建echo '-----华丽丽的分割线------';//访问“爷爷”这什值echo $person['family']['yeye'];echo '-----华丽丽的分割线------';//访问“汽车”这什值echo $person['jiaotong'][2];?>我们看看结果如下:上例大家会发现,访问二维数组不过是按照之前的下标读取方式依次向下读取即可。先写上变量,中括号写上family这个下标,再写上要访问元素的下标。三维数组我们说了概念,那我们直接上手实验看看效果: array('上海','湖北','天津','北京' => array('hd' => '海淀','朝阳','房山','cp' => '昌平',),'广东' => array('深圳','广州',6.1 数组的定义- 227 -本文档使用 看云 构建'佛山','dg' => '东莞',),),'usa' => array('华盛顿','旧金山','纽约' => array('曼哈顿区','皇后区','布鲁克林区',),),);echo '';var_dump($area);echo '';?>我们执行一下看看效果:6.1 数组的定义- 228 -本文档使用 看云 构建说明:在变量$area下有二个数组,一个为china,一个为usa。在china这个数组里面插入了上海、湖北、天津,又插入了北京和广东。而北京和广东又是一个数组。在北京和广东这两个数组里面分别有不同的元素。在这usa 这个数组里面插美国的华盛顿、旧金山和纽约。而纽约下面又是一个数组,说明了纽约下面的几个区。所以说,三维数组就是在数组里面再插入一个数组(A),在A数组里面插入一个数组。我们接下来看看,如何来读取里面的值。 array(6.1 数组的定义- 229 -本文档使用 看云 构建'上海','湖北','天津','北京' => array('hd' => '海淀','朝阳','房山','cp' => '昌平',),'广东' => array('深圳','广州','佛山','dg' => '东莞',),),'usa' => array('华盛顿','旧金山','纽约' => array('曼哈顿区','皇后区','布鲁克林区',),),);//读取华盛顿echo $area['usa']['0'];//读取:布鲁克林echo $area['usa']['纽约'][2];//读取:昌平echo $area['china']['北京']['cp'];//修改cp下标的值改为:西城区$area['china']['北京']['cp'] = '西城区';//输出看看原来昌平的值是否发生了变化echo $area['china']['北京']['cp'];?>通过上面我们发现数组学习起来不难。学习多维数组的难点:注意格式,将每个维度的换行、缩进弄整齐。就不容易出错了。6.1 数组的定义- 230 -本文档使用 看云 构建【切记】数组元素间的分割符为逗号,在数组中插入数组的时候,不要在结尾处写成了分号(;)下图是错误的载图展示:6.1 数组的定义- 231 -本文档使用 看云 构建6.1 数组的定义- 232 -本文档使用 看云 构建6.2 数组的操作6.2.1 数组的计算6.2.2 for循环遍历索引数组6.2.3 foreach遍历关联数组6.2.4 list、each函数遍历数组6.2.5 常用操作数组函数6.2 数组的操作- 233 -本文档使用 看云 构建6.2.1 数组的计算数组是我们最常用到的类型,那如何计算某个一维数组的个数呢。其实我们可以用到我们之前学过的数学函数里面的一个:count()。我们来看看count函数的用法:int count ( mixed $变量)注:1. 参数$变量 要求是一个数组或者一个可以被统计的对象那我们可以来尝试使用统计函数来统计一下数组的个数。'百度','ali' => '阿里','tencent' => '腾讯',];echo count($data);$erwei = [['baidu' =>'百度','ali' => '阿里','tencent' => '腾讯',],['netease' =>'网易','sohu' => '搜狐','sina' => '新浪',]];//试试输出一个二维数组个数echo count($erwei);//试试输出二维数组中某个元素的个数echo count($erwei[1]);6.2.1 数组的计算- 234 -本文档使用 看云 构建?>通过上例,我们发现即可以输出索引数组,也可以输出关联数组的个数。如果是一个二维数组,这个函数只会统计当前的这一个维度的数组元素个数。如上例中的:$erwei。所以count($erwei)的时候结果是2。而count($erwei[1])的时候,结果为3。6.2.1 数组的计算- 235 -本文档使用 看云 构建6.2.2 for循环遍历索引数组遍历二字,从字面解释就是一个接一个全读访问一次,显示出来。因为for循环是一个单纯的计数型循环,而索引数组的下标为整型的数值。因此,我们可以通过for循环来遍历索引数组。我们知道索引数组下标为整型。我们定义下面的一个数组:通过上面的例子,我们就把数组进行了循环。因为下标是从0开始的,定义$i=0 。每次循环的时候让$i 加1 ,但是必须要小于10,因为数组下标的最大值为9。这样,我们就学会了对索引连续下标数组的遍历。那么问题来了:那关联数组怎么办? 如果索引数组的下标不连续怎么办?答:咱们下个章节讲,小伙子别急嘛。6.2.2 for循环遍历索引数组- 236 -本文档使用 看云 构建6.2.2 for循环遍历索引数组- 237 -本文档使用 看云 构建6.2.3 foreach遍历关联数组foreach的基本语法我们通过上一章的内容学会了遍历连续下标的索引数组。可是,我们发现我们遍历不了关联数组,也遍历不了下标不连续的索引数组。那我们其实在学循环的时候,有一个布尔型循环是专门用来循环数组的。这个循环的基本语法就是foreach基本语法。语法格式如下:foreach( 要循环的数组变量 as [键变量 =>] 值变量){//循环的结构体}遍历关联数组这是一个固定用法,将要循环的数组放进去。as 是一个固定的关键字后面的键变量是可选的,随意定义一个变量,每次循环的时候,foreach这个语法会把键取出来赋值到键变量里面后面的值变量是必填的。每次循环的时候,会把值放到值变量里面。我们下面用代码来举例子,加强对这个语法的理解。 '凤姐','fr' => '芙蓉',];foreach($data as $key => $value){echo $key . '-------' . $value . '';}//如果我们只想读取值的话,就可以把下面的$key => 给删除掉,读取的时候,就只读取值了。做完上面的实验,你可以打开下面的代码再实验几次。/*foreach($data as $value){6.2.3 foreach遍历关联数组- 238 -本文档使用 看云 构建echo $value . '';}*/?>我们运行一下看看结果:通过上面的运行结果我们得出下面的结果:1. 每次循环的时候,把下标赋值给了变量$key,把值的变量赋值给了变量$value2. 循环一次读一次键和值。如上例中,读完“凤姐”再读取“芙蓉”,读到最后,发现没有可以读取的数组元素后,停止循环遍历数据。注意:$key 和$value并不是变量名必须得为这两个名字。你命名为其他的也可以,如 $kai => $wen是一样的。 你要清楚键赋值给了哪个变量,值赋值给了另外的哪个变量。遍历索引数组foreach还挺好学的。因此,我们可以通过foreach遍历连续的索引数组,如下例: '中国',100 => '美国',20 => '韩国',300 => '德国',);//待会儿可以自己做做实验,循环遍历一下下面的这个数组//$data = array(1,2,3,4,5,6,7,8,9,10);foreach($data as $k => $v){echo $k . '------' . $v .'';}?>运行看一下结果:6.2.3 foreach遍历关联数组- 239 -本文档使用 看云 构建按照foreach的结果推理与刚刚做的关联数组的结果是一样的。不同的是不连续的索引数组。每读一次数组的元素,将当次循环的下标赋值给了变量$k,值赋值给了变量$v。每读将键和值输出,然后显示出来。循环一次向后移动一次下标。读取至最后,退出执行。遍历多维数组数组当中还有一个数组我们该怎么遍历呢?我们来做一个实验: array('中国' => 'china','美国' => 'usa','德国' => ' Germany',),1 => array('湖北' => 'hubei','河北' => 'hebei','山东' => 'shandong','山西' => 'sanxi',),);//注:我们在使用foreach循环时,第一次循环将键为0和键为1的两个数组赋值给一个变量($value)。然后,再套一个循环遍历这个$value变量,$value中的值取出来,赋值给$k和$v。foreach($data as $value){//第一次循环把国家的数组赋值给了$value//第二次循环把中国的省份的数组又赋值给了$value//因此,我在循环的时候把$value再遍历一次foreach($value as $k => $v){echo $k . '-----' . $v .'';}//为了看的更清晰,我在中间加上华丽丽的分割线方便你来分析echo '----------分割线-----------';}?>6.2.3 foreach遍历关联数组- 240 -本文档使用 看云 构建结果就出来了哟:总结:1. 第一次循环的时候,将数组赋值给了$value,然后用foreach循环$value。将二维的子数组中的键给到$k,值赋值给变量$v。2. 第一次循环退出子数组的循环,执行后续代码显示分割线。3. 依此类推,第二次循环也是这样。作业将如下数组:array(array('李某','18','人妖'),array('高某','20','男'),array('张某','21','妖人'),),'宣传部'=>array(array('李某','18','人妖'),array('高某','20','男'),array('张某','21','妖人'),),'财务部'=>array(array('李某','18','人妖'),array('高某','20','男'),array('张某','21','妖人'),),);?>遍历显示出来,效果如下:6.2.3 foreach遍历关联数组- 241 -本文档使用 看云 构建6.2.3 foreach遍历关联数组- 242 -本文档使用 看云 构建6.2.4 list、each函数遍历数组我们来研究两个比较有意思的数组函数。这两个函数学起来不难。但是,有些同学会遇到一点点小困难。困难在于,找到list函数和each函数的操作特点。list函数我们先来讲list函数:list ( mixed $变量1 [, mixed $变量n ] )它的功能:将索引数组下标为0的对应我变量1,下标1的对应变量2,依此类推。我们来通过实验来看一下:我们来看一下实验结果:分析结果如图:6.2.4 list、each函数遍历数组- 243 -本文档使用 看云 构建结论:1. 将下标为0的张三赋值给了$one2. 将下标为1的李四赋值给了$two3. 将下标为2的王五赋值给了$three因此,我们知道了list的功能就是从左到右,一一对应索引数组从0开始的下标值。list的另外一种用法:运行结果:结论:1. list当中的第一、二个放变量的地方留空,我只写了$three。2. 按照一一对应原则,张三和李四没有变量可以对应。3. 所以只有王五有变量对应请严格记住:索引数组的一一对应原则。list第一个变量对应的是下标为0的数组元素,下标为1的对应的6.2.4 list、each函数遍历数组- 244 -本文档使用 看云 构建是list里面的第二个数组元素。请猜猜下面的结果是多少? 为什么? '张三', '李四', '王五');echo '$one----' . $one . '';echo '$two----' . $two . '';echo '$three----' . $three . '';?>运行结果如下图:总结:1. 因为是一一对应原则,$one找不到下标为0的数组元素,$two找不到下标为1的数组元素,只有$three找到了下标为2的数组元素2. 在list($one, $two, $three),我只写了三个变量。对应完成,无需再对应后面的变量了,丢弃李四和王五。each函数each 函数的规律性上面就更有特点了,并且比较有趣。array each ( array &$array )功能:传入一个数组。它会将其中的一个元素拆为个新数组。每次执行这样操作一个元素。执行一次先后移动一次,同样的方式操作下一个数组元素。执行到最后,返回false。我们先来看看each是怎么操作的数组元素。'穿黑衣服的','shou'=>'腿特别长特别细','mei'=>'好白',6.2.4 list、each函数遍历数组- 245 -本文档使用 看云 构建'pl'=>'五官端正','type'=>'那就是女神','我是屌丝不敢跟女神搭讪'];//第一次each$data = each($kongjie);echo '';var_dump($data);echo '';?>我们来看看第一次执行each的结果:总结:1.读取了$kongjie中的第一个元素,将第一个元素('gao'=>'穿黑衣服的')分解开了。1. 分解后第一个元素变成了一个新数组。2. 在新数组里面,将原值(穿黑衣服的)放了索引下标1里面,同时放到了关联下标value里面。3. 在新数组里面,将原键(gao),放到了关联下标key里面,放到了索引下标0里面。我们用图来表示:6.2.4 list、each函数遍历数组- 246 -本文档使用 看云 构建这样我们一下子就看明白了。接下来我们说说each的另外一个特性。读一次,向后移动一个元素。'穿黑衣服的','shou'=>'退特别长特别细','mei'=>'好白',];//第一次each$data = each($kongjie);echo '';var_dump($data);echo '';echo '-----华丽丽分割线------';//第2次each$data = each($kongjie);echo '';var_dump($data);echo '';echo '-----华丽丽分割线------';//第3次each【执行到了最后一个元素了】$data = each($kongjie);echo '';6.2.4 list、each函数遍历数组- 247 -本文档使用 看云 构建var_dump($data);echo '';echo '-----华丽丽分割线------';//第4次【此时,后面已没有可操作的元素了,看返回什么】$data = each($kongjie);echo '';var_dump($data);echo '';echo '-----华丽丽分割线------';?>执行结果:总结:1. 读一次向后移动一次【可以想象有一个记录的箭头在移动】,将其中的每个元素拆解成一个新数组2. 读取到最后,没有可操作的元素了,所以返回了false。list 和each 配合6.2.4 list、each函数遍历数组- 248 -本文档使用 看云 构建我们知道了list的特性,也知道了each的特性。那list是不是可以和each配合起来一起来完成一些工作呢?list($key,$value) = each($array);我们来看之前说到的这个图:而list中的第一个变量会去找索引下面0的元素去赋值,第二个变量会找索引下标为1的元素对变量赋值。我们来看看下面例子:'穿黑衣服的','shou'=>'退特别长特别细','mei'=>'好白',];list($key,$value) = each($kongjie);echo $key. '-----' .$value .'';?>运行结果如下:6.2.4 list、each函数遍历数组- 249 -本文档使用 看云 构建总结:1. each 把变量拆成了4个元素2. 而list把0 =>gao 赋值给了变量$key3. list把1 => 穿黑衣服的 赋值给了变量 $valueeach到最后会返回false,因此我可以用布尔型循环while来配合完成数组的循环。把上面的代码,轻轻一改就实现了如下效果:'穿黑衣服的','shou'=>'退特别长特别细','mei'=>'好白',];while(list($key,$value) = each($kongjie)){echo $key. '-----' .$value .'';}?>执行演示:总结:1. 循环一次,执行一次each,执行代码,然后向后移动一个元素2. 执行到最后返回fasle,因此停止执行。3. 可以通过each和list配合实现foreach一样的效果。6.2.4 list、each函数遍历数组- 250 -本文档使用 看云 构建作业:使用list和each配合,将如下数组:array(array('李某','18','人妖'),array('高某','20','男'),array('张某','21','妖人'),),'宣传部'=>array(array('李某','18','人妖'),array('高某','20','男'),array('张某','21','妖人'),),'财务部'=>array(array('李某','18','人妖'),array('高某','20','男'),array('张某','21','妖人'),),);?>遍历显示出来,效果如下:6.2.4 list、each函数遍历数组- 251 -本文档使用 看云 构建6.2.4 list、each函数遍历数组- 252 -本文档使用 看云 构建6.2.5 常用操作数组函数我们有很多操作数组的元素,我们这一节先讲一些。在6.3里面我们会总结更多的数组常用函数。下面的几个主要是移动数组指针和压入弹出数组元素的和个函数。函数 功能array_shift 弹出数组中的第一个元素array_unshift 在数组的开始处压入元素array_push 向数组的末尾处压入元素array_pop 弹出数组末尾的最后一个元素current 读出指针当前位置的值key 读出指针当前位置的键next 指针向下移prev 向上移reset 指针到开始处end 指针到结束处array_shift> mixed array_shift ( array &$array )功能:弹出数组中的第一个元素执行结果:结论:6.2.5 常用操作数组函数- 253 -本文档使用 看云 构建1. 将第一个数组元素弹出,改变了原数组的结果2. 弹出的值赋值给了$dcarray_unshiftint array_unshift ( array &$数组 , mixed $值1 [, mixed $... ] )功能:向指数组的开始处压入一个或多个元素,返回的是总个数。执行结果如下:array_popmixed array_pop ( array &$array )功能:弹出数组末尾的一个元素执行结果:6.2.5 常用操作数组函数- 254 -本文档使用 看云 构建array_pushint array_push ( array &$array , mixed $value1 [, mixed $... ] )功能:向指数组末尾处压入一个或多个元素,返回的是总个数。执行结果:current,key,prev,next,reset 功能演示这几个函数功能已经说的很清楚了。我们通过代码来进行演示:'永远','dbg'=>'需要不断奋进','djn'=>'才能开创未来');//读取数组的值echo current($t).'';//读取数组的键echo key($t).'';//向后移动一下6.2.5 常用操作数组函数- 255 -本文档使用 看云 构建next($t);//再读值和键echo current($t).'';echo key($t).'';//向后移动一下next($t);echo current($t).'';echo key($t).'';//向前移动一下prev($t);echo current($t).'';echo key($t).'';//移到末尾end($t);echo current($t).'';echo key($t).'';//移至开始处reset($t);echo current($t).'';echo key($t).'';//销毁数组unset($t);var_dump($t);?>6.2.5 常用操作数组函数- 256 -本文档使用 看云 构建6.3 数组的常用函数因为数组的函数特别多,很多全是英文标识的。还有一些数组的函数不太常用。因此,我们把最最常用的数组函数跟大家总结好了,记大家务必提到哪个函数的时候,就能随时想起来。直接使用。请将这些函数对着手册的示例多用几次。要求达到:默写级别。以后在看和写任何代码的时候,不用再反映半天。上手就直接使用这些函数,是一个程序员的基本素养。这些函数,也是面试中基础面试中最爱问到的问题。函数名 功能array_combine() 生成一个数组,用一个数组的值作为键名,另一个数组值作为值range() 创建并返回一个包含指定范围的元素的数组。compact() 创建一个由参数所带变量组成的数组array_fill() 用给定的值生成数组array_chunk() 把一个数组分割为新的数组块array_merge() 把两个或多个数组合并为一个数组array_slice() 在数组中根据条件取出一段值,并返回array_diff() 返回两个数组的差集数组array_search() 在数组中搜索给定的值,如果成功则返回相应的键名array_splice() 把数组中的一部分去掉并用其它值取代array_sum() 计算数组中所有值的和in_array() 检查数组中是否存在某个值array_key_exists() 检查给定的键名或索引是否存在于数组中shuffle() 将数组打乱,保留键值count() 计算数组中的单元数目或对象中的属性个数array_flip() 返回一个键值反转后的数组array_keys() 返回数组所有的键,组成一个数组array_values() 返回数组中所有值,组成一个数组array_reverse() 返回一个元素顺序相反的数组array_count_values() 统计数组中所有的值出现的次数array_rand() 从数组中随机抽取一个或多个元素,注意是键名array_unique() 删除重复值,返回剩余数组sort() 按升序对给定数组的值排序,不保留键名6.3 数组的常用函数- 257 -本文档使用 看云 构建rsort() 对数组逆向排序,不保留键名asort() 对数组排序,保持索引关系arsort() 对数组逆向排序,保持索引关系ksort() 按键名对数组排序krsort() 将数组按照键逆向排序natsort() 用自然顺序算法对数组中的元素排序natcasesort() 自然排序,不区分大小写array_filter() 去掉数组中的空元素或者预定元素extract 将键变为变量名,将值变为变量值6.3 数组的常用函数- 258 -本文档使用 看云 构建07. PHP中的正则达达式我们常说这么一句话:世界上最难懂的是道士的鬼符和医生的处方其实我们还要加上一句:世界上最难懂的是道士的鬼符、医生的处方和程序员的正则表达示。我们先看一个正则表达示的样子:/^a-z@([a-z0-9][-_]?[a-z0-9]+)+[\.][a-z]{2,3}([\.][a-z]{2})?$/i呵呵,看着就觉得揪心。提前声明,别被吓着,学习一下后你会发现没那么困难。正则表达示我们其实之前经常看到,它主要用在以下一些地方:1. 匹配邮箱、手机号码、验证码2. 替换敏感的关键词。例如:涉及政治和骂人的话3. 文章采集。4. 早期的表情替换技术,ubb文件编码、markdown编辑器替换等5. 以后自己写模板引擎也需要用到正则表达示其他....我们学习本章,先通过一点一点来去学习和了解正则表达示需要掌握的基本技术。07. PHP中的正则达达式- 259 -本文档使用 看云 构建7.1 正则表达示的定界符在学习正则表达示前,我们先要来学习正则表达示的定界符。定界符,就是定一个边界,边界已内的就是正则表达示。PHP的正则表达示定界符的规定如下:定界符,不能用a-zA-Z0-9\ 其他的都可以用。必须成对出现,有开始就有结束。我们来举几个例子:例子 说明/中间写正则/ 正确$中间写正则$ 正确%中间写正则% 正确^中间写正则^ 正确@中间写正则@ 正确(中间写正则) 错误A中间写正则A 错误注:\ 是转义字符,如果在以后正则表达示里面需要匹配/,如下图:> / / /这个时候真要匹配/ 的时候,需要把定界符里面的/ 用转义字符转义一下,写成下面的例子:> / \/ /如果你觉得麻烦,遇到这种需要转义的字符的时候可以把两个正斜线(/ /)定界,改为其他的定界符(##)。7.1 正则表达示的定界符- 260 -本文档使用 看云 构建7.2 正则表达示中的原子原子原子是正则表达示里面的最小单位,原子说白了就是需要匹配的内容。一个成立的正则表达示当中必须最少要有一个原子。所有可见不可见的字符就是原子说明:我们见到的空格、回车、换行、0-9、A-Za-z、中文、标点符号、特殊符号全为原子。在做原子的实例前我们先来讲解一个函数,preg_match:int preg_match ( string $正则 , string $字符串 [, array &$结果] )功能:根据$正则变量,匹配$字符串变量。如果存在则返回匹配的个数,把匹配到的结果放到$结果变量里。如果没有匹配到结果返回0。注:上面是preg_match常用的主要几个参数。我在上面将另外几个参数没有列出来。因为,另外两个参数太不常用了。我们来通过实验来证明:我们来看看结果,得到如下结论。它从“你好”直接匹配到了“我是”。进行了最大范围的匹配。同样一段代码我们再加大写的U,再看看效果:7.4 正则达达示中的模式修正符- 282 -本文档使用 看云 构建我们发现,只匹配出来了:你好这样,把正则的贪婪特性取消掉。让它找到了最近的匹配,就OK了。A 从目标字符串的开头开始匹配此模式类似于元字符中的^(抑扬符)效果。结论:1. 如果加A模式修正符的时候匹配不出来$string,不加时能匹配出来2. 如果加上了A模式修正符的时候能匹配出来$string1,因为必须要从开始处开始匹配D 结束$符后不准有回车如果设定了此修正符,模式中的美元元字符仅匹配目标字符串的结尾。没有此选项时,如果最后一个字符是换行符的话,美元符号也会匹配此字符之前。结果展示:结论:1. 如pattern 在匹配$string的时候,$string的字符串this后有一个回车。在没有加D匹配符的时候也能匹配成功2. 如pattern 在匹配$string的时候,加上了D。$string的字符串this后有空格,匹配不成功。7.4 正则达达示中的模式修正符- 284 -本文档使用 看云 构建7.5 写正则的诀窍和常用正则写正则的诀窍女孩和男孩恋爱时的诀窍通常是:测试你是不是对我好一点,如果是的,咱们的关系就更好一点。而正则的诀窍和恋爱的诀窍基本一致:写一点、测一点。因为,我们需要不断的正则,用preg_match对比是不是能匹配成功。成功了,再写后面的一点。直到写完,全部匹配成功为止!例如,我要写一个邮箱的正则。我先要做的事情,将常用的邮箱格式全部列出来。例如:liwenkai@phpxy.comliwenkai@corp.baidu.cmliwenkai@126.coml_w_k@xxx.com12345@qq.com常用的格式主要有这样一些。那我们就可以来分析:1. 先匹配@之前的字符 \w+(因为是0-9A-Za-z_)2. 第二个跟一个@符3. 第三个再写上[a-zA-Z0-9-]+ 因为qq和126这些主域名是不能有下划线的4. corp.baidu. 或者是126. 通常邮箱后缀都是这样的。所以我们可以写成:([a-zA-Z0-9-]+.){1,2}5. 上面的是将.转义,让它是本身的意思。括号重复的区间最少一次,最多两次。6. 后面接下com|cn|org|gov.cn|net|edu.cn等就可以了因此,我们的正则表达示在我使用:/\w+@([a-zA-Z0-9-]+.){1,2}(com|cn|org|gov.cn|net|edu.cn)/邮箱的正则就被我写成功了。常用正则函数我们常用的正则函数有:| 函数名 | 功能 || -- | -- || preg_filter | 执行一个正则表达式搜索和替换 || preg_grep | 返回匹配模式的数组条目 || preg_match | 执行一个正则表达式匹配 |7.5 写正则的诀窍和常用正则- 285 -本文档使用 看云 构建| preg_match_all | 执行一个全局正则表达式匹配 || preg_replace_callback_array | 传入数组,执行一个正则表达式搜索和替换使用回调 || preg_replace_callback | 执行一个正则表达式搜索并且使用一个回调进行替换 || preg_replace | 执行一个正则表达式的搜索和替换 || preg_split |通过一个正则表达式分隔字符串 |大家针对这这些函数,对着手册用一下。有问题或遇到问题可以来我们的官网提问。正则关于面试常遇到的问题面试中经常考到的几个正则达达示是:1. 匹配邮箱2. 匹配手机号3. 匹配一个网址4. 用正则匹配某个格式,取出某个个例5. 写一个采集器其他....面试的第4题和第5题我对大家不担心,因为只要大家认真学习了我给的前五节的内容。第4,5题推理就行。因为,通常在技术答题面试环节,是时候准许查手机的!常用正则表达示下面的是快速查找的正则表达示,大家一定得知道具体意思。需要的时候直接复制即可:7.5 写正则的诀窍和常用正则- 286 -本文档使用 看云 构建7.6 用正则写一个UBB文本编辑器我们来看一下UBB编辑器。这是网站当中经常用到的文本处理技术。因为使用UBB文件编辑器,我指定的格式才能存在。我不指定的格式,用户是无法在网站中展现的。我们来看看效果:实现的更高级,你可以让用户传过来的是form表单中的结果,让用户传值过来。你转换输出成UBB格式。哦耶,成功了!下一章节中我们学习了文件系统的知识,再跟大家讲解更加有趣的:网页采集器。7.6 用正则写一个UBB文本编辑器- 287 -本文档使用 看云 构建7.6 用正则写一个UBB文本编辑器- 288 -本文档使用 看云 构建08.文件系统我们会点鼠标右键删除文件、会control+c(或右键)复制、粘贴文件,会新建一些文件,检测这个文件是不是只读文件。在电脑里面进行的这些操作,在代码里面如果能操作就好了。因为,如果有了这些操作。我们能做很多事情了:1. 可不可以写入修改配置文件?2. 是不是可以做PHP安装的时候检测文件的权限3. 是不是可以做生成Html文件等等很多不同的操作..... 其他太多太多的地方用到了文件操作。学习文件处理本质上面就是学习文件处理的函数。再结合之前写的代码,完善自己的业务处理能力。08.文件系统- 289 -本文档使用 看云 构建8.1 读取文件我们在上一节当中,我们讲到了可以进行文件操作。而读取文件是一个最最常用的功能。readfile读取文件那如何读取一个文件呢?我们先学一个函数。int readfile ( string $文件名)功能:传入一个文件路径,输出一个文件。下面的这一段代码中,只要传入文件名或者指定的文件路径就把文件读取出来了。注意:上面的代码中windows的斜线是\斜线,可能会转义掉一些字符。因此,我们写的时候写上两个斜线。file_get_contents打开文件上面的是单纯打文件就直接输出了,有没有打开文件后,能够赋值给一个变量的操作方式呢。PHP当然会提供这种方式。这个方式就是PHP打开文件并返回内容的方式之一,我们来看看函数:string file_get_contents ( string filename)功能:传入一个文件或文件路径,打开这个文件返回文件的内容。文件的内容是一个字符串。上面的代码,就打开了一个文件,并且将文件当中的内容进行了输出。8.1 读取文件- 290 -本文档使用 看云 构建我们来针对之前的知识把代码进行一下扩展。用一用之前的知识点。上面,我们就把之前所学的知识进行了组合。fopen、fread、fclose操作读取文件上面file_get_contents打开文件的方式简单、粗暴。下面的resource fopen ( string $文件名, string 模式)string fread ( resource $操作资源, int 读取长度)bool fclose ( resource $操作资源 )通过上面的函数我们来讲解资源类型的通常操作方式:1. 打开资源2. 使用相关函数进行操作3. 关闭资源fopen函数fopen函数的功能是打开文件,参数主要有两个:1. 文件打开的路径2. 打开文件的模式8.1 读取文件- 291 -本文档使用 看云 构建返回类型是一个资源类型,我们第一次遇到了之前基础类型的时候讲到的资源类型。资源类型需要其他的函数来操作这个资源。所有的资源有打开就要有关闭。fread函数函数的功能是读取打开的文件资源。读取指定长度的文件资源,读取一部分向后移动一部份。至到文件结尾。fclose函数fclose函数的功能是关闭资源。资源有打开就有关闭。了解完函数,后两个函数比较简单。而fopen函数的模式到底是什么,fopen的模式有下面几个,我们来讲一下fopen的模式:模式说明r 只读方式打开,将文件指针指向文件头。r+ 读写方式打开,将文件指针指向文件头。w 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建w+ 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建a 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建a+ 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之x创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建x+创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,则 fopen() 调用失败并返回 FALSE,并生成一条 E_WARNING 级别的错误信息。如果文件不存在则尝试创建接下来,我们只来学习r模式,下结课我们在将写入的时候再来讲讲其他几个模式。我们先会读取文件了,才能很好的掌握写入文件。1.打开文件2.读取文件8.1 读取文件- 292 -本文档使用 看云 构建3.关闭文件其他注意事项:模式 说明t windows下将\n转为\r\nb 二进制打开模式使用示例:说明:实验无法让肉眼看到这个实验效果。大家记住有这个特点即可。Windows 下提供了一个文本转换标记('t')可以将 \n 转换为 \r\n。与此对应还可以使用 'b' 来强制使用二进制模式,这样就不会转换数据。要使用这些标记,要么用 'b' 或者用 't' 作为 mode 参数的最后一个字符。8.1 读取文件- 293 -本文档使用 看云 构建8.2 创建和修改文件内容上一节当中我们学习了读取文件特别好掌握。这一节当中我们来讲解的是写入文件。file_put_contents写入文件我们先来学习第一种写入文件的方式:int file_put_contents ( string $文件路径, string $写入数据])功能:向指定的文件当中写入一个字符串,如果文件不存在则创建文件。返回的是写入的字节长度我们发现写入文件也挺简单的。按照这个函数的格式,指定文件,写入字符串数据就可以了。fwrite配合fopen进行写入操作int fwrite ( resource $文件资源变量, string $写入的字符串 [, int 长度])注:fwrite的别名函数是fputs我们上节课试了r模式,只道是读取的时候使用,接下来我们用fwrite加上fopen中的w,写入模式来进行文件写入。我们来看一下特点:写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建。注意:在下面的实验中,你可以试试新建个test.txt文件向里面写入内容。然后,可以试试把test.txt删除。看看有什么提示。8.2 创建和修改文件内容- 294 -本文档使用 看云 构建总结:1.不论有没有新建都会打开文件重新写入2.原有的文件内容会被覆盖掉3.文件不存在会创建那我们来对比一下以下几个模式的不同:模式 说明r 只能读不能使用fwrite写r+ 可操作读、写w 只可以写功能w+ 即可读又可以写我们来通过实验证明一下:实验时可以把r后面的+号去掉。我们通过实验,确实发现使用r模式,在文件存的时候可以进行写入数据,只用r的话,写入是不成功的。a模式和w模式的不同同样是下面的这段代码,我们改为a模式。打开网页执行这段代码,你会发现:每刷新一次,文件中就会多一段8.2 创建和修改文件内容- 295 -本文档使用 看云 构建:读大学迷茫了,PHP学院PHP给你希望。总结:模式 总结x 每次写入会干掉原有文件的内容,文件不存在都会创建a 每次写入都会向文件的尾端追加内容注:a+ 是增强的追加功能。可以读取时也可以使用。x模式和w模式的不同这段代码我们再实验一次,改为x模式:我们会发现:1. 文件存在的时候会报错2. 如果把$filename 改成其他的文件名,就可以了。但是,再次刷新的时候又报错了3. x+ 是增强的x模式。读取时也可以使用。8.2 创建和修改文件内容- 296 -本文档使用 看云 构建8.3 创建临时文件我们之前创建的文件都是永久文件。而创建临时文件在我们平时的项目开发中也非常有用。创建临时文件的几个好处:1. 文件使用完后即删除2. 不需要去维护这个文件的删除状态例如:我需要把A的文件内容转存B里面,把B的文件内容转存到C里面。就跟现实生活中一样,我可以先用一个临时的瓶子把B的水装起来,然后把A的数据写入到B里面。把临时瓶子的水追加到C里面。我们来学习一下这个函数:resource tmpfile ( )功能:创建一个临时文件,返回资源类型。关闭文件即被删除。8.3 创建临时文件- 297 -本文档使用 看云 构建8.4 移动、拷贝和删除文件我们日常在处理文件的时候,可以删除文件、重命名文件也可以也可复制文件。那在这一节,我们就来讲解我们日常生活当中最常用到的一些操作。我们先来说重命名,重命名的函数是:重命名文件bool rename($旧名,$新名);这个函数返回一个bool值,将旧的名字改为新的名字。我们打开目录,我们可以看看效果,你会发现把指定的文件,复制了一份到了目标路径。复制文件复制文件,就相当于是克隆技术,将一个原来的东西再克隆成一个新的东西。两个长得一模一样。bool copy(源文件,目标文件)功能:将指定路径的源文件,复制一份到目标文件的位置。我们来通过实验和代码来玩玩:8.4 移动、拷贝和删除文件- 298 -本文档使用 看云 构建总结:你会通过上面的例子,发现多出来了一个文件。删除文件删除文件就是将指定路径的一个文件删除,不过这个删除是直接删除。使用的是windows电脑,你在回收站看不到这个文件。你只会发现,这个文件消失了。bool unlink(指定路径的文件)8.4 移动、拷贝和删除文件- 299 -本文档使用 看云 构建8.5 检测文件属性函数有些同学特别好奇,检测文件属性用在什么地方。检测文件属性能用到的地方太多了。我们来举例子:1. 我们在做软件安装的时候,大家会发现如果文件存在了,就跳转到了其他的地方。2. 如果在安装的过程当中,某些文件没有写入权限,就不让进行安装。我们来举一个国内非常出名的软件,discuz的安装过程截图给大家看看:上面的例子,就是典型的文件检测的用法。我们来学习一下下面的一批函数。然后,我们来通过一个例子进行学习。bool file_exists ( $指定文件名或者文件路径)功能:文件是否存在。bool is_readable ( $指定文件名或者文件路径)功能:文件是否可读bool is_writeable ( $指定文件名或者文件路径)功能:文件是否可写8.5 检测文件属性函数- 300 -本文档使用 看云 构建bool is_executable ( $指定文件名或者文件路径)功能:文件是否可执行bool is_file ( $指定文件名或者文件路径)功能:是否是文件bool is_dir ( $指定文件名或者文件路径)功能:是否是目录void clearstatcache ( void )功能:清楚文件的状态缓存上面的功能一看就清楚了。那实验,我们就来写这个最开始我们举的这个例子。我们来讲第一个例子,文件锁。如果已经安装了,存在安装锁就提示已安装,否则就继续安装。我们假设安装界面的网址是:install.php,安装的锁文件是install.lock。我们就可以检测install.lock文件是否存在。我们接下来做一个文件安装检测的实验来检测文件或目录是否有写入或者读取权限。如果没有则不能进行安装。处理这件事情的思路如下:1. 定义一批需要检测权限的数组2. 可以检测是文件夹还是文件3. 做一个标置位变量,如果标置位变量一旦为false则不显示下一步的安装通过上面的例子,我们就做到了。实现PHP某个软件安装过程当中的安装检测。也就是我们上面思路的实现。8.5 检测文件属性函数- 302 -本文档使用 看云 构建8.6 文件常用函数和常量文件操作的常量下面这一个常量是最常用的。是文件目录的分割符的常量。我们来看看格式:平台 分割符windows \linux /windows 的路径格式为 d:\xxx\xxx 注意:windows支持 d:/xxx/xxxlinux 的路径格式为 /home/xxx/xxx 注意:如果\home\xxx\xxx 在linux上是错误的所以当你开启转义之类的话,转义字符 \ 用一起的话 d:\xxx\xxx 是一样的。判断时候有两个 \ 有的话 再转成一个\ 再把 \ 替换成 /当路径分割,这样在linux上或者windos上的路径就能保持统一了。我们会使用到一个常量:DIRECTORY_SEPARATOR我们来写一个小的实例,定义当前文件所在的路径:由于FILE是PHP的预定义常量,所以没办法改变,如果需要让FILE也自适应操作系统。那么就是不要用FILE,可以用自定义的常量,并且把FILE处理一下,如下:文件指针操作函数rewind ( resource handle)功能:指针回到开始处fseek ( resource handle, int offset [, int from_where])功能:文件指针向后移动指定字符8.6 文件常用函数和常量- 303 -本文档使用 看云 构建我们在之前的读取当中我们发现fread读取指定长度的数据。读取指定长度的内容,下次再读取的时候从原位置开始再接着向后读取。如上图,我们可以想象:1. 文件刚打开的时候读取到的是红色的图标2. 文件假设从A读取到了C3. 下次打开的时候可再从C绿色箭头处开始读取。我们在demo.txt文件中写入一批文件:abcdeefghijklkopqrstuvwxyz12345678我们可开始来实验一次。上面的例子,你会发现fseek指定多长就移动多少个字节。而rewind每次都是回到文件的开始处。8.6 文件常用函数和常量- 304 -本文档使用 看云 构建那如何移动到最末尾呢?我们可以统计字节数。在fseek的时候直接移到回后。下面我们来讲filesize统计字节数。filesize 检测文件的大小其它操作文件的函数其实还有一些其他操作文件的函数,读取文件函数名 功能file 把整个文件读入一个数组中fgets 从文件指针中读取一行,读到最后返回falsefgetc 从文件指针中读取一个字符,读到最后返回falseftruncate 将文件截断到给定的长度我们通过一个实例来把上面几个函数都用到。我们在demo.txt文件中写入一批文件:abcdeefghijklkopqrstuvwxyz123456788.6 文件常用函数和常量- 305 -本文档使用 看云 构建fgets每次打开一行:上面的代码,你会发现每次读取一次打开一行。读取最后返回的是false。我们接下来看文件截取函数:上例中我们发现,截取多长就能显示多长的内容。文件的时间函数函数 功能说明filectime 文件创建时间filemtime 文件修改时间fileatime 文件上次访问时间8.6 文件常用函数和常量- 306 -本文档使用 看云 构建8.6 文件常用函数和常量- 307 -本文档使用 看云 构建8.7 文件锁处机制文件锁机制一般在单一打开文件的时候根本看不到效果。这一块的学习有一点点抽象。大家不要去思考怎么实现的呀?为什么看不到效果呀?答:因为电脑的操作太快了,基本上是毫秒级的。所以这个实验其实是看不到效果的。这一章了解文件锁的基本概念即可,熟悉文件锁函数和锁机制。文件锁的用途:若一个人在写入一个文件,另外一个人同时也打个了这个文件进行写入文件。这情况下,如果遇到一定的碰撞概率的话,不知道到底谁的操作为准。因此,这个时候我们引入锁机制。若用户A在写入或者读取这个文件的时候,将文件加上共享锁。我可以读,其他人也可以读。但是,我如果这与的时候。我使用独占锁。这个文件归我了,你们都别动,除非我将文件锁进行释放。注意:加上了文件锁后要注意释放。我们来看看这个函数:bool flock ( resource $handle , int $operation)功能:轻便的咨询文件锁定我们来看看锁类型:锁类型 说明LOCK_SH 取得共享锁定(读取的程序)LOCK_EX 取得独占锁定(写入的程序LOCK_UN 释放锁定(无论共享或独占)我们接下来把demo.txt加上一个独占锁,进行写入操作。说明:1. 上例中我为了写入文件,把文件加上了独占锁。2. 如果我操作完成,写入完成后,解除掉了独占锁。3. 如果是在读取文件的时候,大家可加按照同样的处理思路加上共享锁。8.7 文件锁处机制- 309 -本文档使用 看云 构建8.8 目录处理函数之前我们处理的全都是文件,那目录和文件夹怎么处理呢?我们就来学习目录或者称为文件夹的处理相关函数。处理文件夹的基本思想如下:1. 读取某个路径的时候判断是否是文件夹2. 是文件夹的话,打开指定文件夹,返回文件目录的资源变量3. 使用readdir读取一次目录中的文件,目录指针向后偏移一次4. 使用readdir读取到最后,没有可读的文件返回false5. 关闭文件目录我们来学习一比常用函数:函数名 功能opendir 打开文件夹,返回操作资源readdir 读取文件夹资源is_dir 判断是否是文件夹closedir 关闭文件夹操作资源filetype 显示是文件夹还是文件,文件显示file,文件夹显示dir8.8 目录处理函数- 310 -本文档使用 看云 构建即然是读取一次向后移动一次,我们是不是可以8.8 目录处理函数- 311 -本文档使用 看云 构建8.9 文件权限设置文件权限设置的函数在系统管理级别的软件中很常用。例如:某个文件不准许guest组(来宾用户)查看呀。在企业管理中,某些用户或者某些用户文件只准读取不准修改。这都是非常常用的功能。注:1. 本章为了解章节。如果没有学习过linux会有些吃力,可以跳过本章,了解有这个东西即可。2. 在实际生产环节中用处较少。3. 主要针对在linux下有过全面知识体系的同学可以重点学习。4. windows下面有些功能无法实现。函数 功能说明chmod 修改读取模式chgrp 修改用户组chown 修改权限上面的函数用法与linux的权限操作的用法一样。对于学过linux的同学来说学起来比较简单。没有学过的会有些吃力。我只讲一个例子,看看如何来修改权限:chmod 主要是修改文件的的权限8.9 文件权限设置- 312 -本文档使用 看云 构建8.10文件路径函数我们经常会遇到处理文件路径的情况。例如:1. 文件后缀需要取出来2. 路径需要取出名字不取目录3. 只需要取出路径名中的目录路径4. 或者把网址中的各个部份进行解析取得独立值5. 甚至是自己组成一个url出来... ....很多地方都需要用路径处理类的函数。我们把常用的路径处理函数为大家做了标注,大家对着这个路径处理函数进行处理即可:函数名 功能pathinfo 返回文件的各个组成部分basename 返回文件名dirname 文件目录部分parse_url 网址拆解成各部分http_build_query 生成url 中的query字符串http_build_url 生成一个urlpathinfoarray pathinfo ( string $路径)功能:传入文件路径返回文件的各个组成部份我们用具体的示例来用一下:8.10文件路径函数- 313 -本文档使用 看云 构建结果如下:文件目录名:d:/www文件全名:lib.inc.php文件扩展名:php不包含扩展的文件名:lib.incbasenamestring basename ( string $路径[, string $suffix ])功能:传入路径返回文件名第一个参数传入路径。第二个参数,指定文件名到了指定字符停止。执行结果如下1: index2: index.php3: passwddirnamedirname(string $路径)功能:返回文件路径的文件目录部分结论:你可以执行看看是不是返回了文件的目录部分。parse_urlmixed parse_url ( string $路径 )8.10文件路径函数- 314 -本文档使用 看云 构建功能:将网址拆解成各个部分结果如下:array(8) {["scheme"]=>string(4) "http"["host"]=>string(8) "hostname"["port"]=>int(9090)["user"]=>string(8) "username"["pass"]=>string(8) "password"["path"]=>string(5) "/path"["query"]=>string(9) "arg=value"["fragment"]=>string(6) "anchor"}http_build_querystring http_build_query ( mixed $需要处理的数据)功能:生成url 中的query字符串'liwenkai','area'=>'hubei'];//生成query内容8.10文件路径函数- 315 -本文档使用 看云 构建echo http_build_query($data);?>结果如下:username=liwenkai&area=hubeihttp_build_url()功能: 生成一个url注:PHP_EOL 常量在 windows平台相当于 echo "\r\n";在unix\linux平台相当于 echo "\n";在mac平台相当于 echo "\r";8.10文件路径函数- 316 -本文档使用 看云 构建8.11 小小文件留言本我们讲完了这么多关于文件处理的系统,可是我们连一个最基本的小东西都写不出来。从这一节开始,大家会发现大家能够写越来越多的东西了。接下来我们我们来看看演示效果:在下面一个界面中写入留言内容的表单界面:存在留言后的展示界面:8.11 小小文件留言本- 317 -本文档使用 看云 构建我们来看一下文件结构:index.php ---展示输入框和留言内容write.php ---向message.txt写入数据message.txt ---存入聊天内容index.php文件基于文件的留言本演示用户名:留言内容:看了刚刚的展示内容,我们知道文件存储时:1. 段与段之间进行了分割2. 内容与用户之前用一个特殊的符号进行了分割下面我们来写write.php写入留言至文件的代码:8.11 小小文件留言本- 319 -本文档使用 看云 构建8.11 小小文件留言本- 320 -本文档使用 看云 构建8.12 修改配置文件的实例我们来看看国内知名论坛discuz的安装界面:在这儿安装,它怎么就修改了config.inc.php文件呢?下面我们来通过几个简单的技术来揭开它所谓的神秘面纱!文件规划:1. index.php -- 展示修改界面2. edit.php -- 修改功能代码3. config.php -- 实际的修改部份8.12 修改配置文件的实例- 321 -本文档使用 看云 构建index.php 展示修改界面。将config.php中的配置项展示出来。展示到表单中:2.edit.php 读取config.php文件,将这个文件视为字符串。我然后使用正则表达示匹配来修改内容。$val){//定义正则来查找内容,这里面的key为form表单里面的name$yx="/define\('$key','.*?'\);/";//将内容匹配成对应的key和修改的值$re="define('$key','$val');";//替换内容$string=preg_replace($yx,$re,$string);}//写入成功file_put_contents('config.php',$string);echo '修改成功';?>config.php 实际存储配置文件的部分,存储了真实的config.php文件内容:你是不是发现,这些其实并没有想象中的那么难。结合一下正则表达示和文件的知识就做到了!8.12 修改配置文件的实例- 323 -本文档使用 看云 构建09.PHP文件上传在我们日常使用中经常会遇到很多种这样的情况:1. QQ空间里面上传图片呀2. 微信朋友圈上传图片3. 发邮件里面上传邮件资料附件4. 认证的时候要求上传照片或身份证还有各种产品汪(gou)们提出的需求来分析,上传不同的东西。而产品汪提出来的需求我们需要实现。实现文件上传,是一个PHP程序员必备的技能之一。通过学习文件上传,你讲会看到文件上传的本质!09.PHP文件上传- 324 -本文档使用 看云 构建9.1 文件上传需要注意php.ini文件在正式讲解本章之前,我们第一件事情是要注意观察php.ini文件。我们第一次开始接触到如何修改php.ini文件,如果你的配置项与我们说的不一致,请注意修改。我们来了解每一个配置项。我们看一下如何修改php.ini。打开XAMPP中的php.ini配置文件。php.ini的文件太多,找不到的时候你可以使用ctrl+f 搜索相关配置项。配置项 功能说明file_uploads on为 开启文件上传功能,off为关闭post_max_size 系统允许的POST传参的最大值upload_max_filesize 系统允许的上传文件的最大值memory_limit 内存使用限制建议尺寸:file_size(文件大小) < upload_max_filesize < post_max_size < memory_limit另外,需要注意的是脚本执行时间。9.1 文件上传需要注意php.ini文件- 325 -本文档使用 看云 构建max_execution_time,这什参数的单位为秒。这个参数是设定脚本的最大执行时间。也可以根据需求做适当的改变。通常不需要来修改,系统默认值即可。超大文件上传的时候,可能会涉及到这一项参数的修改。上传时间太长了,会超时。如果你将此项参数设为0,则是不限制超时时间,不建议使。完成了php.ini的相关配置,我们就可以开始试着完成第一次文件上传了。9.1 文件上传需要注意php.ini文件- 326 -本文档使用 看云 构建9.2 文件上传的步骤为了更好的学习PHP,我们将极为复杂的PHP的文件上传归纳总结成为了6个步骤。在实际使用过程中,你按照这6个步骤就能够很好的完成PHP的文件上传:一、判断是否有错误码系统返回的错误码详解:错误码说明0 无误,可以继续进行文件上传的后续操作。1超出上传文件的最大限制,upload_max_filesize = 2M php.ini中设置,一般默认为2M。可根据项目中的实际需要来修改2 超出了指定的文件大小,根据项目的业务需求指定上传文件的大小限制3 只有部分文件被上传4 文件没有被上传6 找不到临时文件夹,可能目录不存在或没权限7 文件写入失败,可能磁盘满了或没有权限注:错误码中没有5。二、自定义判断是否超出文件大小范围在开发上传功能时。我们作为开发人员,除了php.ini中规定的上传的最大值外。我们通常还会设定一个值,是业务规定的上传大小限制。例如:新浪微博或者QQ空间只准单张头像图片2M。而在上传图册的时候又可以超过2M来上传。所以说,它的系统是支持更大文件上传的。此处的判断文件大小,我们用于限制实际业务中我们想要规定的上传的文件大小。三、判断后缀名和mime类型是否符合在网络世界里面也有坏人。他们会把图片插入病毒,在附件中上传病毒,他们会在网页中插入病毒或者黄色图片。我们需要对于上传的文件后缀和mime类型都要进行判断才可以。9.2 文件上传的步骤- 327 -本文档使用 看云 构建MIME(Multipurpose Internet Mail Extensions)是多用途互联网邮件扩展类型。是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。在判断后缀和MIME类型的时候,我们会用到PHP的一个函数in_array(),该函数传入两个参数。第一个参数是要判断的值;第二个参数是范围数组。我们用这个函数来判断文件的后缀名和mime类型是否在允许的范围内。四、生成文件名我们的文件上传成功了,不会让它保存原名。因为,有些人在原名中有敏感关键词会违反我国的相关法律和法规。我们可以采用date()、mt_rand()或者unique()生成随机的文件名。五、判断是否是上传文件文件上传成功时,系统会将上传的临时文件上传到系统的临时目录中。产生一个临时文件。同时会产生临时文件名。我们需要做的事情是将临时文件移动到系统的指定目录中。而移动前不能瞎移动,或者移动错了都是不科学的。移动前我们需要使用相关函数判断上传的文件是不是临时文件。is_uploaded_file()传入一个参数($_FILES中的缓存文件名),判断传入的名称是不是上传文件。六、移动临时文件到指定位置临时文件是真实的临时文件,我们需要将其移动到我们的网站目录下面了。让我们网站目录的数据,其他人可以访问到。我们使用:move_uploaded_file()。这个函数是将上传文件移动到指定位置,并命名。传入两个参数:第一个参数是指定移动的上传文件;第二个参数是指定的文件夹和名称拼接的字符串。9.2 文件上传的步骤- 328 -本文档使用 看云 构建9.3 文件上传表单注意事项我们开始正式的学习如何来上传文件。上传文件必须在网页中准备好一个form表单。这是一个简单的HTML页面表单,form表单为文件内容准备了一个专用的类,当选择的 type=file 时,默认为上传文件内容。我们来看一下表单的代码和注意项单文件上传注意事项:1. form 表单中的参数method 必须为post。若为get是无法进行文件上传的2. enctype须为multipart/form-data9.3 文件上传表单注意事项- 329 -本文档使用 看云 构建9.4 按照数组和步骤完成文件上传form表单提交的文件内容指向了file.php。我们在file.php中,通过PHP代码,来处理上传文件。我们选择一个图片进行上传。假设图片的名字为:psu.jpg,点击上传。PHP为文件类数据准备了一个专用的系统函数$_FILES,上传文件的所有相关数据,都保存在这个系统函数中。在PHP文件中,我们打印 $_FILES ,来观察这个数组的结构:打印出来的结果的数组结构如下:array (size=1)'file' =>array (size=5)//文件名'name' => string 'psu.jpg' (length=7)//文件的mime类型'type' => string 'image/jpeg' (length=10)//缓存文件,上传的图片即保存在这里'tmp_name' => string 'E:\wamp\tmp\phpC32A.tmp' (length=23)//错误码,详见上面错误码介绍'error' => int 0//上传的文件大小'size' => int 225824得到了上面的数组结构。我们就可以开始文件的处理过程了。第一步,判断错误码: 0){switch ($_FILES['file']['error']) { //错误码不为0,即文件上传过程中出现了错误case '1':echo '文件过大';break;case '2':9.4 按照数组和步骤完成文件上传- 330 -本文档使用 看云 构建echo '文件超出指定大小';break;case '3':echo '只有部分文件被上传';break;case '4':echo '文件没有被上传';break;case '6':echo '找不到指定文件夹';break;case '7':echo '文件写入失败';break;default:echo "上传出错";}}else{//错误码为0,即上传成功,可以进行后续处理,处理流程见下文}?>上面的代码详细的介绍了错误码和对应的错误,我们可以根据错误码,来生成准确的错误提示。第二步,判断文件是否超出大小。在实际项目中,由于系统硬件的限制,以及存储设备的限制,不可能让用户无限制的上传文件,所以我们要对用户上传的文件大小进行限制。定义一个合适的限制大小,能让我们的应用更稳定的运行。//判断错误if($_FILES['file']['error'] > 0){//有错误可停止执行}else{//当前上传文件无误,运行本段代码//判断文件是否超出了指定的大小//单位为byte$MAX_FILE_SIZE = 100000;if($_FILES['file']['size'] > $MAX_FILE_SIZE){//判断,如果上传的文件,大小超出了我们给的限制范围,退上传并产生错误提示exit("文件超出指定大小");}将我们指定的文件大小,定义为$MAX_FILE_SIZE,该变量的计数单位为byte,对应上传文件的$_FILES['file']['size']大小。示例代码中,限制大小约为100K及以下的文件。第三步,判断文件的mime类型是否正确。更多的时候,我们的文件上传功能,都需要判断用户上传的文件,是否符合要求,不可用的文件上传以后,对于线上应用的整体展示效果,会造成恶劣的影响。所以我们需要通过mime类型和后缀名,来判断用户上传的文件是否符合要求。下面的示例代码中,我们假设当前的项目需求为指定上传图片,要求上传后缀名为GIF或者jpg的文件,当9.4 按照数组和步骤完成文件上传- 331 -本文档使用 看云 构建用户上传不符合要求的文件时,返回错误提示。/*判断后缀名和MIME类型是否符合指定需求例如:当前项目指定上传后缀为.jpg或.gif的图片,则$allowSuffix = array('jpg','gif');*///定义允许的后缀名数组$myImg = explode('.', $_FILES['file']['name']);/*explode() 将一个字符串用指定的字符切割,并返回一个数组,这里我们将文件名用'.''切割,结果存在$myImg中,文件的后缀名即为数组的最后一个值*/$myImgSuffix = array_pop($myImg);/*根据上传文件名获取文件的后缀名使用in_array()函数,判断上传文件是否符合要求当文件后缀名不在我们允许的范围内时退出上传并返回错误信息*/if(!in_array($myImgSuffix, $allowSuffix)){exit("文件后缀名不符");}/*mime类型和文件后缀名的对应关系,我们可以通过很多途径查询到,为了避免用户自主修改文件后缀名造成文件无法使用。mime类型也必须做出限制检查mime类型,是为了防止上传者直接修改文件后缀名导致文件不可用或上传的文件不符合要求。*///数组内容为允许上传的mime类型$allowMime = array("image/jpg","image/jpeg","image/pjpeg","image/gif");if(!in_array($_FILES['file']['type'], $allowMime)){ //判断上传文件的mime类型是否在允许的范围内exit('文件格式不正确,请检查');//如果不在允许范围内,退出上传并返回错误信息}第四步,生成指定的路径和文件名。按照项目的文件安排,生成文件存储路径,为了避免文件名重复而产生的错误,按照一定的格式,生成一个随机文件名。//指定上传文件夹9.4 按照数组和步骤完成文件上传- 332 -本文档使用 看云 构建$path = "upload/images/";/*根据当前时间生成随机文件名,本行代码是使用当前时间 + 随机一个0-9的数字组合成文件名,后缀即为前面取到的文件后缀名*/$name = date('Y').date('m').date("d").date('H').date('i').date('s').rand(0,9).'.'.$myImgSuffix;第五步,判断是否是上传文件。is_uploaded_file()函数是专用的函数,来判断目标文件是否是上传文件。第六步,移动文件到指定位置。使用move_uploaded_file()函数,将文件移动到指定的位置,并命名。需要注意的是,Linux系统中对目标目录是否有权限及磁盘空间是否足够,否则会导致上传操作失败。/*使用move_uploaded_file()移动上传文件至指定位置,第一个参数为上传文件,第二个参数为我们在前面指定的上传路径和名称。*/if(move_uploaded_file($_FILEs['file']['tmp_name'], $path.$name)){//提示文件上传成功echo "上传成功";}else{/*文件移动失败,检查磁盘是否有足够的空间,或者linux类系统中文件夹是否有足够的操作权限*/echo '上传失败';}}else{echo '不是上传文件';}}?>我们将这个文件片段整理成一整个文件:9.4 按照数组和步骤完成文件上传- 333 -本文档使用 看云 构建 0) {switch ($_FILES['file']['error']) {//错误码不为0,即文件上传过程中出现了错误case '1':echo '文件过大';break;case '2':echo '文件超出指定大小';break;case '3':echo '只有部分文件被上传';break;case '4':echo '文件没有被上传';break;case '6':echo '找不到指定文件夹';break;case '7':echo '文件写入失败';break;default:echo "上传出错";}} else {$MAX_FILE_SIZE = 100000;if ($_FILES['file']['size'] > $MAX_FILE_SIZE) {exit("文件超出指定大小");}$allowSuffix = array('jpg','gif',);$myImg = explode('.', $_FILES['file']['name']);$myImgSuffix = array_pop($myImg);if (!in_array($myImgSuffix, $allowSuffix)) {exit("文件后缀名不符");}$allowMime = array("image/jpg","image/jpeg","image/pjpeg","image/gif",);if (!in_array($_FILES['file']['type'], $allowMime)) {exit('文件格式不正确,请检查');}$path = "upload/images/";$name = date('Y') . date('m') . date("d") . date('H') . date('i') . date('s') . rand(0, 9) . '.' . $myImgSuffix;if (is_uploaded_file($_FILEs['file']['tmp_name'])) {9.4 按照数组和步骤完成文件上传- 334 -本文档使用 看云 构建if (move_uploaded_file($_FILEs['file']['tmp_name'], $path . $name)) {echo "上传成功";} else {echo '上传失败';}} else {echo '不是上传文件';}}?>9.4 按照数组和步骤完成文件上传- 335 -本文档使用 看云 构建9.5 多文件上传介绍了PHP上传单个文件的过程。但是有些时候,为了使用方便,我们需要满足同时上传多个文件的需求。多文件上传原理相同,不过在处理数据时,需要对上传数据进行特殊处理。单文件上传这里是一个简易的上传页面,form表单同时提交了两个文件。我们 可以通过这个页面提交内容。注意:1. input type="file" name="file[]"与之前相比file后多加了一个中括号2. 写了2个或者多个input type="file" name="file[]"我们使用 $_FILES 来接收文件信息,打印并查看数组:数组结构如下array (size=1)'file' =>array (size=5)'name' =>array (size=2)//文件名0 => string 'psu.jpg' (length=7)1 => string 'qwe.jpg' (length=7)//文件mime类型'type' => array (size=2)0 => string 'image/jpeg' (length=10)1 => string 'image/jpeg' (length=10)//缓存文件9.5 多文件上传- 336 -本文档使用 看云 构建'tmp_name' =>array (size=2)0 => string 'E:\wamp\tmp\phpF6D5.tmp' (length=23)1 => string 'E:\wamp\tmp\phpF6F5.tmp' (length=23)//文件错误信息'error' =>array (size=2)0 => int 01 => int 0//文件大小'size' =>array (size=2)0 => int 2258241 => int 151651我们可以看到,两个文件被存储在一个数组中,键名和上传单文件是相同。所以,需要我们用for()循环,来分别取出两个文件的需要用到的数据。在$_FILES中同时保存了两个文件的数据,我们需要使用一个简单的循环,来读取单个文件的信息,并将文件移动到我们想要放的位置。for ($i=0; $i 1234567890,// 上传文件总大小"content_length" => 57343257,//已经处理的大小"bytes_processed" => 453489,//当所有上传处理完成后为TRUE,未完成为false"done" => false,"files" => array(0 => array(//表单中上传框的名字9.6 文件上传进度处理- 339 -本文档使用 看云 构建"field_name" => "file1",//上传文件的名称"name" => "test1.avi",//缓存文件,上传的文件即保存在这里"tmp_name" => "/tmp/phpxxxxxx",//文件上传的错误信息"error" => 0,//是否上传完成,当这个文件处理完成后会变成TRUE"done" => true,//这个文件开始处理时间"start_time" => 1234567890,//这个文件已经处理的大小"bytes_processed" => 57343250,),1 => array("field_name" => "file2","name" => "test2.avi","tmp_name" => NULL,"error" => 0,"done" => false,"start_time" => 1234567899,"bytes_processed" => 54554,),));这个数组详细记录了文件上传的进度,已经处理完的文件状态为true。下面,我们通过一个jQuery的AJAX实例,来学习一下文件上传进度的流程。首先,在表单中,需要添加一个type=hidden 的 input 标签,标签 value 为自定义(建议使用有一定意义的值,因为这个值将要在后台用到)0%这里,添加了一个ID为progress的div,作为展示上传进度的容器。我们通过js的setTimeout(),定时执行ajax来获取文件上传进度,后台文件返回文件上传的进度百分比。9.6 文件上传进度处理- 340 -本文档使用 看云 构建function fetch_progress(){$.get('progress.php',{ '' : 'test'}, function(data){var progress = parseInt(data);$('#progress .label').html(progress + '%');if(progress < 100){setTimeout('fetch_progress()', 100); //当上传进度小于100%时,显示上传百分比}else{$('#progress .label').html('完成!'); //当上传进度等于100%时,显示上传完成}}, 'html');}$('#upload-form').submit(function(){$('#progress').show();setTimeout('fetch_progress()', 100);//每0.1秒执行一次fetch_progress(),查询文件上传进度});上面这段代码,就是通过JQ的ajax,每0.1秒返回一次文件上传进度。并把进度百分比在div 标签中显示。后台代码,需要分为两个部分,upload.php处理上传文件。progress.php 获取session中的上传进度,并返回进度百分比。这里文件上传就不再赘述,详细步骤参见上文,upload.php:主要关注progress.php: 1) {trigger_error("A custom error has been triggered");}?>11.4 自定义错误处理函数- 383 -本文档使用 看云 构建11.4 自定义错误处理函数- 384 -本文档使用 看云 构建12.MySQL 入门MySQL 学习的要点MySQL对于PHP程序员来说就是将业务转化成表结构。做好业务中的增、删、改、查。如果你不知道什么是MySQL我们来介绍一下MySQL吧。MySQL数据库简称MySQL,是一款由瑞典MySQL AB公司开发并且应用广泛的数据管理系统,MySQL数据库因其体积小、速度快、总体拥有成本低受到很多的热捧。现在,MySQL归世界上最著名的数据库企业——Oracle所有。MySQL的应用,在国内的企业包括:百度、阿里、腾讯、新浪、搜狐、网易等等企业,全部都在使用MySQL数据库。MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言--结构化查询语言(SQL)进行数据库管理。由于MySQL是开放源代码的,因此任何人都可以在GPL的许可下下载并根据个性化的需要对其进行修改。MySQL因为其速度、可靠性和适应性而备受关注。大多数人都认为在不需要事务化处理的情况下,MySQL是管理内容最好的选择。PHP与很多数据库结合都很紧密。由于,PHP和MySQL都是开源免费的。所以PHP一直对于MySQL等数据库都有很好的支持。最开始学PHP的时候,通常我们也将数据放在MySQL数据库里面。因此,PHP程序员对于MySQL来说是必学课程。很多朋友在学MySQL的初期,还走了很多不必要的弯路,学了很多原本不需要掌握的知识点,耽误了大量宝贵的学习时间。在最开始学习MySQL的时候,并不需要学习MySQL数据库,学到DBA(数据库管理员)的级别。写过两年代码后。很多朋友会遇到一个瓶颈期。感触最深刻的是:业务代码里面写的最多的就是增、删、改、查。为了帮大家快速学习和入门,我帮大家总结最精华的干货。本章节可以说是一本:《mysql 精华快速入门》。只需要学好这些内容,mysql你就入门了!学好增、删、改、查。写业务我都不怕!12.MySQL 入门- 385 -本文档使用 看云 构建ps:你能想象像新浪、百度、搜狐等。其中的某些大公司使用分库分表和数据库中间件技术后后,有些甚至不准使用到联合查询吗?12.MySQL 入门- 386 -本文档使用 看云 构建12.1 请进入《MySQL入门》我们专门写了一本MySQL入门的书,帮你来学习MySQL《MySQL入门》地址http://mysql.phpxy.com12.1 请进入《MySQL入门》- 387 -本文档使用 看云 构建13. PHP操作mysql数据库通过上一章的学习,我们学习完了MySQL。PHP向MySQL发送数据、PHP操作MySQL数据库是重点中的重点。为大家举一些例子:1. 要注册一个用户,是将表单的数据POST发送给PHP写入数据库2. 购买一个商品,是将商品信息和用户信息通过PHP写入到数据库3. 在线付费,是将用户的充值信息通过PHP写入数据库4. 修改头像上传的头像地址得到后,通过PHP修改数据库里头像字段的值... ...太多太多的应用场景。从网页、移动端、QQ微信公众号都在使用PHP连接数据库进行操作。为了更方便大家的学习,我们将连接数据库的知识进行了步骤化。你会发现,你很轻松的就学会了PHP连接数据库的知识。我们准备的数据库连接的知识,几乎适用于所有的数据库连接的方式。您也可以使用这一套方案和步骤用于PDO,PgSQl等数据库连接函数使用。在正式开始学习前,我们需要开启mysqli扩展,使用phpinof()你可以看到如下展示就说明开启成功:若没有mysqli这个扩展模块。在《10.PHP图像处理》章节跟大家一起学习过,若没有看到mysqli扩展在windows服务器下,打开php.ini文件,将php_mysqli.dll打开即可。注意:13. PHP操作mysql数据库- 388 -本文档使用 看云 构建从PHP7开始默认不再支持mysql扩展,即不再支持mysql_*系列函数。请使用mysqli连接数据库。mysqli即支持php5也支持php7。13. PHP操作mysql数据库- 389 -本文档使用 看云 构建13.1 数据库连接步骤我们为大家将数据库连接整理成了最重要的8个步骤,我戏称它为:“数据库连接天龙八步”。这八个步骤如下,并且将每一步使用的函数都做了说明:第一步: 连接数据库服务器类型 说明函数 mysqli_connect功能 连接到mysql数据库服务器参数1 主机参数2 数据库服务器登陆名参数3 密码参数4 数据库的名称参数5 数据库服务器端口不填默认3306若参数4,数据库名称在此步已填,则不需要再执行第三步。第二步: 判断错误类型 说明函数 mysqli_errno功能 返回连接错误号,无错误返回0参数1 传入mysqli_connect返回的资源类型 说明函数 mysqli_error功能 返回连接错误字符串参数1 传入mysqli_connect返回的资源第三步: 选择数据库类型 说明函数 mysqli_select_db功能 选择本连接中的数据库参数1 传入mysqli_connect返回的资源参数2 需要连接的数据库名若在第一步已填数据库,不需要更换成其他数据库,则不需要执行第三步。13.1 数据库连接步骤- 390 -本文档使用 看云 构建第四步: 设置字符集类型 说明函数 mysqli_set_charset功能 设置与mysql服力器连接,结果,校验字符集参数1 传入mysqli_connect返回的资源参数2 字符集类型更多注意项,请关注本书《13.6 数据显示乱码终极解决方案》第五步: 准备SQL语句其实就是一个SQL语句的字符串。例如:$sql = "insert into user(username,password) values('$username','$password')";我们通常要把变量赋值在SQL语句中使用。可是变量或者SQL语句出错了,非常不好排查。我们根据实际工作经验增加了这一步。如果在执行此步的时候报错了,我们可以把SQL语句打印出来,粘贴到phpMyAdmin或者相关工具中。排错时,如果执行成功就说明不是SQL语句的问题。如果执行失败,请仔细检查SQL语句。第六步: 发送SQL语句类型 说明函数 mysqli_query功能 发送SQL语句参数1 传入mysqli_connect返回的资源参数2 传入发送的SQL语句SQL语句准备完成,需要通过mysqli_query将SQL语句发送给MySQL服务器。MySQL服务器会执行发送过来的SQL语句进行执行。第七步: 判断是否执行正常或者遍历数据读取第6步中,发送的是select类别的语句,通常需要将结果输出显示出来。就需要用到遍历显示数据的函数。类型 说明函数 mysqli_fetch_array13.1 数据库连接步骤- 391 -本文档使用 看云 构建功能 得到result结果集中的数据,返回数组进行便利参数1传入查询出来的结果变量参数2传入MYSQLI_NUM返回索引数组,MYSQLI_ASSOC返回关联数组,MYSQLI_BOTH返回索引和关联类型 说明函数 mysqli_fetch_assoc功能 得到result结果集中的数据,返回关联数组进行便利参数1 传入查询出来的结果变量类型 说明函数 mysqli_fetch_row功能 得到result结果集中的数据,返回索引数组进行便利参数1 传入查询出来的结果变量类型 说明函数 mysqli_fetch_object功能 得到result结果集中的数据,返回对象进行遍历参数1 传入查询出来的结果变量类型 说明函数 mysqli_num_rows功能 返回查询出来的结果总数参数1 传入查询出来的结果变量类型 说明函数 mysqli_num_rows功能 返回查询出来的结果总数参数1 传入查询出来的结果变量注 实际工作中用得非常少,了解写入第6步中,如果发送的是insert的语句,通常需要得到是否执行成功,或者同时拿到自增的ID。类型 说明函数 mysqli_fetch_field功能 遍历数据行13.1 数据库连接步骤- 392 -本文档使用 看云 构建参数1 传入查询出来的结果变量修改和删除第6步中,如果发送的是update和delete类别的语句。只需要判断是否执行成功即可。我们将这些常用函数列出数据表给给大家查看。第八步: 关闭数据库类型 说明函数 mysqli_close功能 关闭数据库连接参数1 传入mysqli_connect返回的资源数据库连接是一个资源类型。我们在之前的章节中讲解资源类型的时候跟大家说过。凡是涉及到数资源类型的有打开就有关闭。这样能够保证PHP更高效的处理和回收资源。因此,数据库连接成功后,不需要使用的时候。我们可以关闭这个连接。其他:显示服务器信息函数类型 说明函数 mysqli_get_server_info功能 返回服务器信息参数1 传入mysqli_connect返回的资源类型 说明函数 mysqli_get_server_version功能 返回服务器版本参数1 传入mysqli_connect返回的资源注意:mysqli只学过程化的方法即可。在面向对象阶段实际工作中完全抛弃了mysqli的对象用法,而是使用的是PDO对象连接数据库的方式。13.1 数据库连接步骤- 393 -本文档使用 看云 构建13.2 通过步骤做一个用户注册我们做一个最简单的注册页面。注册页面中有三个参数:1. 用户名2. 密码3. 重复密码用户写好三个参数后,点击提交的时候向connect.php页面中传入POST记录。我们可以把POST记录处理后写入到MySQL数据库中,即完成了用户注。代码如下:用户名:密码:重复密码:为了更快的表现我们的代码界面没有进行美化。以最快的速度带大家完成用户注册。一、 判断重复密码由于有重复密码,如果用户两次输入的密码不一致也就是有没有进行下一步的任何意义。在网页中很多地方还是使用到了重复密码。因为,害怕的是用户产生手误。将密码填写出错。用户在输入密码的时候可能在左右两边多打两个空格。因此,我们会使用trim将密码和重复密码的两边去掉空格。if(trim($_POST['password']) != trim($_POST['repassword'])){exit('两次密码不一致,请返回上一页');}二、 准备好写入的数据13.2 通过步骤做一个用户注册- 394 -本文档使用 看云 构建我们需要把用户的输入数据和隐藏的数据都写入到数据库。可见数据有:变量 说明$_POST['username'] 用户名$_POST['password'] 密码1. 我们需要把用户名去掉两边的空格,这样避免输入不必要的这些信息。2. 在mysql这一章节我们讲过,用户的密码不要让包括公司内部人员可见。保证密码是不可逆向的。在初级阶段大家学习一下MD5即可。以后我们再教大家其他的加密方式。不可见数据有:变量 说明$time 用户的注册时间$_SERVER['REMOTE_ADDR'] 用户的注册IP1. time返回的unix时间戳2. REMOTE_ADDR返回的是IP地址,我们可以用ip2long将其转为整型存储。$username = trim($_POST['username']);$password = md5(trim($_POST['password']));$time = time();$ip = ip2long($_SERVER['REMOTE_ADDR']);三、连接数据库、判断错误、选择库和字符集1. 我们使用mysqli_connect连接到数据库服务器。2. 如果有错误,使用mysqli_errno得到错误号3. 如何时存在错误mysqli_error打印出所有的错误,并且退出程序执行4. 选择数据库并且设置字符集为utf8.//连接数据库$conn = mysqli_connect('localhost','root','liwenkaihaha');//如果有错误,存在错误号if(mysqli_errno($conn)){echo mysqli_error($conn);13.2 通过步骤做一个用户注册- 395 -本文档使用 看云 构建exit;}mysqli_select_db($conn,'user');mysqli_set_charset($conn,'utf8');四、组合SQL语句我们需要把得到的信息写入到数据库里面去,用户名、密码、创建时间、IP我们都得到了。将对应的变量插入到SQL语句中即可。组合出来的SQL语句如下:$sql = "insert into user(username,password,createtime,createip) values('" . $username . "','" .$password . "','" . $time . "','" . $ip . "')";而我们的创建表的语句如下:CREATE TABLE IF NOT EXISTS user (id int(11) NOT NULL,username varchar(30) NOT NULL,password char(32) NOT NULL,createtime int(11) NOT NULL,createip int(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;表的格式(字段对应说明):| id | username | password | createtime | createip || -- | -- | -- | -- | -- || 用户编号 | 用户名 | 密码 | 创建时间 | 创建IP |五、发送语句,判断状态mysqli_query我们在上面说过,需要传入两个参数:1. 连接的资源,在这里对应的变量是$conn。2. 发送的SQL语句。在上面已经准备好了$sql。SQL语句可以通过mysqli_query发送给MySQL服务器。发送成功$result则为true。否则为false。成功的话,我们就可以提示用户注册成功啦。有些情况下,可能还需要使用到mysqli_insert_id()。在这里把自增的主键ID打印出来。13.2 通过步骤做一个用户注册- 396 -本文档使用 看云 构建大家记住这个知识点,避免以后需要的时候忘记了。mysqli_insert_id应用场景:新加的一个行的数据。我们需要得到自动增长的ID值,将这个ID值插入到另外一个表里面去时。就需要用到这个函数。$result = mysqli_query($conn,$sql);if($result){echo '注册成功';}else{echo '注册失败';}echo '当前用户插入的ID为'.mysqli_insert_id($conn);六、关闭数据库连接将资源变量传到到mysqli_close这个函数里面即可。mysqli_close($conn);用户注册的基本实现代码就写完了。我们上面讲的都是代码片段。我们整实现的connect.php代码如下:13.2 通过步骤做一个用户注册- 398 -本文档使用 看云 构建13.3 通过步骤做一个列表显示上一章我们按照我们的“数据库连接天龙八步”,很顺利的就完成了用户注册。我们来做一个后台的用户列表展示。在实际的管理过程当中,我们通过后台,可以个修改用户的密码和用户的相关资料。在后台需要将所有用户以表格的形式展示出来就是用户列表。一、连接数据库、判断错误和设置字符集连接、错误判断和字符集选择都在上面已经讲过。老规矩,第一步使用mysqli_connect连接数据库。在第一节我们讲过,可以在第四个参数中加上库选择。就可以不用使用mysqli_select_db函数在后面再次选择一个数据库了。返回的类型就是一个连接资源。我们在mysqli_errno、mysqli_error和mysqli_set_charset都要传入资源,才能确定我们操作的是哪个连接。$conn = mysqli_connect('localhost', 'root', 'secret', 'book');if (mysqli_errno($conn)) {mysqli_error($conn);exit;}mysqli_set_charset($conn, 'utf8');二、准备并发送SQL语句我们需要查询的的将候将用户ID,用户名、时间和IP都查出来。并且使用order by id 进行降序排序。按照人的思维人们一般喜欢看最新注册的一批用户。而ID自增,也就是ID在越大,就是时间注册越新的用户。因此我们在写SQL语句的时写上的是order by id desc。$sql = "select id,username,createtime,createip from user order by id desc";$result = mysqli_query($conn, $sql);三、判断结果查询出来的结果只要SQL语句正确结果变量$result就为真。因此,在实现的时候我们需要多加一步判断,不仅判断$result。而且,判断查询出来的行数。查询出来的行数可以使用mysqli_num_rows。这个函数要求传入$result查询的结果变量。如果有结果则显示列表,如果没有结果我们产生一句提示即可。13.3 通过步骤做一个列表显示- 399 -本文档使用 看云 构建代码片段如下:if($result && mysqli_num_rows($result)){//显示列表代码段}else{//提示没有结果的代码段}四、循环显示数据所有结果我们需要使用列表的形式展示出来。表格的行和列和数据表的行和列是一样的。所示展示起来很方便。先声明一个表格,每次循环的时候输出一行。将结果展示到各个列里面。使用到的函数是mysqli_fetch_assoc,返回的会是一个关联数组。这个函数读取一个结果集,会向后移动一次。读取到最后没有结果的时候会返回bool值的false。因此,我们选择while来配合mysqli_fetch_assoc。每次循环的结果赋值给$row,$row中是关联数组。因此我在这次循环中,可以将行和列都显示出来。echo '';while ($row = mysqli_fetch_assoc($result)) {echo '';echo '' . $row['username'] . '';echo '' . date('Y-m-d H:i:s', $row['createtime']) . '';echo '' . long2ip($row['createip']) . '';echo '';}echo '';五、增加编辑和删除控制1. 在删除的时候我们分为单选删除和多选删除。2. 而编辑的时候,我们会选择一个用户我们在上一步的代码中增加几个小东西就在页面中实现了删除和编编。我们来看看实际的效果图,来推理具体的实现过程,效果如下:13.3 通过步骤做一个列表显示- 400 -本文档使用 看云 构建在实现过程当中有几个要点:1. 单选择删除和编辑时需使用get方法传入ID,我们才知道要编辑或者删除的是哪个用户。2. 多选删除时,需要使用传入多个用户。因此,我们可以使用form表单,使用post方法来提交这批用户ID。单选删除我们可以在delete.php后面我们跟上?加上id和值就点击时进行删除请求即可。echo '删除用户';编辑用户也是同理,我们在edit.php加上?写上id和值,点击时就知道是需要编辑的哪个用户了。echo '编辑用户';而多选删除,我们需要使用到html中的checkbox,传入多个用户ID的时候需要在name 后加上id[]。使用form表单将表格包起来,在表格外加上一个submit标签就实现了多选删除。echo '';echo '';echo '';代码如下:echo '';echo '';while ($row = mysqli_fetch_assoc($result)) {echo '';echo '';echo '' . $row['username'] . '';echo '' . date('Y-m-d H:i:s', $row['createtime']) . '';echo '' . long2ip($row['createip']) . '';echo '编辑用户';echo '删除用户';echo '';13.3 通过步骤做一个列表显示- 401 -本文档使用 看云 构建}echo '';echo '';echo '';六、关闭数据库连接我们操作完数据库,关闭掉这个数据库连接。mysqli_close($conn);我们整实现的用户列表list.php代码如下:密码:update.php修改操作用户数据实际上,我们只能够修改用户的密码。有两种情况:1. 用户修改了密码2. 用户没有修改密码13.6 修改用户信息- 414 -本文档使用 看云 构建其实我们可以欺骗前面的不懂技术的普通操作员。1. 如果他没有修改密码,也给他提示成功2. 如果他修改了用户的密码。我们真正的修改掉用户的密码,也提示修改成功。获取用户ID和密码我们实现的过程当中需要获取用户ID。不然update语句生成的时候,没有where条件会将整个表的数据全部修改掉的。密码之前是用md5存储的。因此,用户修改了密码,密码也应该用md5来存储。$id = (int)$_GET['id'];$password = md5(trim($_POST['password']));生成SQL语句将用户ID和密码放至到修改的SQL语句中,发送至MySQL服务器执行。即完成了修改密码的操作。$sql = "update user set password='" . $password . "' where id = $id";$result = mysqli_query($conn, $sql);if ($result) {echo '修改成功';}整体代示演示在form表单中显示用户信息的源代码用户名:13.6 修改用户信息- 415 -本文档使用 看云 构建密码:update.php修改的源代码查看购物车buy.php 此页完成购买功能,然后再次跳转到商品列表。主要是做了在session中处理购买商品操作。14.5 SESSION应用实例- 433 -本文档使用 看云 构建shoppingCart.php 此页展示购物车中的商品、价格、总价等信息。效果图如下:返回商品列表购物车的例子完成了,自己亲自完成一遍后是不是很有成就感!!你很厉害!!14.5 SESSION应用实例- 434 -本文档使用 看云 构建15.通过cURL来做小偷程序微信微博公众号、QQ公众号、地图和很多的第三方功能提供都是采用http 的API(应用程序)形式向开发人员提供的功能。如果你只希望能够做些简单的微信公众号、QQ公众号等小应用,不想再深入学习PHP。学习到本章,你就可以完全掌握微信公众号服务端的的所需知识了。如何请求微信、地图等第三方API呢?这个时候就需要使用到——cURL。cURL中文翻译过来叫做基于URL的函数库。它的主要功能是:使用相关的函数模拟协议请求。例如:1. 模拟表单向某个地址发送数据2. 在无验证码的情况下模拟表单完成用户登陆3. 上传某个文件到远程服务器4. 请求远程服务器提供的某些功能... ...curl支持dict, file, ftp, ftps, gopher, http, https, imap, imaps, ldap, ldaps, pop3, pop3s, rtmp, rtsp,smtp, smtps, telnet和tftp协议。curl同时也支持HTTPS认证、HTTP的POST、HTTP的PUT、FTP上传(这个也能通过PHP的FTP扩展完成)、HTTP基于表单的上传、代理、cookies和用户名+密码的认证。我们在使用过程当中,如果没有cURL基础根本不知道如何开发微信公众号。实际工作中,在cURL使用最多的协议就就是http协议中的get和post请求。其他协议和请求方式用的相对较少。当然,在特定的应用中也有使用。在开发前请保证你已开启cURL模块。开启办法与之前所讲的《PHP图像处理》这一章的开启办法一样,开启的模块名称叫:php_curl.dll。看到下图,就说明你的curl模块开启成功:15.通过cURL来做小偷程序- 435 -本文档使用 看云 构建15.通过cURL来做小偷程序- 436 -本文档使用 看云 构建15.1 curl的使用步骤本书特别新手的一点,是将重要操作的核心思路都为大家提供了。在数据库、图片、文件上传我们都把真正的步骤。以及步骤如何组何成为我们的代码和实现过程都做过讲解。我们将curl的步骤分为以下7步:1. 初使化curl资源2. 参数设置请求的协议地址3. 参数设置是否返回请求结果4. 设置发送数据(无发送数据可不设置)5. 其他的参数信息设置(按实际工作需要决定)6. 执行或执行得到返回结果7. 关闭curl资源我们为了更好的让大家学习和入门,将第2步至第5步本应该归为一步的插成了4个步骤。第二步至第五步本质上,应该统成为curl参数设置。所有curl设置参数设置都是通过curl_setopt都完成curl_setopt这一步最为重要,一切玄妙均在此。curl_setopt这一步完成了包括连接、参数和一切请求的细节设置。要一次性全部看完并理解可能比较困难,所以我们只试一下那些更常用也更有用的选项。我们为了更好的入门。并且在php中我们用的最多的是http请求。因此,我们将一些不需要大家使用到的全部不作讲解。如果感兴趣的朋友可以参考curl_setopt中复杂的参数设置。地址如下:http://php.net/manual/zh/function.curl-setopt.php一、初使化curl资源这只有一句话,就是使用的是curl_init函数。这个参数法面要传入任何参数。返回curl的操作资源。因为,我们在后面是通过curl_setopt向curl的操作资源变量压入数据的。例:$ch = curl_init();15.1 curl的使用步骤- 437 -本文档使用 看云 构建二、参数设置请求的协议地址curl_setopt函数的详细使用如下:类型 说明函数 curl_setopt参数1 curl资源变量参数2 curl参数选项参数3 curl参数值CURLOPT_URL这个参数选项规定了请求的url地址。curl_setopt($ch, CURLOPT_URL, "http://www.phpxy.com");三、参数设置是否返回请求结果我们希望curl请求后返回对应的结果。我们要得到对应的结果,也需要设置一个参数,这个参数名为:CURLOPT_RETURNTRANSFER。若需要返回值即为1。不需请求后返回的结果可设置为0。curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);四、设置发送数据如果是get请求,我们不需要设置发送的参数。在post等请求的时候,我们需要设置发送方法为post方法。并设置发送的数据。CURLOPT_POST 值设为1是使用POST方法,0为不使用POST方法CURLOPT_POSTFIELDS设置传递的数据//声明使用POST方式来进行发送curl_setopt($ch, CURLOPT_POST, 1);//发送什么数据呢curl_setopt($ch, CURLOPT_POSTFIELDS, $data);五、其他的参数信息设置如果是https,有的时候我们需要忽略https的安全证书。15.1 curl的使用步骤- 438 -本文档使用 看云 构建CURLOPT_SSL_VERIFYPEER和CURLOPT_SSL_VERIFYHOST 两个参数改为false即忽略了证书。curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);CURLOPT_HEADER这个参数又决定是是否处理http的头信息,我们不想接收处理的话可将这个值设置为0。curl_setopt($ch, CURLOPT_HEADER, 0);此外,我们还可以设置请求的超时时间,参数为:CURLOPT_TIMEOUT。curl_setopt($ch, CURLOPT_TIMEOUT, 10);其他参数非常多,我们在之前讲过,如果你想了解更多的内容可以访问:地址如下:http://php.net/manual/zh/function.curl-setopt.php六、执行或执行得到返回结果我们第三步中,将CURLOPT_RETURNTRANSFER 参数中将值设为1。如果执行的结果有数据。使用curl_exec执行后,会将结果返回给$output变量。$output = curl_exec($ch);七、关闭curl资源关闭curl资源。因为资源类型,我们反复强调过,有打开就有关闭。如果不需要使用,使用curl_close关闭后立刻释放内存。curl_close($ch);15.1 curl的使用步骤- 439 -本文档使用 看云 构建15.2 自定义get方法抓取网页假设我们使用get方法请求一个网页,得到网页内容后可以匹配出对应的内容。我们可以使用curl封装一个函数,假设函数名就为get。传入url就能请求指定的网页,将指定网页的HTML代码返回回来。代码如下:function get($url) {//初使化curl$ch = curl_init();//请求的url,由形参传入curl_setopt($ch, CURLOPT_URL, $url);//将得到的数据返回curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//不处理头信息curl_setopt($ch, CURLOPT_HEADER, 0);//连接超过10秒超时curl_setopt($ch, CURLOPT_TIMEOUT, 10);//执行curl$output = curl_exec($ch);//关闭资源curl_close($ch);//返回内容return $output;}我们现在使用我们所写的get方法,请求网易的一个列表,将标题和url抓取出来。我们可以先用get方法中传入一个URL。得到这个网址所对应网页的html。网址为新媒体观察网的新闻列表页:http://www.xmtnews.com/events。将红色区域采集下来:15.2 自定义get方法抓取网页- 440 -本文档使用 看云 构建一、得到彩红色区间的html这个区间从下面的HTML代码开始:在以下代码结束:使用preg_match写一个正则表达示就匹配就得到了红色区间的HTML。将匹配到的HTML赋值给变量$area。匹配的正则表达示如下:(.*?)/mis'15.2 自定义get方法抓取网页- 441 -本文档使用 看云 构建二、在红色区域匹配标题和标题的URL我们发现所有的标题都在 标签里面。我们使用preg_match_all写一个正则表达示。preg_match_all('/(.*?)<\/将url和内容匹配出来的内容放置到$find中,将$find数组,打印出来就可以看到匹配的结果了。如果需要,也可以循环读取显示每一行标题和每一行URL。全部代码演示如下:\'\"\$\x7f-\xff]+)\}/s",function($r){return str_replace('\"', '"', '');},$fileContent);$fileContent=preg_replace_callback("/\\\$\{(.+?)\}/is",function($r){return str_replace('\"', '"', '');},$fileContent);$fileContent=preg_replace_callback("/\/is",function($r){return str_replace('\"', '"', '');},$fileContent);$fileContent=preg_replace_callback("/\/is",function($r){return str_replace('\"', '"', '');},$fileContent);$fileContent=preg_replace_callback("/\/is",function($r){return "";},$fileContent);for($i=0; $i<5; ++$i){$fileContent = preg_replace_callback("/\(.+?)\/is",function($r){return str_replace('\"', '"', ''.$r[3].') { ?>'.$r[4].'');},$fileContent);$fileContent = preg_replace_callback("/\(.+?)\/is",function($r)16.6.3 模板引擎讲解- 493 -本文档使用 看云 构建{return str_replace('\"', '"', ''.$r[3].'');},$fileContent);$fileContent = preg_replace_callback("/\(.+?)\/is",function($r){return str_replace('\"', '"', ''.$r[2].'');},$fileContent);}$fileContent = preg_replace_callback("##i",function($r){return '';},$fileContent);file_put_contents($cFile,$fileContent);return true;}如何使用自己的模板引擎?公共文件 /common/common.php 中已经载入了模版引擎函数库,并指定了模板风格;在 /config/config.php 中通过修改 define('TPL_SKIN', 'theme/default'); 的值来,改变应用的模版风格(确保模板风格已经存在)一 创建模板文件时使用的基本语法1 echo 输出变量:{$title}2 if 判断:{if $bigid}...{else}...{/if}3 foreach 循环:{loop $LTsMenu $key $val}{$val['title']}{/loop}16.6.3 模板引擎讲解- 494 -本文档使用 看云 构建4 模版中使用函数${getUserName($val['compere'])}5 include 模板中包含模板:{include header.html}二 使用模板1 分配变量在包含模版前定义的PHP变量,都可以在模版中使用:$title = '首页 - ' . WEB_NAME;2 包含模版文件首先查找是否已经缓存,若未缓存 则替换标签后生成缓存文件。include template("index.html");16.6.3 模板引擎讲解- 495 -本文档使用 看云 构建16.6.4 用户注册、登陆功能讲解注册功能模板所在位置: /theme/default/reg.htmlPHP页面 reg.php需要完成的功能点:1 对输入项要进行魔术转义,防止SQL注入;2 验证邮箱格式;3 验证密码:长度,并校验两次输入是否一致;4 校验数据库中是否存在改用户名;5 校验图片验证码输入是否正确;6 若全部校验通过则创建用户,并自动登录,登陆状态使用 Cookie 记录;7 注册成功,赠送积分;用户登陆PHP页面 login.php需要完成的功能点:1 自动登陆功能,通过设置 Cookie 的过期时间来验证是否使用了自动登陆,有效期为30天。若浏览器 Cookie 被清除则自动失效;2 验证登陆账号是否被管理员从后台锁定;3 记录用户最后登陆时间;'.$Id.' and isdel=0 and first=1','id desc',1);if($top){$topid=$top[0]['id'];}else{$topid=false;}//读取下一条$down = dbSelect('details','id','id<'.$Id.' and isdel=0 and first=1','id desc',1);if($down){$downid = $down[0]['id'];}else{$downid = false;}//读取导航索引$category = dbSelect('category','cid,classname,parentid,compere','parentid0 and cid='.$classId.'','',1);if($category){$smallName = $category[0]['classname'];$smallId = $category[0]['cid'];$BanZhu = $category[0]['compere'];$parentCategory = dbSelect('category','cid,classname','cid='.$category[0]['parentid'].'','',1);if($parentCategory){$bigName=$parentCategory[0]['classname'];$bigId=$parentCategory[0]['cid'];}else{$msg = '非法操作';$url = $_SERVER['HTTP_REFERER'];$style = 'alert_error';$toTime = 3000;include 'notice.php';exit;}}else{$msg = '非法操作';$url = $_SERVER['HTTP_REFERER'];$style = 'alert_error';$toTime = 3000;include 'notice.php';exit;}//读取会员信息16.6.6 回帖功能讲解- 508 -本文档使用 看云 构建$User = dbSelect('user','username,email,udertype,regtime,lasttime,picture,autograph,grade','uid='.$authorid.'','',1);if($User){$U_sername = $User[0]['username'];$E_mail = $User[0]['email'];$U_dertype = $User[0]['udertype'];$R_egtime = formatTime($User[0]['regtime'],false);$L_asttime = formatTime($User[0]['lasttime'],false);$P_icture = $User[0]['picture'];$A_utograph = $User[0]['autograph'];$G_rade = $User[0]['grade'];}//该主题下的所有回复数量$TZCount = dbFuncSelect('details','count(id)','tid='.$Id.' and isdel=0 and first=0');$zCount = $TZCount['count(id)'];$linum = 10;$Lpage = empty($_GET['page'])?1:$_GET['page'];//循环帖子回复信息$select = 't.id as id,t.isdisplay as isdisplay,t.authorid as authorid,t.content as content,t.addtime as addtime,t.addip as addip,t.isdel as isdel,t.elite as elite,u.username as username,u.email as email,u.udertype as udertype,u.regtime as regtime,u.lasttime as lasttime,u.picture as picture,u.autograph as autograph,u.grade as grade';$HTiZi = dbDuoSelect('details as t','user as u',' on t.authorid=u.uid',null,null,$select,'t.tid='.$Id.' and t.isdel=0 and t.first=0','t.id asc', setLimit($linum));$title = $Title.' - '.WEB_NAME;$ggg = 'iPhone 游戏软件分享区';//查找版主或管理员$NBanZhu = explode(',',$BanZhu);if(in_array($_COOKIE['uid'], $NBanZhu)){$GuanLi=true;}else{if($_COOKIE['udertype']){$GuanLi=true;}}//给帖子付款if(!empty($_POST['paysubmit'])){//判断用户是否登录if(!$_COOKIE['uid']){$notice='抱歉,您尚未登录';include 'close.php';exit;}foreach($_POST['oidarr'] as $key=>$val){$nval=explode(',',$val);//将order表中的ispay更新为1$res = dbUpdate('order', 'ispay=1', 'oid='.$key.'');//扣钱$res = dbUpdate('user', 'grade=grade-'.$nval[1].'', 'uid='.$_COOKIE['uid'].'');//给作者加钱$res = dbUpdate('user', 'grade=grade+'.$nval[1].'', 'uid='.$nval[0].'');}16.6.6 回帖功能讲解- 509 -本文档使用 看云 构建header('location:detail.php?id='.$Id);exit;}//删除未购买的帖子if(!empty($_POST['delsubmit'])){//判断用户是否登录if(!$_COOKIE['uid']){$notice='抱歉,您尚未登录';include 'close.php';exit;}$arrOid = array_keys($_POST['oidarr']);$NarrOid = join(',',$arrOid);$result = dbDel('order', 'oid in('.$NarrOid.')');header('location:detail.php?id='.$Id);exit;}//购买帖子,点击及加入订单表if(!empty($_GET['pay'])){//判断用户是否登录if(!$_COOKIE['uid']){$notice='抱歉,您尚未登录';include 'close.php';exit;}//查询订单表中是否有这个购买记录$select = 't.title as title,t.authorid as authorid,o.oid as oid,o.tid as tid,o.uid as uid,o.rate as rate';$IsOrder = dbDuoSelect('order as o','details as t',' on o.tid=t.id',null,null,$select,'o.uid='.$_COOKIE['uid'].' and t.id='.$Id.'','o.oid asc',1);if(!$IsOrder){//如果没有购买记录,加入订单表$Oresult = dbInsert('order', 'uid,tid,rate,addtime,ispay', $_COOKIE['uid'].','.$Id.','.$Rate.','.time().',0');}//读取这个用户还没有付款的记录$OrderList = dbDuoSelect('order as o','details as t',' on o.tid=t.id',null,null,$select,'o.uid='.$_COOKIE['uid'].' and o.ispay=0','o.oid asc');$allpay = dbFuncSelect('order','sum(rate ) as zpay','uid='.$_COOKIE['uid'].' and ispay=0');}//检查当前浏览用户是否已付费$MyOrder = dbSelect('order','*','uid='.$_COOKIE['uid'].' and ispay=1 and tid='.$Id.'','oid asc',1);if($GuanLi){//删除,放入回收站if(!empty($_GET['del'])){$result = dbUpdate('details', "isdel=1", 'id='.$Id.'');header('location:index.php');16.6.6 回帖功能讲解- 510 -本文档使用 看云 构建}//置顶if(!empty($_GET['istop'])){$result = dbUpdate('details', "istop=1", 'id='.$Id.'');header('location:detail.php?id='.$Id);}//高亮if(!empty($_GET['style'])){$result = dbUpdate('details', "style='red'", 'id='.$Id.'');header('location:detail.php?id='.$Id);}//精华if(!empty($_GET['elite'])){$result = dbUpdate('details', "elite=1", 'id='.$Id.'');header('location:detail.php?id='.$Id);}//删除回帖,放入回收站if(!empty($_GET['delht'])){$result = dbUpdate('details', "isdel=1", 'id='.$_GET['hid'].'');header('location:detail.php?id='.$Id);}//回帖置顶if(!empty($_GET['istopht'])){$result = dbUpdate('details', "istop=1", 'id='.$_GET['hid'].'');header('location:detail.php?id='.$Id);}//回帖屏蔽if(!empty($_GET['isdislpay'])){$result = dbUpdate('details', "isdisplay=1", 'id='.$_GET['hid'].'');header('location:detail.php?id='.$Id);}}include template("detail.html");16.6.6 回帖功能讲解- 511 -本文档使用 看云 构建16.6.7 项目安装模块讲解安装功能说明我们在电脑上安装软件的时候,点击下一步调整一些配置选项软件就安装成功了。不需要非常高深的计算机技术即可让普通人完成安装。我们在真正的商业型产品中也需要做完整的安装过程:1. 极为方便普通用户2. 看起来特别专业3. 操作起来简单提高效率我们的PHP的论坛、商城、OA、微信平台都可以做这样的安装包,普通用户下载我们的安装包后。几步就可以开始使用我们的服务。这样对用户和对开发人员都好。安装相关基本概念概念 说明安装目录 通常在install目录下安装锁 通常为install.lock,有这个文件就是安装过,无这个文件就是未安装PHP扩展模块判断mysqli模块没有就无法操作数据库,我们则拒绝用户继续安装目录权限判断我们会写入install.lock或者一些临时文件,若某些目录没有写入修改权限则无法安装成功版本权限判断如果是php4.x版本想安装我们的应用,我们会提醒用户PHP版本太低无法安装超级管理员 初使的最高管理员,可以管理后台,方便用户管理,安装时即设置初始数据库结构初始的数据库我们是将开发的数据库清空后,打开.sql文件,分行执行,向数据库写入创建表的语句和初始信息注:所有的代码文件实例请下载我们的安装包。查看install目录。安装核心步骤说明1. 打开网站。打开网站若不存在install.lock文件则识为未安装2. 存在安装锁文件install.lock则禁止用户执行安装3. 展示安装协议4. 检测操作系统和PHP版本,是否版本准许。若版本不准许则不展示下一步。16.6.7 项目安装模块讲解- 512 -本文档使用 看云 构建5. 判断权限是否具备相关目录的写入权限和PHP的图像、数据库模块权限,若不具备相关权限则不显示下一步。6. 输入服务器地址、数据库信息等配置文件,按照输入的信息连接数据库7. 输入管理员信息8. 将基本信息准备好,导入指定数据库数据表内容9. 导入成功,创建一个空文件install.lockinstall.lock文件判断在/common/common.php文件中有这么一段://项目安装if(!file_exists('install.lock')){header('location:install/index.php');exit;}若文件不存在则跳转至header目录。停止继续向下执行/install/top.php文件中有这一段:if(file_exists('../install.lock')){header('content-type:text/html; charset=utf-8;');exit('网站已经被安装过了,如果需要重新安装网站,请删除 /install.lock 文件');}若存在install.lock文件禁止执行安装步骤。判断版本获得操作系统版本function userOS(){//$user_OSagent = $_SERVER['HTTP_USER_AGENT'];$user_OSagent = PHP_OS;if($user_OSagent){$visitor_os = $user_OSagent;} else {$visitor_os = '其它';}return $visitor_os;16.6.7 项目安装模块讲解- 513 -本文档使用 看云 构建}获得PHP的版本号:echo PHP_VERSION判断目录权限判断目录写入权限的自定义函数:function iswriteable($file){if(is_dir($file)){$dir=$file;if($fp = fopen("$dir/test.txt", 'w')) {fclose($fp);unlink("$dir/test.txt");$writeable = 1;}else{$writeable = 0;}}else{if($fp = fopen($file, 'a+')) {fclose($fp);$writeable = 1;}else {$writeable = 0;}}return $writeable;}判断模块权限:function_exists('mysqli_connect')如果存在相关函数,则存在相关模块。修改配置文件相关代码参考本书:《8.11 修改置文件的实验》数据库导入代码将创建库的SQL语句准备好,创建数据库发送创建数据库的相关命令即可。//执行数据库导入include '../config/database.php';16.6.7 项目安装模块讲解- 514 -本文档使用 看云 构建//新建数据库$link = mysqli_connect(DB_HOST, DB_USER, DB_PASS);if(mysqli_get_server_info($link) > '4.1') {mysqli_query($link, "CREATE DATABASE IF NOT EXISTS `".DB_NAME."` DEFAULT CHARACTER SET ".DB_CHARSET);} else {mysqli_query($link, "CREATE DATABASE IF NOT EXISTS `".DB_NAME."`");}if(mysqli_connect_errno($link)){exit('数据库不存在');}mysqli_close($link);导入数据库打开apple_bbs.sql准备好的SQL文件,这个SQL文件中每一行的行尾以;NoAlike结尾。我们使用explode将sql文件切割成一个数组,循环数组的每一行完成数据的导入。$sql=file_get_contents('apple_bbs.sql');$conn=mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME);if(mysqli_errno($conn)){exit(mysqli_error($conn));}mysqli_set_charset($conn, DB_CHARSET);$arr=explode(';NoAlike;',$sql);foreach($arr as $val){if(!empty($val)){$Nval = str_replace('bbs_', DB_PREFIX, $val);$result = mysqli_query($conn, $Nval);if($result){$sql = '数据库导入成功';}else{$sql = '数据库导入失败';}}}mysqli_close($conn);注:所有的代码文件实例请下载我们的安装包。查看install目录。16.6.7 项目安装模块讲解- 515 -本文档使用 看云 构建附录1. 版权声明版权声明本书的版权归本书的贡献者所有。您可以随意转载和传播,但必须注明来源。来源请声明:《7天学会PHP》。我们保留最终追究的权力。免责声明由于我们是一本开源开放,共同参与写作的书,我们没法做到100%的审核。书中的部份代码和说明,部份贡献者(开发者)如果侵犯了您的权利。请邮件给我们:kaiwenli@phpxy.com我们将在24小时进行删除本书贡献者主要作者: 李文凯参与作者: 聂武 宋艳辉 程龙 李旭光 安正超 荣友元 唐如程欢迎加入我们共同创作本书、提出意见,让更多的初学者受益,让大学和工作迷茫的人,不再迷茫!附录1. 版权声明- 516 -本文档使用 看云 构建附录2 . 学习PHP常用的英文单词HypertextPreprocessorJavahtmlscriptAPIofficewordhtmlwebserverwindowsbacknextcancelfolderchoosesetupinstalladministrator/root/adminfinishstopstartconfiglog/logshelpquitmoduleserviceportExplorerlinuxmacosstudio附录2 . 学习PHP常用的英文单词- 517 -本文档使用 看云 构建zend studioeclipsenotepadnotepadvimgvimdowndownloadcodeinfophpinfodollarvar/variableechointintegerboolboolearnstringtitlefloatdoubleifelsenullresultdumpsetunsetobjectarrayresourcecallbackcallbacktypeisget附录2 . 学习PHP常用的英文单词- 518 -本文档使用 看云 构建numericmixedautocheckdefinelinemethodclassversiondirnamespaceincludeusermytestdemopasswordtextgetpostsubmitvalueinputbodyaddressfilerequestfirefoxbugactionsoftwarecontenthomerolelengthprotocolinterface附录2 . 学习PHP常用的英文单词- 519 -本文档使用 看云 构建statustimeconnectionremoteswitchcasedefaultbreakdatewhilegotogotocounttablecontinuedeclarefunctionpluscookiesessionstaticmatchmaxminrandyearuninxtimezonesecondsminuteshoursdayweekdaymonthmircofirstendtags附录2 . 学习PHP常用的英文单词- 520 -本文档使用 看云 构建replaceencodingpoppushlisteachkeyprevresetcurrentsortregexreadcreatewritemovecopydataexistsclearcacheablelockseekclosegroupownownerpathbasebuildparsediscuzuploadsizelimitmemoryenableddisabled附录2 . 学习PHP常用的英文单词- 521 -本文档使用 看云 构建progresstempdoneerrorfieldstylepngjpeg/jpggifheaderwidthheightasciidisplayreportlevelnoticewarningallcoreSTRICTDEPRECATEDtriggermysqlcommandmonitorororacleCopyrightengineindexcharsetexecutefetchrowassocdbdatabaseedit附录2 . 学习PHP常用的英文单词- 522 -本文档使用 看云 构建deleteupdatealtermodifychangeaddunsignedZEROFILLenumstampunionordergoodsleftrightjoinfrominneroutershopcmssystemmangermoneyaccessagenttokenthreadthread-safethrowvideo附录2 . 学习PHP常用的英文单词- 523 -本文档使用 看云 构建

7天学会PHP
目 录01. 为什么选择本书学习PHP1.1 为什么学习PHP?1.2 PHP是什
3.4.3 自加、自减运算3.4.4 比较运算3.4.5 逻辑运算3.4.6 位运算
6.2 数组的操作6.2.1 数组的计算6.2.2 for循环遍历索引数组6.2.3
还剩 519页未读,点此继续全文在线阅读

免费下载7天学会PHP到电脑,使用更方便!

本文推荐: 7天学会PHP.pdf全文阅读下载  关键词: PHP  
学文库温馨提示:文档由用户自行上传分享,文档预览可能有差异,下载后仅供学习交流,未经上传用户书面授权,请勿作他用。 文档下载资源交流QQ群:317981604
< / 523>

QQ|小黑屋|网站声明|网站地图|学文库 ( 冀ICP备06006432号 )

GMT+8, 2020-7-7 04:02 , Processed in 0.671183 second(s), 4 queries , Gzip On, Redis On.

Powered by 学文库 1.0

Copyright © 2019-2020, 学文库

返回顶部