PHP 7从零基础到项目实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-30 05:27:17

点击下载

作者:陈小龙

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

PHP 7从零基础到项目实战

PHP 7从零基础到项目实战试读:

前言

2015年6月发布了PHP 7Alpha 1版本,同年12月3日发布了GA版本,PHP 7的发布对于PHP来说具有里程碑的意义。在性能上,PHP 7的执行效率是原来PHP 5的两倍左右。PHP 7的底层架构改变了存储各种变量的Zval和Zend_String结构体,优化了Zend_Array的HashTable等,这些底层架构的改进大幅度提升了PHP的执行效率。

本书的目的是帮助读者快速学习和掌握PHP 7,从最基础的PHP开发环境的搭建开始,逐渐深入到PHP的相关特性和Redis及MySQL等的使用,特别是介绍了ThinkPHP、常见的设计模式、MVC设计思想等,最后还介绍了基本前端架构打造服务端、App后台开发、框架编程等较流行的开发案例,以帮助读者学以致用,真正开启PHP开发之旅。本书结构

本书共分24章,各章内容说明如下:

第1章为走进PHP的世界,介绍PHP的运行机制和PHP 7的新特性,学习搭建PHP的开发环境,并编写第一个PHP程序。

第2章介绍PHP的语言基础,包括PHP的数据类型、变量、常量和运算符的知识。

第3章讲解PHP中的流程控制语句,介绍foreach语句在PHP 7和以往版本中的不同。

第4章介绍函数的使用,包括函数参数的传递方式、可变函数和匿名函数等,与PHP 5不同的是,PHP 7中新增了支持参数类型的声明和函数返回值类型的声明。

第5章详细介绍PHP中的字符串,并着重讲解编程中经常会用到的一些字符串处理函数。

第6章讲解PHP数组有关的内容,和字符串一样,数组也是我们在编程中经常用到的。

第7章讲解PHP中的时间与日期函数,包括如何设置和获取时间、如何计算两个日期的时间差等。

第8章介绍表单。PHP作为一种动态语言,经常需要收集前端用户传过来的数据,然后与数据库交互,表单是用户填写数据、发起与数据库交互的第一步。

第9章是类与对象,介绍什么是类及类的使用。学会使用类封装一些方法,具备面向对象编程的思想,是开发大型网站必不可少的基本功。

第10章介绍正则表达式有关的内容。几乎所有的编程语言都支持正则表达式,本章讲解正则表达式的基本内容以及如何在PHP中使用正则表达式。

第11章介绍PHP中的错误异常处理。PHP 7中增加了错误处理,增加了一个Error类。

第12章介绍如何使用PHP处理图像,如获取图像信息、拷贝旋转图像、给图像加水印等。

第13章是目录文件操作。PHP有着强大的目录文件操作函数,可以使用它们创建、修改、读取文件,还可以改变文件的属性等,另外还介绍了与文件上传有关的配置。

第14章详细讲解Cookie和Session,介绍它们的基本概念和设置,通过实际的案例说明它们的工作原理和存储机制。

第15章介绍MySQL数据库的使用。这一章介绍数据库的安装和MySQL的一些基本操作,以及如何使用PHP与MySQL交互。本章在编写的时候摒弃了PHP 5版本中与MySQL连接的MySQL扩展,转而重点介绍PHP如何使用MySQLi和PDO与数据库交互。

第16章介绍Redis的使用,介绍Redis的5种数据类型,并讲解如何使用PHP操作Redis。

第17章是PHP处理XML和JSON,介绍几种创建与读取XML的方式,以及PHP中json_encode()和json_decode()函数的使用。

第18章介绍MVC思想和国内流行的ThinkPHP框架,本章介绍的是ThinkPHP的最新版本,和以往的版本有许多不同,读者在阅读时需注意。

第19章介绍编程中几种常用的设计模式,包括工厂模式、单例模式、观察者模式和策略模式。

第20章是基于前端架构打造服务端,介绍如何使用API接口与前端交互,传输消息的加解密,另外还介绍了前端开发中常用的模板MustacheJS和AngularJS。

第21章从零开始讲述一个O2O网站的开发流程,从需求分析到数据库设计,再到最后的编码实现,以及如何应用支付模块等。

第22章介绍当今比较流行的混合式App的开发框架,以及如何开发接口程序、如何定义路由等。

第23章讲解如何自己动手实现一个PHP开发框架,介绍框架的开发思想和流程,以及框架的基本概念和基础结构。自己实现一个框架对于理解框架的运行原理有很好的促进作用。

第24章讲述目前大型网站中常用的技术栈,通过这一章的学习,读者可以开阔眼界,对大型复杂的网站系统有更好的了解。读者对象

·PHP初学者

