Welcome目前网络上充斥着大量的陈旧信息,让PHP新手误入歧途,传播着错误的实践和糟糕的代码,这必须得到纠正。PHP之道网站的目标就是搜集PHP最佳实践、编码规范和网络上的权威学习指南,给PHP学习者提供一个易于阅读,快速查找的入口。 翻译PHP之道已经翻译成多种语言: 免责声明PHP没有规范化的使用方式,本网站只是展示业界的最佳实践、可用的选项和有用的信息,目的是帮助PHP新手,并对以往的经验进行反思。 本文档会随着相关技术的发展,持续更新其中的信息和示例。 如何参与网站建设参与我们,让这个网站成为PHP开发者的最好学习资源!去GitHub参与建设网站 推广网站PHP之道 有多个banner宣传图片可以放在你的站点上显示,让更多开发者知道这个网站,找到权威的学习资料! Getting Started使用当前稳定版本 (5.4)如果你刚开始学习PHP,请使用最新稳定版本 PHP 5.4. PHP近年来有了巨大的改进,增加了许多强大的 新特性。不要让低版本的PHP如5.2的缺陷误导你,这些新特性是对旧版本的重要改进。如果 你想查找一个函数及其用法,可以去官方PHP手册php.net查找。 内置的Web服务器有了它,你可以不用安装和配置功能齐全的Web服务器,就可以开始学习PHP(要求PHP 5.4版本)。要启动内置Web服务器,需要从你的命令行终端进入项目的Web根目录,执行下面的命令:
Mac 安装OSX系统会预装PHP,只是版本比最新稳定版低一点。 目前Lion下是PHP 5.3.6,Mountain Lion下是5.3.10. 要更新OSX中的PHP,你可以通过那些Mac包管理器来安装,推荐使用php-osx by Liip。 另外一种方式是自己编译,不过要确认已经安装Xcode或“Command Line Tools for Xcode”,它们可以 从Apple的Mac Developer Center下载。 如果想安装包含了PHP、Apache和MySQL的一键安装包,可以试试MAMP,里面包含了相应的图形管理工具。 Windows 安装Windows下有多种方式来安装PHP,你可以下载二进制安装包。 若只是本地开发和学习,可以直接使用PHP 5.4内置的Web服务器,还能省去配置服务器的麻烦。如果你喜欢包含PHP、Apache和MySQL的 一键安装包,可以下载Web Platform Installer、Zend Server CE、XAMPP或WAMP,它们可以帮你快速搭建出PHP运行环境。 不过这些工具和你产品的正式运行环境会有一些差别,特别是你在Windows下开发,而代码最终部署在Linux服务器上的时候。 如果你需要把产品部署在Windows上,那么IIS7将给你最稳定和性能最佳的环境,你可以使用phpmanager(IIS7下的PHP 管理插件)来配置和管理PHP。IIS7已经内置FastCGI,你只需把PHP配置为它的处理器即可。更多详情可以参考dedicated area on iis.net。 Vagrant如果你在开发应用和发布应用的时候采用了不同的环境,那么在正式使用时,应用可能出现许多奇怪的BUG。如果你是在开发团队里工作,那么保证各位的开发环境和所有的库文件都是最新的并且处在同一版本,会是件更麻烦的事。 如果你在Windows平台开发并准备部署到Linux(或其他非Windows的平台)上,或者你是在开发团队里工作,那你应该考虑用个虚拟机。这虽然听起来挺麻烦,但是 Vagrant这个程序可以辅助你用几步就创建一个简单的虚拟机。 接下来,你可以手动配置这些基础的环境,或者你可以找个部署软件来替你完成这些事情,比如说Puppet或Chef。部署个基础环境,能很好地保证大家的开发环境建立的方式都大致相似,而且还能省去你维护那些复杂的“安装命令”列表的麻烦。 你也可以轻易地毁掉现有的基础环境后再做一个新的出来,这样你就能有一个全新的环境。 Vagrant会创建一些共享文件夹,用来给你在主机和虚拟机之间共享代码用。也就是说,你可以在主机上写好程序,然后在虚拟机中运行。 代码风格指南PHP社区百花齐放,拥有大量的函数库、框架和组件。PHP开发者通常会在自己的项目中使用若干个外部库,因而PHP代码遵循或尽量接近 同一个代码风格就非常重要,可以让开发者方便地把多个代码库集成在自己的项目中。 框架互操作组(即PHP标准组)发布了一系列代码风格推荐标准,即PSR-0,PSR-1,PSR-2和PSR-3。 不要让这些名称所混淆,这些推荐仅是一些被其它项目所遵循的规则,如Drupal, Zend, Symfony, CakePHP, phpBB, AWS SDK, FuelPHP, Lithium等,你可以把这些规则用在自己的项目中,或者继续使用你自己的风格。 通常情况下,你的PHP代码应该遵循其中一项或多项标准,从而其他开发者可以方便地阅读和使用你的代码。这些标准都是在前一个标准 上附加新的规则,所以使用PSR-1就同时要求遵循PSR-0,但可以不遵循PSR-2。 可以使用PHP_CodeSniffer来检查代码是否符合这些标准,文本编辑器插件Sublime Text 2还能 提供实时检查。如果不符合规范,可以使用Fabien Potencier提供的工 具PHP Coding Standards Fixer自动修复,不用自己手工修复。 变量名和代码结构建议使用英文符号编写,注释则可以使用各种语言,没有限制。 Language Highlights编程范式PHP是一个灵活的动态语言,支持多种编程范式。这些年来一直在不断的进化,重要的里程碑包括PHP 5.0 (2004)增加完善的 面向对象模型、PHP 5.3 (2009)增加匿名函数和命名空间和PHP 5.4 (2012)增加traits. 面向对象编程PHP具有完整的面向对象编程特性,如类、抽象类、接口、继承、构造函数、克隆和异常等。 函数式编程PHP支持第一类函数(first-class function),即函数可以赋值给变量,包括用户自定义的函数和内置函数,然后动态调用它。 函数可以作为参数传递给其他函数(即高阶函数),也可以作为函数返回值返回。 PHP支持函数递归调用,即函数自己调用自己,不过在实际的PHP代码中,我们更喜欢用迭代来代替递归。 2009年发布的PHP 5.3开始引入支持闭包的匿名函数。 PHP 5.4支持把闭包绑定到对象作用域,并改善其可调用性,从而可以在大部分场景中使用匿名函数替代普通函数。
元编程PHP通过反射API和魔术方法机制,支持多种方式的元编程。开发者通过魔术方法,如 命名空间如前所述,PHP社区的众多开发者已经开发了大量的代码。这意味着一个函数库中的PHP代码可能使用了另外一个库中相同的类名,如果它们共享一个命名空间,则会产生冲突导致异常。 命名空间解决了这个问题。如PHP手册里描述的那样,命名空间类似于操作系统中的目录,两个同名文件可以共存于不同的目录。同理,同名的PHP类可以在不同的PHP命名空间下共存,就这么简单。 因而把代码放在自己的命名空间下就显得非常必要,这样其他人就可以放心的使用这些代码,而无需担心与其他函数库的命名冲突。 PSR-0 里提供了命名空间的推荐使用方式, 它试图提供一个标准的文件、类和命名空间的使用惯例,从而让代码做到即插即用。 标准PHP库标准PHP库(SPL)和PHP一起发布,提供了一组类和接口,包括了常用的数据结构如栈,队列和堆等,以及遍历这些数据结构的迭代器, 或者你还可以自己实现SPL接口。 命令行接口PHP的主要目的是开发Web应用,不过它的命令行脚本接口(CLI)也非常有用。PHP命令行编程可以帮你完成自动化的任务,如测试,部署和 应用管理。 CLI PHP编程非常强大,可以直接调用你自己的app代码而无需创建Web图像界面,需要注意的是不要把CLI PHP脚本放在公开的web目录下! 在命令行下运行PHP:
选项 选项 接下来写一个简单的”Hello, $name” CLI程序,先创建名为
PHP会在脚本运行时根据参数创建两个特殊的变量, 命令运行失败时,可以通过 运行上面的脚本,在命令行输入:
XDebug调试器是软件开发过程中非常重要的一个工具,通过它,可以跟踪代码的执行过程,查看堆栈信息。XDebug是一个PHP调试器,可以集成在常见的IDE中,提供设置断点、 查看堆栈信息等功能,还可以和PHPUnit、KCacheGrind等工具配合,执行代码覆盖率测试和性能调优。 如果你现在还没有使用调试器,仅仅依靠var_dump/print_r调试的话,XDebug就是你的最佳选择。 安装XDebug有点复杂,其中一个重要功能”远程调试”——如果你在本地开发代码,然后在虚拟机或其他主机中测试,那么它对你就非常有用。 通常,你需要修改Apache虚拟主机或者.htaccess配置文件,增加:
“remote host”和”remote port”对应本机IDE的监听地址和端口,然后设置IDE为”等待连接”模式,打开URL:
这样IDE就会监控脚本的执行,允许用户设置断点和查看内存中的变量值。 依赖管理如今有大量的PHP函数库、框架和组件可供选择,一个项目中可能会使用其中的若干——这就是项目的依赖。到目前为止,PHP还没有有效的 项目依赖管理方案。即使你手工的管理它们,你还不得不处理它们的自动加载问题。 目前主要有两个PHP包管理系统:Composer和PEAR,哪个适合你呢?答案是两个都需要。
通常情况下,Composer包只在你项目中明确指定时才可用,而PEAR包在所有的PHP项目中可用。尽管PEAR听起来似乎更简单,但是根据每个 项目制定方案可能更合适。 Composer and PackagistComposer是一个出色的PHP依赖管理器,把项目的依赖列在 现在已经有很多PHP库支持Composer,可以在项目中使用它们,具体列表可以点击查看,这是官方支持的Composer兼容的PHP库。 如何安装ComposerComposer可以安装在本地(在当前工作目录,不推荐这种方式),也可以安装在系统中(如/usr/local/bin)。假设你要在本地安装,在 项目的根目录执行:
它会下载 如何手动安装Composer手动安装composer有点麻烦,不过很多开发者可能更喜欢这种安装方式。使用交互式安装程序,它会检查你安装的PHP:
而手动安装则需要你自己做这些事情,你必须自己权衡利弊,以决定是否手动安装。下面是手动获取Composer的方法:
目录 这样文档中描述的运行Composer的命令
如何定义和安装依赖Composer通过文件
或者通过
最后在应用的PHP入口文件添加下面代码,告诉PHP使用Composer自动加载器加载项目的依赖库:
现在你就可以使用项目依赖的库了,它们会在需要的时候自动加载。 Updating your dependenciesComposer creates a file called This is most useful when you define your version requirements flexibly. For instance a version requirement of ~1.8 means “anything newer than 1.8.0, but less than 2.0.x-dev”. You can also use the Update NotificationsTo receive notifications about new version releases you can sign up for VersionEye, a web service that can monitor your GitHub and BitBucket accounts for Checking your dependencies for security issuesThe Security Advisories Checker is a web service and a command-line tool, both will examine your PEAR另外一个常用的包管理器就是很多PHP开发者喜欢的PEAR,它的运行方式和Composer有些类似,但是也有一些区别. PEAR requires each package to have a specific structure, which means that the author of the package must prepare it for usage with PEAR. Using a project which was not prepared to work with PEAR is not possible. PEAR installs packages globally, which means after installing them once they are available to all projects on that server. This can be good if many projects rely on the same package with the same version but might lead to problems if version conflicts between two projects arise. How to install PEARYou can install PEAR by downloading the phar installer and executing it. The PEAR documentation has detailed install instructions for every operating system. If you are using Linux, you can also have a look at your distribution package manager. Debian and Ubuntu for example have a apt How to install a packageIf the package is listed on the PEAR packages list, you can install it by specifying the official name:
If the package is hosted on another channel, you need to Coding Practices基础知识PHP是一个伟大的语言,可以让各个层次的程序员都能够快速高效地完成编码任务。虽然如此,我们还是经常会因为临时救急或者 坏习惯而忽视了PHP的基础。为了解决这个问题,这部分专门给开发者回顾一下PHP的基础编码实践。
日期和时间PHP使用DateTime类完成读取、设置、比较和计算日期与时间。虽然PHP中有很多日期和时间处理相关的函数,但是DateTime类提供了 完善的面向对象接口完成各项常见操作,而且还能处理时区,这里不作深入介绍。 要使用DateTime,可以用工厂方法
DateTime计算时间时通常需要DateInterval类,如
DateTime对象之间可以直接比较:
最后一个例子是DatePeriod类的用法,它用于循环事项(recurring events)的迭代。它的构造函数参数为:start和end,均为 DateTime对象,以及返回事项的间隔周期。
|