• 推荐
  • 评论
  • 收藏

PHP自学从入门到精通 核心技术

2021-03-28    5886次浏览

1、PHP语言环境搭建与配置

我们使用PHP进行软件开发,首先要搭建开发PHP的软件环境才可以,一般情况下我们可以搭建如下环境来进行开发或者学习:
  • LAMP(Linux、Apache、MySQL、PHP )
  • LNMP(Linux、Nginx、MySQL、PHP)
  • WAMP/WNMP(Windows、Apache/Nginx、MySQL、PHP)
  • 集成环境管理工具:phpStudy

2、PHP的运行模式与配置

PHP语言发展至今,已经衍生了多种运行模式和配置方式,一般情况下PHP的运行模式可以有一下几种:

运行模式

  • CLI:命令行模式,直接使用php命令在命令行窗口来执行php的文件,比如:php test.php
  • CGI(common gateway interface):公共网关接口,CGI是网页和Web服务器的桥梁,它把网页和Web服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页
  • Fastcgi (fast cgi):CGI的改进版,是一个常驻内存(long-live)型的CGI,它可以一直保留在内存中,如果要使用它,不必每次都要花费时间去创建一个新的进程(这也是CGI特有的 执行完成即关闭:fork-and-execute 模式),
  • PHP的FastCGI进程管理器是PHP-FPM(PHP-FastCGI Process Manager)
  • Mod_php(Web模块模式):将PHP是作为Apache的一个模块来启动的
  • ISAPI模式:微软提供的一个WEB服务API接口,能实现CGI提供的全部功能,并在此基础上进行了扩展

核心配置

  • open_basedir (PHP可访问目录)
  • disable_functions (禁用函数)
  • display_errors 和 error_reporting(PHP错误显示)
  • safe_mode (安全模式):安全模式是PHP内置的的一种安全机制。当safe_mode设置为 on 时,所有文件操作的函数都会受到限制
  • magic_qutoes_sybase(魔术引号自动过滤):过滤$_GET、POST、COOKIE等变量,将单引号转化为双引号
  • magic_qutoes_runtimes(魔术引号自动过滤):过滤从文件或者数据库中提取出来的数据
  • magic_qutoes_gpc(魔术引号自动过滤):在GET、POST、GOOKIE变量中的单引号、双引号、反斜杠以及空字符的前面加上反斜杠(),但并不会过滤$_SERVER变量,导致很多相关的内容,有可能被漏洞利用
  • allow_url_include(是否允许包含远程文件)
  • register_globals(全局变量注册开关):该配置如果设置为“on”,会直接把客户端传的参数注册为全局变量并出示为所传参数的值,如:GET,POST等

3、PHP语言基础

  • 基本语法:类型、变量、常量、表达式、运算符、流程控制、函数、类与对象、命名空间、错误、异常、生成器(yield)、注解、引用
  • 预定义变量:$GLOBALS、$_SERVER、$_GET、$_POST、$_FILES、$_REQUEST、$_SESSION、$_ENV、$_COOKIE、、$php_errormsg、$http_response_header、$argc、$argv
  • 预定义异常类:Exception、ErrorException、Error、ArgumentCountError、ArithmeticError、AssertionError、DivisionByZeroError、CompileError、ParseError、TypeError
  • 预定义接口:Traversable、Iterator、IteratorAggregate、ArrayAccess、Serializable、Closure、Generator 
  • 网络协议上下文(Context)选项和参数(用于所有的文件系统或数据流封装协议): stream_context_create()、stream_context_set_option()、stream_context_set_params()
  • 支持的网络协议:file://、http://、ftp://、php://、zlib://、data://、glob://、phar://、ssh2://、rar://、ogg://、expect://
  • 封装自定义协议:stream_wrapper_register
  • 文件上传处理
  • 掌握Cookie的作用及使用
  • 掌握Session的作用及使用
  • JSON处理

4、使用PHP的断点调试

调试是解决程序出现问题的最好工具与手段,我们在日常开发中经常会遇到程序的结果和逾期的结果不一致,或者直接程序运行就报错,这时候如果不能从代码中看出问题所在的时候,就需要用到PHP的调试工具了,使用调试工具,我们可以让程序一步一步执行,这样就可以观察我们每一行代码的执行结果,就可以很快的查处问题所在。
  • phpdbg:交互式调试器
  • DBG
  • APD
  • Xdebug    

5、PHP中使用正则表达式

软件系统对于数据的处理,其实大部分都是针对字符串的处理,比如:在字符串中查找一个字符串、判断一个字符串在另一个字符串中的位置等等,正则表达式是字符串处理中的一个重要知识点,使用正则表达式,我们可以轻松的对字符串进行任何的操作。
  • PCRE(一个实现了与 perl5 在语法和语义上略有差异的正则表达式模式匹配功能的函数集):preg_match_all、preg_match、preg_replace...

6、使用PHP的扩展(extensions)