·想了解PHP 7新特性的读者

·想进阶的PHP程序员

·开设相关课程的大专院校学生

·公司内部培训的学员技术支持

在编写本书的过程中,笔者一直努力为读者呈现完整的知识体系结构,但由于本人水平和开发经验有限,书中难免存在不足之处,还望广大读者指正。如果对书中的内容有建议或疑惑,可通过笔者的微信公众号、邮箱或书友群与笔者联系,笔者一定会尽量解答。

微信公众号:chenxiaolong19941024

邮箱:314312298@qq.com

书友群:201463512

本书配套的素材文件下载地址(注意区分数字和字母大小写)如下:

https://github.com/chenxiaolong1994/php7book

如果下载有问题,请发邮件到电子邮箱booksaga@126.com获得帮助,邮件标题为“PHP 7从零基础到项目实战下载资源”。致谢

首先,感谢PHP之父Rasmus Lerdorf,是他创建了这个优秀的编程语言,今天我们在互联网上浏览的网页有许多都是使用PHP编写的。同时希望越来越多的朋友加入到PHP的学习和开发中来,共同将这一优秀的编程语言发扬光大。

其次,感谢王金柱编辑的大力支持,他在本书的编辑和出版过程中付出了很多心血,此书得以与读者见面,离不开他的辛勤工作。

最后,还要感谢家人和朋友的支持,写作本书需要耗费许多时间,使得我不能经常陪伴家人和朋友。陈小龙2018年5月于北京第1章走进PHP的世界

PHP(Hypertext Preprocessor,超文本预处理器)是一种通用开源脚本语言,其语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP独特的语法混合了C、Java、Perl以及PHP自创的语法,它可以比CGI或者Perl更快速地执行动态网页。与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多。PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。

2015年6月,官方发布了PHP 7Alpha 1版本,同年12月3日发布GA版本,PHP 7的发布对于PHP来说是具有里程碑意义的。在性能上,PHP 7的执行效率是原来PHP 5的两倍左右,和HHVM相当。相对于PHP 5.6.x,PHP 7多了以下几个主要的新特性。

·提升性能:PHP 7速度是PHP 5.6的两倍。

·支持64位。

·许多重大错误可以进行异常处理。

·移除了旧的和不支持的SAPIs和扩展。

·null合并操作符(??)。

·结合比较运算符(<=>)。

·标量类型声明。

·匿名类。

当然,PHP 7相对于以前的版本还有很多不同之处,但是大部分是兼容以前版本的,所以大多情况下无须修改代码就可以迁移到PHP 7。1.1 快速认识PHP

本节首先介绍PHP语言的优势、运行机制和原理,以及PHP 7的新特性,帮助读者对PHP有一个初步的认识。1.1.1 PHP语言的优势

PHP语言主要有以下几点优势:(1)PHP学习入门快、开发成本低,语法相对简单,并且提供了丰富的类库,如用于图像处理的GD库、各种加密扩展(如OpenSSL和Mcrypt等),可以很方便地直接使用。很多库默认在安装PHP环境的时候都是自带的。(2)PHP结合Linux、Nginx或Apache、MySQL可以方便快捷地搭建一套系统,PHP还支持直接调用系统命令,这样便可以用代码完成许多操作Linux的工作,如打包压缩、复制粘贴、重命名、执行Linux中grep查询筛选等。Nginx是一个非常优秀的Web服务器软件,Nginx可接收客户端请求,将PHP文件发送给PHP程序执行,Nginx中的PHP采用fastCGI的形式运行脚本。(3)PHP支持使用MySQL、MSSQL、SQLite等多种数据库,其中与MySQL的结合使用最为流行。PHP提供了3种连接MySQL的扩展,包括MySQL扩展、MySQLi扩展和PDO扩展,MySQL扩展在PHP 5.5及以后的版本中不再支持,MySQLi是PHP推出的专门用于链接MySQL的更加安全高效的扩展,并且提供了更高级的一些操作,完全支持面向对象。PDO扩展是PHP推出的链接MySQL和其他类型的数据库的一种统一解决方案,可移植性很高,使用它可以灵活方便地切换不同类型的数据库,而不需变动更多的代码。(4)PHP是解释执行的脚本语言,写完程序以后可以立即执行,不像C、Java、C++等其他语言需要编译再执行,这使得PHP的开发效率更高。(5)PHP中使用到的配置文件相对简单,与PHP运行有关的配置文件常用的有php-fpm.conf和php.ini两个,并且配置参数也简单易懂。更改了PHP的配置文件不需要重新启动即可继续运行,因为PHP每次运行程序前都会主动加在配置文件中,这比Java等其他语言方便多了。(6)PHP作为最流行、使用最为广泛的Web开发语言,有着丰富的生态圈,有许多著名的开源框架可供使用,如官方的Zend Framework、CakePHP、Yaf、Symfony等,开源论坛有Discuz!、PHPwind等,开源博客WordPress,开源网店系统如Ecshop、ShopEx等,开源的SNS系统如UCHome、ThinkSNS等。基于这些优秀的开源系统,你可以方便快速地搭建一套Web站点。另外,活跃的社区氛围也能帮助你快速解决开发中遇到的问题。(7)结合LVS负载均衡、消息队列、数据库主从等技术,PHP能够支持一般大型网站的应用,满足绝大多数场景下的应用开发。(8)PHP本身是由C语言开发的,在一些对性能有严苛要求的情况下,还可以使用C语言编写PHP的扩展来提升程序的执行速度,使用PHP完成主要业务的代码编写,使用C完成性能提升的需求,这使得可以保证软件开发效率的同时兼顾执行效率。在这种对软件开发速度和程序执行性能有极致追求的情况下,如果是其他语言,可能会让你束手无策,或者推倒重来。(9)国内的许多大公司,如百度、淘宝、360等公司都广泛地使用PHP作为开发语言,在具体实践中已经取得了很大成功,有许多成功的经验可供借鉴。1.1.2 PHP的运行机制和原理

