現(xiàn)在寫(xiě) PHP,你應(yīng)該知道這些
首先你應(yīng)該是在用 PHP 5.3 以上的版本,如果 PHP 版本在這之下,是時(shí)候該升級(jí)了。我建議如果有條件,最好使用最新的版本。
你應(yīng)該看過(guò) PHP The Right Way,這篇文章包含了很多內(nèi)容,而且還能再擴(kuò)展開(kāi)。大部分的名詞和概念你都需要了解。
The idea behind the group is for project representatives to talk about the commonalities between our projects and find ways we can work together.
在之前的文章中以及跟同事交流的過(guò)程中我多次提到過(guò) PSR(PHP Standard Recommendation)。很多人以為 PSR 只是做一些規(guī)范代碼風(fēng)格等無(wú)關(guān)痛癢的事情,但其實(shí)遠(yuǎn)不止此。
PSR 的一系列標(biāo)準(zhǔn)文檔由 php-fig (PHP Framework Interop Group)起草和投票決議,投票成員中有一些主流框架和擴(kuò)展的作者,包括 Laravel、Symfony、Yii等等。
按照其官網(wǎng)的說(shuō)法,這個(gè)組織的目的并不是告訴你你應(yīng)該怎么做,只是一些主流的框架之間相互協(xié)商和約定。但是我相信這些框架和擴(kuò)展中總會(huì)有你用到的。
PSR 目前通過(guò)的共有 6 份文檔:
0:自動(dòng)加載(主要是針對(duì) PHP 5.3 以前沒(méi)有命名空間的版本)1:編碼規(guī)范2:編碼風(fēng)格推薦3:Log 結(jié)果4:自動(dòng)加載更細(xì)(在出現(xiàn)命名空間后有很大的改變)7:HTTP 消息接口目前在起草(Draft)中的還有 PSR-5(PHPDoc Standard)、PSR-6(Cache)等。5 和 6 沒(méi)有出現(xiàn)在以上的列表中,是因?yàn)檫€沒(méi)有投票通過(guò)。
我相信隨著標(biāo)準(zhǔn)的不斷更新,你會(huì)發(fā)現(xiàn)研究這些約定對(duì)你也是很有裨益的,雖然未必什么都要遵守。
Nobody in the group wants to tell you, as a programmer, how to build your application.
2. ComposerComposer is a tool for dependency management in PHP. It allows you to declare the libraries your project depends on and it will manage (install/update) them for you.
composer 和 Pear、Pecl 都不同,它不僅僅是用于安裝擴(kuò)展,更重要的是定義了一種現(xiàn)代 PHP 框架的實(shí)現(xiàn)和擴(kuò)展管理的方法。類(lèi)似 node.js 的 npm、Python 的 pip 但又比以上做的更多。
composer 的核心是實(shí)現(xiàn)擴(kuò)展的標(biāo)準(zhǔn)安裝和類(lèi)的自動(dòng)加載。通過(guò) packagist.org 這個(gè)平臺(tái),無(wú)數(shù)的擴(kuò)展組件可以被很方便的引入,目前比較知名的 PHP 擴(kuò)展都可以通過(guò) composer 安裝了。而調(diào)用僅僅只需要加載一個(gè) autoload.php 的文件即可。
composer 是通過(guò) spl_autoload_register 方法注冊(cè)一個(gè)自動(dòng)加載方法實(shí)現(xiàn)擴(kuò)展類(lèi)和文件的加載的,當(dāng)然這中間 composer 也做了一個(gè)優(yōu)化。
我們都知道 PHP 引入文件要通過(guò) include 和 require 實(shí)現(xiàn),這其實(shí)寫(xiě)起來(lái)并不好看。 PHP 5.3 提供了命名空間,這本來(lái)和文件引入也不相干。但是 composer 實(shí)現(xiàn)了 PSR-4(在老版本的 PHP 上是 PSR-0),使用 use 時(shí)通過(guò)調(diào)用 spl_autoload_register 實(shí)現(xiàn)的方法在調(diào)用時(shí)加載所需要的類(lèi),在寫(xiě)法上類(lèi)似 Python 的 import,即美觀也起到了按需加載、延遲加載的作用。
3. php-cs-fixerThe PHP Coding Standards Fixer tool fixes most issues in your code when you want to follow the PHP coding standards as defined in the PSR-1 and PSR-2 documents.
這個(gè)工具的作用是按照 PSR-1 和 PSR-2 的規(guī)范格式化你的代碼,還有一些可選的編碼風(fēng)格是 Symfony 的規(guī)范。
這個(gè)其實(shí)本來(lái)并沒(méi)有那么值得一說(shuō),只是最近在幾個(gè)開(kāi)源框架中都看到了 .php_cs 的文件,一時(shí)好奇,深究下去才發(fā)現(xiàn)了這個(gè)項(xiàng)目。
項(xiàng)目地址:https://github.com/FriendsOfPHP/PHP-CS-Fixer
具體的使用和配置方法在其項(xiàng)目主頁(yè)上都有介紹。這個(gè)組織的名字也很有趣:FriendsOfPHP。主要的成員大概是來(lái)自 Symfony 項(xiàng)目中。
可能有人覺(jué)得糾結(jié)代碼風(fēng)格的問(wèn)題其實(shí)沒(méi)有特別大的必要。要說(shuō)好處我也說(shuō)不上來(lái),如果你覺(jué)得編程不僅僅是一份工作,那這就跟你收拾房間一樣,邋遢的房間不影響你吃飯睡覺(jué),但干凈的看起來(lái)更舒服。如果要和別人合作,那這件事情就更重要了。
4. PsySHA runtime developer console, interactive debugger and REPL for PHP.
PsySH 類(lèi)似 Python 的 IDLE 的一個(gè) PHP 的交互運(yùn)行環(huán)境。這個(gè)是我在 Laravel 中發(fā)現(xiàn)的,Laravel 5 的 artisan tinker 的功能是通過(guò)它來(lái)實(shí)現(xiàn)的。Laravel 4 中用的是另外一個(gè)項(xiàng)目:boris。
這個(gè)主要是在平時(shí)測(cè)試一些 php 的簡(jiǎn)單的函數(shù)和特性的時(shí)候可以方便使用。遇到一些不確定的事情、比如 empty 的使用等,可以用它來(lái)做些測(cè)試。
5. 一些框架和組件框架我比較喜歡的是 Laravel,目前公司在用的是 Yii2,我關(guān)注的有 Symfony 以及 Phalcon (C語(yǔ)言實(shí)現(xiàn))。用什么不用什么,主要是喜好,有時(shí)候也由不得自己選擇,但研究一下,多一分了解也未嘗不可。
提到 Laravel 很多人都會(huì)立馬想到 Ruby on Rails。我想模仿或者抄襲這都不是主要的目的,主要的目的是提供給開(kāi)發(fā)者一個(gè)更好的工具。Laravel 好在它有一個(gè)不一樣的路由控制(不帶 Action 后綴或前綴的),有一個(gè)好用的 ORM (Eloquent),好用的模板引擎 (Blade) 亦或有一個(gè)顏值比較高的文檔(社區(qū)看到的話)等等。
強(qiáng)大有時(shí)候也會(huì)被人詬病龐大,但這在于你需要了解自己項(xiàng)目的中長(zhǎng)期規(guī)劃,項(xiàng)目現(xiàn)在的大小以及未來(lái)的大小及承載。
Larval 的核心實(shí)現(xiàn)是一個(gè)容器(Container)以及 PHP 的反射類(lèi)(ReflectionClass)(Yii 2 也是一樣)。要理解這些,多看文章和文檔的同時(shí),也可以看看源碼。
Symfony 2 提供了很多組件。http-kernel 和 http-foundation 在 Laravel 中也有被繼承過(guò)來(lái)直接使用。它是值得了解和學(xué)習(xí)的。
CodeIgniter 是一個(gè)小巧而強(qiáng)大的框架。雖然 CI 并沒(méi)有使用 Composer 組件的方式進(jìn)行開(kāi)發(fā),但 3.0 以后的版本也加入了 Composer 的支持(這無(wú)非就是多一個(gè) vendor 的目錄,引入 autoload.php)的文件。
ORMORM 亦或 Active Record 我覺(jué)得還是需要的。也許有人認(rèn)為 PHP 就是一個(gè)模板引擎、就應(yīng)該手寫(xiě) SQL 。不要被這些話所困擾。
CodeIgniter 中 Active Record 的實(shí)現(xiàn)方式很輕巧,但對(duì)于 CI 本身的體量來(lái)說(shuō),已經(jīng)是很好用的了。
Laravel 實(shí)現(xiàn)的 Eloquent 我是很喜歡的,也可以集成到別的項(xiàng)目中去。Symfony 2 使用的是 Doctrine ,這個(gè)項(xiàng)目也值得關(guān)注。Yii 2 也有自己的一套實(shí)現(xiàn)方式。
模板引擎模板引擎需要做三件事情:
變量值的輸出(echo),條件判斷和循環(huán)(if ... else、for、foreach、while)引入或繼承自其他文件Laravel 實(shí)現(xiàn)的 Blade 是一個(gè)比較輕量好用的模板引擎。不過(guò)目前并不是很好能夠引入到其他框架中。十一的時(shí)候閑來(lái)無(wú)事試圖將其引入到 Yii 2 中,現(xiàn)在還只是簡(jiǎn)單的實(shí)現(xiàn),我希望后面能將 Blade 的解析部分單獨(dú)抽取出來(lái)做一個(gè)輕量的實(shí)現(xiàn)。在 Github 上搜一下發(fā)現(xiàn)也有人在做同樣的事情。
Yii 2 似乎更推薦就用原生的 PHP 去寫(xiě),不過(guò)也提供了支持 Smarty 和 Twig 的擴(kuò)展。Symfony 2 則采用了 Twig。Twig 和 Symfony 以及上文提到的 php-cd-fixer 都是 SensioLabs 的作品。
Smarty 是一個(gè)古老而頑強(qiáng)的模板引擎。說(shuō)實(shí)話我并不是太喜歡,其語(yǔ)法過(guò)于復(fù)雜,變量賦值這些事情都有自己的一套做法。現(xiàn)在的版本中更是使用 Lexer 的方式來(lái)解析文件,感覺(jué)像是用 PHP 實(shí)現(xiàn)了另外一種語(yǔ)言。項(xiàng)目里面還有一些太長(zhǎng)的正則表達(dá)式、太復(fù)雜的實(shí)現(xiàn),我覺(jué)得這是一件很危險(xiǎn)很容易出錯(cuò)的事情。