说到PHP的扩展(extensions),其实它属于PHP语言架构的组成单元,PHP为了使自身功能不断完善,使用了模块扩展的概念,将一些适用于具体功能的代码块封装为单独的模块,如果开发者使用到了相关的功能的时候,就去加载这个模块,如果应用中使用不到此功能则不用去加载,这样不仅让PHP的运行环境更加简洁,而且使PHP的功能完善更加灵活方便,在不修改核心功能逻辑的情况下,使用扩展就可以灵活的扩展PHP语言的应用能力。
  • 数据库功能支持模块:抽象层(PDO、ODBC),MySQL(PHP操作MySQL数据库的功能实现)、OCI8(PHP操作Oracle数据库的功能实现)
  • GD、ImageMagick:动态图像处理模块
  • Xdebug:跟踪、调试和分析PHP程序的运行状况模块
  • IMAP、POP3、NNTP:邮件处理

7、使用PHP操作数据库

在预备技术中,我们已经要求掌握    数据库基础和SQL 的知识点,就是为了在能在PHP中操作数据库做一个准备,我们使用PHP开发的不管是WEB应用还是桌面应用等,都需要使用到数据,这些数据我们需要将它们存储到数据库中,然后利用数据库的强大功能就可对数据进行各种操作,以此来实现我们应用的功能,PHP操作数据库需要使用到数据库处理的扩展模块,根据我们使用的数据库类型来选择相应的模块进行处理。
  • DBA:Database (dbm-style) Abstraction Layer
  • ODBC:ODBC (Unified)
  • PDO:PHP Data Objects
  • CUBRID
  • DB++
  • dBase
  • filePro
  • Firebird/InterBase
  • FrontBase
  • IBM DB2:IBM DB2, Cloudscape and Apache Derby
  • Ingres:Ingres DBMS, EDBC, and Enterprise Access Gateways
  • MongoDB:MongoDB driver
  • MySQL:MySQL Drivers and Plugins
  • OCI8:Oracle OCI8
  • Paradox:Paradox File Access
  • PostgreSQL
  • SQLite3
  • SQLSRV:Microsoft SQL Server Driver for PHP

8、使用PHP操作文件

文件是操作系统对数据管理采用的一种数据结构,操作系统中数据的最小单元就是文件,一个文件代表了一组数据,早期数据管理的发展过程中,使用文件系统来管理数据也经历很长时间,但是文件系统是一种数据松散的管理方案,对于数据之间的关系只局限于包含关系,如果数据之间的关系负责,那么使用文件就会捉襟见肘,管理起来也会费很大力气,但是文件也有其好的应用方面,使用文件来存储和管理多媒体数据或者文档数据都是一种好的选择,所以我们要学会使用PHP来对文件系统进行操作。在PHP中操作文件的功能,被封装为各种函数来进行实现,如下:
  • 常用函数:basename、chmod、chown、copy、fclose、fgetc、fgets、file_exists、file、fileatime、fopen、fputs、filesize、is_dir、unlink、touch、rename...

9、使用PHP来进行网络底层通信

我们使用的网络被OSI分为七层,其中我们经常使用的HTTP、FTP、Telnet等都属于第七层:应用层协议,对于更为底层的TCP/IP协议来说,
  • Socket扩展模块:socket_accept、socket_addrinfo_bind、socket_addrinfo_connect、socket_bind、socket_close、socket_connect、socket_create、socket_listen、socket_send...
  • Socket通用函数:stream_socket_client()、stream_socket_server()、fsockopen()、pfsockopen()

10、PHP中反射的使用

反射面向对象编程中衍生出来的反向操作对象的技术实现,我们在面向对象编程中,根据类来创建出对象进行功能的实现,但是如果有了对象我们怎么能获取到它的构造信息呢?这就用到了反射的技术,使用反射的思想来获取出这个对象中包含的内容,其实这就是对“对象”进行了更高一层的抽象,用反射对象来抽象描述运行中的对象。
  • Reflection、ReflectionClass、ReflectionClassConstant、ReflectionZendExtension、ReflectionExtension、ReflectionFunction、ReflectionFunctionAbstract、ReflectionMethod、ReflectionNamedType、ReflectionObject、ReflectionParameter、ReflectionProperty、ReflectionType、ReflectionUnionType、ReflectionGenerator、ReflectionReference、Reflector、ReflectionException

11、PHP安全

绝对安全的系统是不存在的,在互联网上存在很多为了成名试图用:输入不正当数据的人,来破坏你的代码、攻击你的网站,无论网站的大小,只要能和互联网连接,就会成为一个目标。很多黑客程序并不理会网站的大小,只会机械地扫描 IP 地址并找寻受害者。所以系统安全的防护对我们来说也是重之又重。
  • 会话(Session)安全
  • 文件系统安全
  • 数据库安全:SQL注入、业务逻辑安全(建议使用视图(view)、触发器(trigger)或者规则(rule)在数据库层面完成)、加密存储模型(在将数据插入数据库之前对其进行加密,并在检索时对其进行解密)
  • 错误报告的处理:生产环境打开、发行环境关闭
  • 数据验证(用户提交的数据)
  • 隐藏PHP显著特性:修改默认的后缀名、隐藏PHP版本信息(expose_php = Off)
  • 使用OAuth授权机制:数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用