PHP由内核Zend引擎和扩展层组成,PHP内核负责处理请求、完成文件流错误处理等操作,Zend引擎可以将PHP程序文件转换成可在虚拟机上运行的机器语言,扩展层提供一些应用层操作需要的函数类库等,比如数组和MySQL数据库的操作等。

Zend引擎是用C语言实现的,将PHP代码通过词法语法解析成可执行的opcode并实现相应的处理方法、基本的数据结构内存分配和管理等,对外提供相应的可供调用的API方法。Zend引擎是PHP的核心,所有的外围功能都是围绕它实现的。扩展层通过组件的方式提供各种基础服务、内置函数,标准库都是通过它实现的。用户也可以编写自己的扩展来实现特定的需求。服务端应用编程接口(Server Application Programming Interface,SAPI),通过一系列钩子函数使得PHP可以和外围交互数据。我们平时编写的PHP程序就是通过不同的SAPI方式得到不同的应用模式,如通过WebServer实现的Web应用和在命令行下运行的脚本等。

一段PHP程序被执行的时候会先被解析成opcode指令,然后在虚拟机中按顺序执行,由于PHP本身是用C语言开发的,所以其在执行的时候调用的都是C的函数。opcode是PHP程序执行的最基本单位。

HashTable是Zend的核心数据结构,实现了PHP里几乎所有的功能,支持key->value查询,添加删除的复杂度是O(1),支持线性遍历和混合类型。在HashTable中既有key->value形式的散列结构,也有双向链表模式,使得它能够非常方便地支持快速查找和线性遍历。Zend的散列结构是典型的hash表模型,通过链表的方式来解决冲突。Zend的HashTable是一个自增长的数据结构,当hash表数目满了之后,其本身会动态地以2倍的方式扩容并重新布置元素位置,初始大小均为8。另外,在进行key->value快速查找的时候,Zend本身还做了一些优化,通过空间换时间的方式加快速度。比如在每个元素中都会用一个变量nKeyLength标识key的长度以做快速判定。Zend HashTable通过一个链表结构实现了元素的线性遍历。理论上,做遍历使用单向链表就够了,使用双向链表的主要目的是为了快速删除链表元素,避免遍历。

PHP是一门弱类型语言,本身不严格区分变量的类型。PHP在声明变量的时候不需要指定类型。PHP在程序运行期间可能进行变量类型的隐式转换。和其他强类型语言一样,程序中也可以进行显式的类型转换。Zval是Zend中另一个非常重要的数据结构,用来标识并实现PHP变量。

Zval主要由以下3部分组成。

·Type 指定了变量所述的类型(整数、字符串、数组等)。

·refcount&is_ref 用来实现引用计数。

·value 是核心部分,存储了变量的实际数据。

Zval用来保存一个变量的实际数据。因为要存储多种类型,所以zval是一个union,也由此实现了弱类型。

引用计数在内存回收、字符串操作等地方使用得非常广泛。PHP中的变量就是引用计数的典型应用。Zval的引用计数通过成员变量is_ref和ref_count实现。通过引用计数,多个变量可以共享同一份数据,避免频繁复制带来的大量消耗。

在进行赋值操作时,Zend将变量指向相同的Zval,同时ref_count++,在unset操作时,对应的ref_count-1。只有ref_count为0时才会真正执行销毁操作。如果是引用赋值,Zend就会修改is_ref为1。

PHP变量通过引用计数实现变量共享数据,当试图写入一个变量时,Zend若发现该变量指向的Zval被多个变量共享,则为其复制一份ref_count为1的Zval,并递减原Zval的refcount,这个过程称为“Zval分离”。可见,只有在有写操作发生时,Zend才进行复制操作,因此也叫copy-on-write(写时复制)。

对于引用型变量,其要求和非引用型相反,引用赋值的变量间必须是捆绑的,修改一个变量就修改了所有捆绑变量。1.1.3 PHP 7的新特性

相较于以前的版本,PHP 7在语言语法层面和底层架构层面都有一些改进。在语法层面的改进主要是增加了一些新特性、移除了一些扩展、改变了错误异常处理等。在底层结构方面,改变了存储各种变量的Zval和Zend_String结构体、优化了Zend Array的HashTable、改进了函数的调用机制等。这些底层结构的改进大幅提升了PHP的执行效率,使得其执行速度比PHP 5高出一倍左右。

PHP是一个弱类型的语言,不过在PHP 7中支持变量类型的定义,引入了一个开关指令declare(strict_type=1);。这个指令一旦开启,就会强制当前文件下的程序遵循严格的函数传参类型和返回类型。不开启strict_type,PHP将会尝试转换成要求的类型;开启之后,PHP不再做类型转换,类型不匹配就会抛出错误。要使用严格模式,一个declare声明指令必须放在文件的顶部。这意味着严格声明标量是基于文件可配的。这个指令不仅影响参数的类型声明,还影响函数的返回值声明。

PHP 7中的新特性主要有以下几点:(1)标量类型声明。(2)函数返回值类型声明。(3)新增null合并运算符。(4)新增组合比较符。(5)支持通过define()定义常量数组。(6)新增支持匿名类。(7)支持Unicode codepoint转译语法。(8)更好的闭包支持。(9)为unserialize()提供过滤。(10)新增加IntlChar类。(11)支持use语句从同一namespace导入类、函数和常量。(12)新增整除函数intdiv()。(13)session_start()支持接收数组参数。

除了以上列举的13点新特性之外,还有其他一些变更,读者可到http://php.net/manual/zh/migration70.new-features.php查看有关PHP 7新特性的详细变更和示例。

另外,在PHP 7中,很多致命错误以及可恢复的致命错误都被转换为异常来处理了。这些异常继承自Error类,此类实现了Throwable接口(所有异常都实现了这个基础接口)。

这也意味着,当发生错误的时候,以前代码中的一些错误处理的代码将无法被触发。因为在PHP 7版本中,已经使用抛出异常的错误处理机制了。(如果代码中没有捕获Error异常,就会引发致命错误)。

在2013年的时候,惠新宸和Dmitry(PHP语言内核开发者之一)就曾经在PHP 5.5的版本上做过一个JIT(Just In Time,即时编译,一种软件优化技术)的尝试。PHP 5.5原来的执行流程是将PHP代码通过词法和语法分析编译成opcode字节码,然后Zend引擎读取这些opcode指令,逐条解析执行。他们在opcode环节后又引入了类型推断(TypeInf),然后通过JIT生成ByteCodes再执行。采用这种技术优化,PHP的效率在实际项目中并没有取得明显的提升,于是他们重新设计了PHP的底层语言结构。Zval是存储PHP中变量的载体,是一个C语言实现的结构体(struct),PHP 5的Zval在内存中占据24个字节,而在PHP 7中优化后的Zval只占16个字节,这样变量的存储变得非常简单和高效。PHP 7优化了数组的HashTable实现,PHP 5的数组存储形式是一个支持双向链表的HashTable,不仅支持通过数组的key来做hash映射访问元素,也能通过foreach以访问双向链表的方式遍历数组元素。当我们通过key值访问一个元素内容的时候,有时需要3次的指针跳跃才能找对需要的内容。最重要的一点是,这些数组元素的存储是分散在各个不同的内存区域的,在CPU读取的时候,因为它们很可能不在同一级缓存中,导致CPU不得不到下级缓存甚至内存区域查找,从而引起CPU缓存命中下降,进而增加更多的耗时。优化后的Zend Array最大的特点是整块的数组元素和hash映射表全部连接在一起,被分配在同一块内存中。如果是遍历一个整型的简单类型数组,效率会非常快,因为数组元素(Bucket)本身是连续分配在同一块内存里的,并且数组元素的Zval会把整型元素存储在内部,也不再有指针外链,全部数据都存储在当前内存区域内。当然,最重要的是它能够避免CPU缓存命中率下降。另外,PHP 7还改进了函数的调用机制,通过优化参数传递的环节减少了一些指令,提高执行效率。1.2 搭建PHP开发环境