12、使用PHP来处理JSON

JSON指的是:JavaScript Object Notation,也就是JavaScript 对象表示法,它是一种组织数据的结构形式,它的定义其实就是JavaScript的对象的定义,只需要按照“键”和“值”的关系进行对应即可,由于它定义结构简单,使用JSON来表示和传输数据都非常简单,现在互联网上绝大部分的API接口返回的数据都已经变成了JSON的格式进行,学习使用PHP来处理JSON格式变得非常重要。
  •  JSON(JavaScript Object Notation):json_decode、json_encode、json_last_error_msg、json_last_error    

13、使用PHP来定义和操作多种数据结构

数据结构我们在 PHP自学从入门到精通-必备知识与基础要求 中提到过,虽然在PHP的应用开发中,我们很少使用到数据结构来组织数据(也有在PHP7之前根本就没有提供处理数据结构的扩展),那是因为我们开发的应用太过于简单或者它的数据逻辑和应用逻辑没有那么强的关联,我们只需要使用数组和对象就可以解决大部分问题了;但是对于某些特殊的应用来说,好的数据结构是关键,所以了解在PHP中如何来创建和操作数据结构也是很有必要的。
  • Collection
  • Hashable
  • Sequence
  • Vector
  • Deque
  • Map
  • Pair
  • Set
  • Stack
  • Queue
  • PriorityQueue

14、使用PHP来加密数据

对重要数据的加密是很有必要的,特别是在互联网上或者信息传输过程中,加密数据可以很好的防止重要信息的泄漏,那么数据加密肯定是要用到加密算法,也就是使用某种编码或者公式将原数据进行变化到其他人无法识别和破解的字符序列。PHP也给我们提供了当今流行的各种加密方法,如下:
  • 通用函数:hash、hash_algos、hash_copy、hash_equals、hash_file、hash_final、hash_hmac_file、hash_init、hash_update_file
  • libmcrypt扩展(加密算法库):DES、3DES、RIJNDAEL、Twofish、IDEA、GOST、CAST-256、ARCFOUR、SERPENT、SAFER+...
  • openssl扩展(非对称加密实现库):openssl_encrypt、openssl_decrypt、openssl_get_md_methods、openssl_pkey_get_private、openssl_pkey_get_public...
  • 密码散列算法:password_algos、password_get_info、password_hash、password_needs_rehash、password_verify

15、使用PHP来国际化应用

国际化其实就是指将自己的应用、设计为可以在国际上任何国家来使用的国际化应用,这样就需要做很多的国际化处理,比如文字显示、日期转换、货币转换等等,PHP已经给我们提供了可以支持我们快速国际化的功能扩展,我们只要掌握他们的使用方法就可以轻松的国际化自己的应用了。
  • gettext扩展:bind_textdomain_codeset、bindtextdomain、dcgettext、dcngettext、dgettext、dngettext、gettext、ngettext、textdomain     
  • intl扩展:Collator、NumberFormatter、Locale、Normalizer、MessageFormatter、IntlCalendar....

16、使用PHP来操作字符编码

字符编码是人操作计算机的桥梁,没有字符编码,则我们无法使用计算机进行工作、娱乐等,计算机本质上都是0101的二进制数据,为了让我们能识别这些二进制数据,需要将二进制编码为我们人类能识别的字符序列:英文、中文等等,不同的字符编码解决了二进制向不同语言的翻译功能。我们有时候在开发的过程中会出现中文乱码的情况,这个时候就是没有将编码设置正确,学会使用PHP来设置和转换字符编码是开发中必要的技能。对于我们处理某些字符串的时候,比如获取字符串长度的时候,需要考虑编码的情况,因为不同的编码使用到的字节数量不同,英文字母使用一个字节就可以来表示所有字母了,但是对于汉语来说表示一个汉字,单纯靠一个字节是不能胜任的,这时候就会用到多字节字符串处理:mbstring扩展了,使用多节字节处理函数就可以正确获取到输入字符串的长度,如果使用普通的字符串长度获取函数:str_len,则获取出来的字符串长度就会有出入。
  • iconv扩展:iconv_get_encoding、iconv_mime_decode_headers、iconv_mime_decode、iconv_mime_encode、iconv_set_encoding、iconv_strlen、iconv_strpos、iconv_strrpos、iconv_substr、iconv、ob_iconv_handler
  • mbstring扩展(多字节字符串处理):mb_check_encoding、mb_convert_encoding、mb_get_info、mb_split、mb_strlen、mb_strpos、mb_strtolower...

17、持续更新中...