对于初学者,推荐在Windows操作系统下使用XAMPP一键安装PHP集成开发环境(Apache、PHP、MySQL),XAMPP提供PHP 7的安装版本,读者只需要到官方网站https://www.apachefriends.org/download.html下载即可。下载界面如图1-1所示。图1-1 XAMPP下载页面

下载后得到一个EXE文件,双击该文件安装。安装完成后,查看该集成环境安装目录,如图1-2所示。图1-2 XAMPP安装目录

双击manager-windows.exe即可打开管理窗口,在Manage Servers选项卡查看MySQL及Apache运行状态,如图1-3所示。图1-3 查看运行状态

应用目录默认位于安装目录的apache2/htdocs目录下,在该目录下新建test.php并编辑其内容:

在浏览器中访问http://localhost/test.php,页面显示如图1-4所示。图1-4 安装成功1.3 常用PHP代码编辑器

下面介绍几个常用的PHP代码编辑器。1.Sublime Text

Sublime是一个超漂亮的跨平台编辑器,速度快并且功能丰富,有很多可供选择的插件,几乎支持所有的编程语言,支持多行选择、高亮显示、代码缩放、键盘绑定、宏、拆分视图等,同时拥有全屏和免打扰模式。它同时支持Linux、Windows和OSX。这个编辑器可以无限期试用,也可以付费购买。2.Notepad++

Notepad++是一款免费又优秀的文本编辑器,支持在Windows环境下运行的多种编程语言。Notepad++支持超过50种编程、脚本和标记语言的语法高亮显示和代码折叠,能让用户迅速减小或扩大代码段,以便查阅整个文档。用户也可以手动设置当前语言,覆盖默认语言。3.Vim

Vim编辑器和其他的代码编辑器不同的是命令行的工作方式。和简单的输入代码不同,你选择输入、选择文字,运行正则表达式的搜索,并且使用更多其他的命令。Vim使用脚本和插件可以变得非常适合扩展,可以支持GUI或者命令行,同时可以支持所有的操作系统。在大多数的Linux系统都预先安装。4.PHPStorm

PHPStorm是一个轻量级且便捷的PHP IDE,旨在提高用户效率,可深刻理解用户的编码,提供智能代码补全,快速导航以及即时错误检查。在PHPStorm里可配置智能的开发环境,VCS支持SVN、Git、Mercurial等,可以连接到数据库,是PHP开发者最常用的编辑软件之一。5.Dreamweaver

Dreamweaver是第一套针对专业网页设计师特别发展的视觉化网页开发工具,利用它可以轻而易举地制作出跨越平台限制和跨越浏览器限制的充满动感的网页。Dreamweaver使用所见即所得的接口,亦有HTML(标准通用标记语言下的一个应用)编辑功能。它有Mac和Windows系统的版本,随Macromedia被Adobe收购后,Adobe也开始计划开发Linux版本的Dreamweaver了。1.4 编写一个“Hello World”PHP程序

上两节学习了安装PHP的开发环境,也介绍了几个常用的代码编辑器,这一节我们就来编写第一个PHP程序。从最经典的“hello world”开始吧,PHP代码如下:

保存以上代码到Apache的应用目录apache2/htdocs并命名为hello.php,打开浏览器,在地址栏输入http://localhost/hello.php,将会在浏览器界面上看到输出的“hello world”字符串。

这种通过浏览器运行PHP代码的方式称为Web模式,Web模式下运行的PHP代码必须以PHP为文件扩展名。如果以另一种命令行即CLI的形式运行PHP脚本,扩展名则无限制。如将以上代码保存为hello.txt,用CLI的模式运行脚本,代码如下: localhost:test chenxiaolong$ php hello.txt hello world

命令行模式下依然正确地输出了“hello world”。但是请注意,无论在何种模式下运行PHP脚本都必须以<?php为开始标记,而结束标记?>不是必需的。第2章PHP语言基础

万丈高楼平地起,学习任何一种新知识都要从基础部分开始。PHP作为一门编程语言,需要学习者充分理解其中的一些基本概念和基础知识,本章将从数据类型、运算符、变量和常量等开始PHP的学习之旅。2.1 PHP的数据类型

数据类型是指对数据的抽象描述,比如“整型数据”就是对所有整数数字的抽象。PHP的数据类型包括String(字符串)、Integer(整型)、Float(浮点型)、Boolean(布尔型)、Array(数组)、Object(对象)、NULL(空值)7种,本节介绍这些数据类型的定义和使用。2.1.1 字符串

一个字符串是一串字符的序列,比如,“Hello world!”。你可以将任何文本放在单引号和双引号中作为字符串来使用,例如: ";                   // 输出换行 $x = 'Hello world!';                  // 使用单引号定义字符串 echo $x;                   // 输出结果 Hello world $x = '陈小龙';                   // 汉字也是字符串类型的数据 echo $x;                   // 输出 陈小龙 ?>2.1.2 整型

整型数据只能包含整数。整型数据的规则是:

·整型数据必须至少有一个数字(0~9)。

·整型数据不能包含逗号或空格。

·整型数据没有小数点。

·整型数据可以是正数或负数。

整型数据可以用3种格式来指定,即十进制、十六进制(以0x为前缀)和八进制(前缀为0)。

在以下实例中我们将测试不同的整型数据。这里使用了PHP的var_dump()函数,该函数可返回变量的数据类型和值。 "; $x = -345; var_dump($x); echo "
"; $x = 0x8C;                   //十六进制数字 var_dump($x); echo "
"; $x = 047;                  //八进制数字 var_dump($x); ?>

以上代码在PHP 5中将输出如下结果:int(5985)int(-345)int(140)int(39)

注意,在PHP 7版本中,含有十六进制字符的字符串不再被视为数字,而是当作普通的字符串,例如:

在PHP 5中将会输出结果:bool(true)bool(true)int(15)。在PHP 7中结果将是:bool(false)bool(false)int(0)。2.1.3 浮点型

浮点型数据既可以用来存储整数,也可以用来存储小数和指数。在以下实例中我们使用浮点型数据来存储小数和指数数值。

执行代码的输出结果为: float(10.365) float(2400) float(8.0E-5)2.1.4 布尔型

布尔型数据只有两个,即True和False,是用来表示“是”和“非”两个概念的数据类型。 $x=true; $y=false;

布尔型变量通常用于条件判断语句中,在后面的章节中会讲到更多关于条件控制语句的详细内容。2.1.5 数组

数组是一组数据的集合,是将数据按照一定规则组织起来形成的一个整体。数组的本质是存储管理和操作一组变量。按照数组的维度划分,可以有一维数组、二维数组和多维数组。请看以下实例: array('Z4','X7') ,"Toyota"); var_dump($cars); ?>

浏览器打印结果如下: array(3) { [0]=> string(5) "Volvo" ["BMW"]=> array(2) { [0]=> string(2) "Z4" [1]=> string(2) "X7" } [1]=> string(6) "Toyota" }

$cars数组的元素中包含字符串和子数组,var_dump()将数组以键值对的形式输出。在输出的结果中可以看到,如果没有赋予某个数组值索引,数组将会默认索引从数字0开始,并以此累加。2.1.6 对象

对象数据类型也可以用于存储数据。在PHP中,对象必须声明。首先,你必须使用class关键字声明类对象。类是可以包含属性和方法的结构。然后在类中定义数据类型,在实例化的类中使用数据类型。实例如下: color = $color; } function get_color() { return $this->color; } } $car = new Car(); $car->set_color('red'); echo $car->get_color(); ?>

在以上代码中,使用class声明一个类对象,该类对象中拥有set_color()和get_color()两个方法,分别可以设置类对象的属性$color的值和读取$color的值。关于类对象的内容将在后面的章节详细讲解。2.1.7 NULL值

NULL值表示变量没有值。NULL是数据类型为NULL的值,指明一个变量是否为空值。同样可用于数据空值和NULL值的区别。可以通过设置变量值为NULL来清空变量数据,请看下面的实例:

执行以上代码将会在浏览器打印NULL。2.2 运算符

运算符是说明特定操作的符号,是构造PHP语言表达式的工具。本节介绍PHP语言常用的运算符及其使用。2.2.1 算术运算符

算术运算符可以对整型和浮点型的数据进行运算。PHP中的算术运算符如表2-1所示。表2-1 算术运算符

下面的示例演示了不同算术运算符的使用。 "; echo ($x - $y); echo "
"; echo ($x * $y); echo "
"; echo ($x / $y); echo "
"; echo ($x % $y); echo "
"; echo intdiv(10,3); ?>

执行以上代码输出结果如下: 13 7 30 3.3333333333333 1 32.2.2 递增递减运算符

递增递减运算符如表2-2所示。表2-2 递增递减运算符

递增递减运算符的使用实例:

执行以上代码在浏览器中的打印结果是: 35692.2.3 比较运算符

比较运算符如表2-3所示。表2-3 比较运算符

比较运算符的使用示例如下: $b); //bool(false) var_dump($a < $b); //bool(true) var_dump($a <> $b); //bool(true) var_dump($a <=> $b); //int(-1) var_dump($b <=> $a); //int(1) var_dump($x <=> $y); //int(0) ?>2.2.4 逻辑运算符

逻辑运算符如表2-4所示。表2-4 逻辑运算符

逻辑运算符的使用示例如下: 2.2.5 三元运算符

三元运算符的语法格式为:(expr1)?(expr2):(expr3)。

当expr1求值结果为true时,上述表达式返回expr2的值,否则返回expr3的值。

可以省略expr2,此时语法格式为:(expr1)?:(expr3)。同样,当expr1求值结果为true时,返回expr1,否则返回expr3。

在PHP 7版本多了一个NULL合并运算符??。例如,(expr1)??(expr2),当expr1不为NULL时返回expr1的值,否则返回expr2的值。

示例如下: 2) 'big' : 'small'; $b = (3>2) : 'small'; $c = (1>2) : 'big'; $d = null2; $e = 52; var_dump($a);                  //string(5) "small" var_dump($b); //bool(true) var_dump($c); //string(3) "big" var_dump($d); //int(2) var_dump($e); //int(5) ?>2.2.6 字符串连接运算符

PHP中使用英文字符“.”将两个或多个字符串连接起来。示例如下:

以上代码的输出结果是: hello world2.2.7 赋值运算符

赋值运算符是把基本赋值运算符(“=”)右边的值给左边的变量或常量,如表2-5所示。表2-5 赋值运算符2.2.8 位运算符

位运算符是指对二进制位从低位到高位对齐后进行运算,如表2-6所示。表2-6 位运算符

位运算符的使用示例如下: "; echo ($a | $b) . "
"; echo ($a ^ $b) . "
"; echo (~$b) . "
"; echo ($a << $b) . "
"; echo ($a >> $b) . "
"; ?>

运行结果如下: 8 15 7 -16 262144 0

在PHP 7中,位移负的位置将会产生异常,左位移超出位数会返回0。例如,echo(1>>-1)程序会报错:Fatal error:Uncaught ArithmeticError:Bit shift by negative number。

代码如下: echo (1 >> 2); echo "
"; echo (-1 >> 2);

打印结果为: 0 -12.3 变量

变量是程序开发中一个非常重要的概念,程序的执行也是对变量操作的过程。本节介绍有关PHP语言中的变量,包括变量的定义、命名规则和变量的作用域。2.3.1 变量的定义

变量用于存储数据,用一个变量名来标示,每创建一个变量,系统就会在内存中为其分配一个存储单元。变量的值可以根据程序运行的需要随时重新赋值。

PHP中变量的命名规则如下:(1)变量以$符号开始,后面跟着变量的名称。(2)变量名必须以字母或者下划线字符开始。(3)变量名只能包含字母、数字字符以及下划线(A~z、0~9和_)。(4)变量名不能包含空格。(5)变量名是区分大小写的($y和$Y是两个不同的变量)。

PHP是一种弱类型的语言,在创建变量时无须指定变量类型,PHP会根据变量的值自动将其设定为对应的数据类型。我们可以用赋值符“=”创建变量,例如: $x = 'hello world'; //创建了一个x变量2.3.2 变量的作用域

变量的作用域是脚本中变量可被引用/使用的部分。PHP有4种不同的变量作用域:local、global、static、parameter。

在所有函数外部定义的变量拥有全局作用域,此变量称为全局变量。全局变量可以被脚本中的任何部分直接使用变量名称访问,但是要在一个函数定义体中访问一个全局变量,需要使用global关键字。

在PHP函数内部声明的变量是局部变量,仅能在函数内部访问。下面通过示例来说明局部变量和全局变量的使用。 $x=5; // 全局变量 function myTest() { $y=10; echo "

Test variables inside the function:

"; echo "Variable x is:" . $x; echo "
"; echo "Variable y is: $y"; } myTest(); echo "

Test variables outside the function:

"; echo "Variable x is:" . $x; echo "
"; echo "Variable y is: $y";

执行以上代码,浏览器打印结果如下: Test variables inside the function: Variable x is: Variable y is: 10 Test variables outside the function: Variable x is:5 Variable y is: 10

因为$x是在函数外部定义的,所以在函数内部无法访问$x;$y是在函数内部定义的,所以在外部也访问不到。如果要在函数内部访问$x,就必须在函数内先使用global,示例如下: $x = 2; function test(){                   global $x;                   echo $x; } test();

执行以上代码,浏览器将会正确打印出$x的值为2,因为在函数内部使用了global。在PHP中,全局变量存储在$GLOBALS[index]中,index表示变量名。要达到上述例子中同样的效果,也可以这样写代码: $x = 2; function test(){                   echo $GLOBALS['x']; } test();

当一个函数完成时,它的所有变量通常都会被删除。如果想让函数执行完毕时函数内的局部变量保留,可以使用static关键词。代码如下: function myTest() { static $x=0; echo $x; $x++; } myTest(); myTest(); myTest();

这样当每次执行myTest()函数的时候,$x变量都会保存上一次调用时的值。上述代码的运行结果为:012。

在函数里还有一个参数作用域,即传递给函数的参数,参数在函数声明时即声明。 function test($x){ echo $x; } test(5);

另外,变量中还有可变变量一说。可变变量允许动态地改变一个变量的名称。可以在变量的前面再加一个“$”来实现可变变量,示例如下:

执行以上代码将会在浏览器中打印bb,这时的$$a值其实就是$aa的值。2.4 常量

常量是指在脚本执行期间不能改变值的量。PHP语言中常量大小写是敏感的,习惯上常量的命名总是大写的这一点请在使用时注意。2.4.1 常量的声明

合法的常量名以字母或下划线开始,后面可跟任何字母、数字或下划线。

可以使用define()来定义常量,在PHP 5.3.0以后也可使用const关键词在类定义之外定义常量。常量只能是标量数据(boolean、integer、float、string),也可以定义资源类型(resource)常量,但是应该尽量避免,因为这会造成不可预料的结果。

常量命名示例如下:

常量的作用域是全局的,即在脚本的任何地方都可以使用已经定义的常量。

·常量和变量有如下不同:

·常量前面没有美元符号($)。

·常量只能用define()和const定义。

·常量的作用域是全局的。

·常量一旦被定义就不能被重新定义或者取消定义。

·常量的值一般是标量。2.4.2 预定义常量

PHP中有很多预定义常量,也称作魔术常量,其中很多都是由不同的扩展库定义的,只有在加载了这些库时才会出现。几个常见的PHP魔术常量如表2-7所示。表2-7 PHP中常见的魔术常量

在PHP 7中新增了以下常量: PHP_INT_MIN PREG_JIT_STACKLIMIT_ERROR ZLIB_NO_FLUSH ZLIB_PARTIAL_FLUSH ZLIB_SYNC_FLUSH ZLIB_FULL_FLUSH ZLIB_BLOCK ZLIB_FINISH

打印以上常量: echo PHP_INT_MIN;echo "
"; echo ZLIB_NO_FLUSH;echo "
"; echo ZLIB_PARTIAL_FLUSH;echo "
"; echo ZLIB_SYNC_FLUSH;echo "
"; echo ZLIB_FULL_FLUSH;echo "
"; echo ZLIB_FINISH;echo "
"; echo ZLIB_BLOCK;echo "
"; echo PREG_JIT_STACKLIMIT_ERROR;echo "
";

输出结果是: -9223372036854775808 0 1 2 3 5 4 6第3章流程控制语句

默认情况下,代码的执行顺序是从上往下一行一行执行的,而流程控制语句完成了许多顺序执行方法不能完成的操作。它能对一些条件做出判断,进而选择不同的语句块执行。3.1 条件控制语句

条件控制语句有两个,一个是if条件控制语句,另一个是switch条件控制语句。3.1.1 if条件控制语句

PHP和C语言有着类似的if语句结构,其使用格式如下:

expr按照布尔求值,如果expr为True,就执行statement_1(此处表示代码块),否则执行statement_2。

请看以下示例: 1){                   echo 'right'; } else {                   echo "incorrect"; } ?>

执行上述代码将会打印出“right”。

当有多个条件需要判断时,可以使用else if语句继续添加条件。使用格式如下:

具体示例代码如下: =5 && $a<10) {                   echo "\$a is greater than or equal 5,but less than 10"; } else if($a>=10 && $a<20) {                   echo "\$a is greater than or equal 10,but less than 20"; } else if($a>=20 && $a<30){                   echo "\$a is greater than or equal 20,but less than 30"; } else {                   echo "\$a is greater than or equal 30"; } ?>

执行以上代码将会打印出以下语句: $a is greater than or equal 20,but less than 303.1.2 switch分支语句

switch语句类似具有多个判断条件的if语句。switch语句将一个变量或表达式与很多不同的值比较,根据它等于哪个值来选择执行不同的代码。switch语句的语法如下: switch (expr) {                   case expr1:                   statement_1;                   break;                   case expr2:                   statement_2;                   break;                   case expr3:                   statement_3;                   break;                   case expr4:                   statement_4;                   break;                   default:                   statement_default;                   break; }

PHP会将expr中的值与expr1、expr2、expr3、expr4的值进行比较,若与其中一个值相等,则对应执行其下的代码块,否则执行default后的代码。在每个代码块后面加上break是为了阻止执行完本部分代码之后继续向下执行。一个关于switch语句的实例如下:

执行以上代码的结果是: $a is 3

如果没有在代码块中加入break,执行结果将会是:$a is 3$a is 4$a is 5$a is not equal 1,2,3,4,5。代码会执行完case 3后面的全部语句,直到遇到break或者文件结果。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载