PHP 是一個靈活的動態(tài)語言,支持多種編程技巧。這幾年一直不斷的發(fā)展,重要的里程碑包含 PHP 5.0 (2004) 增加了完善的面向?qū)ο竽P?,PHP 5.3 (2009) 增加了匿名函數(shù)與命名空間以及 PHP 5.4 (2012) 增加的 traits。
PHP 擁有完整的面向?qū)ο缶幊痰奶匦?,包括類,抽象類,接口,繼承,構(gòu)造函數(shù),克隆和異常等。
PHP 支持函數(shù)是"第一等公民",即函數(shù)可以被賦值給一個變量,包括用戶自定義的或者是內(nèi)置函數(shù),然后動態(tài)調(diào)用它。函數(shù)可以作為參數(shù)傳遞給其他函數(shù)(稱為高階函數(shù)),也可以作為函數(shù)返回值返回。
PHP 支持遞歸,也就是函數(shù)自己調(diào)用自己,但多數(shù) PHP 代碼使用迭代。
自從 PHP 5.3 (2009) 之后開始引入對閉包以及匿名函數(shù)的支持。
PHP 5.4 增加了將閉包綁定到對象作用域中的特性,并改善其可調(diào)用性,如此即可在大部分情況下使用匿名函數(shù)取代一般的函數(shù)。
call_user_func_array()
PHP 通過反射 API 和魔術(shù)方法,可以實現(xiàn)多種方式的元編程。開發(fā)者通過魔術(shù)方法,如 __get()
, __set()
, __clone()
, __toString()
, __invoke()
,等等,可以改變類的行為。Ruby 開發(fā)者常說 PHP 沒有 method_missing
方法,實際上通過 __call()
和 __callStatic()
就可以完成相同的功能。
如前所述,PHP 社區(qū)已經(jīng)有許多開發(fā)者開發(fā)了大量的代碼。這意味著一個類庫的 PHP 代碼可能使用了另外一個類庫中相同的類名。如果他們使用同一個命名空間,那將會產(chǎn)生沖突導(dǎo)致異常。
命名空間 解決了這個問題。如 PHP 手冊里所描述,命名空間好比操作系統(tǒng)中的目錄,兩個同名的文件可以共存在不同的目錄下。同理兩個同名的 PHP 類可以在不同的 PHP 命名空間下共存,就這么簡單。
因此把你的代碼放在你的命名空間下就非常重要,避免其他開發(fā)者擔(dān)心與第三方類庫沖突。
PSR-4 提供了一種命名空間的推薦使用方式,它提供一個標(biāo)準(zhǔn)的文件、類和命名空間的使用慣例,進(jìn)而讓代碼做到隨插即用。
2014 年 10 月,PHP-FIG 廢棄了上一個自動加載標(biāo)準(zhǔn): PSR-0,而采用新的自動加載標(biāo)準(zhǔn) PSR-4。但 PSR-4 要求 PHP 5.3 以上的版本,而許多項目都還是使用 PHP 5.2,所以目前兩者都能使用。如果你在新應(yīng)用或擴(kuò)展包中使用自動加載標(biāo)準(zhǔn),應(yīng)優(yōu)先考慮使用 PSR-4。
PHP 標(biāo)準(zhǔn)庫 (SPL) 隨著 PHP 一起發(fā)布,提供了一組類和接口。包含了常用的數(shù)據(jù)結(jié)構(gòu)類 (堆棧,隊列,堆等等),以及遍歷這些數(shù)據(jù)結(jié)構(gòu)的迭代器,或者你可以自己實現(xiàn) SPL 接口。
PHP 是為開發(fā) Web 應(yīng)用而創(chuàng)建,不過它的命令行腳本接口(CLI)也非常有用。PHP 命令行編程可以幫你完成自動化的任務(wù),如測試,部署和應(yīng)用管理。
CLI PHP 編程非常強(qiáng)大,可以直接調(diào)用你自己的程序代碼而無需創(chuàng)建 Web 圖形界面,需要注意的是不要把 CLI PHP 腳本放在公開的 web 目錄下!
在命令行下運(yùn)行 PHP :
{% highlight console %}
> php -i
{% endhighlight %}
選項 -i
將會打印 PHP 配置,類似于 phpinfo()
函數(shù)。
選項 -a
提供交互式 shell,和 Ruby 的 IRB 或 python 的交互式 shell 相似,此外還有很多其他有用的命令行選項。
接下來寫一個簡單的 "Hello, $name" CLI 程序,先創(chuàng)建名為 hello.php
的腳本:
{% highlight php %}
<?php
if($argc != 2) {
echo "Usage: php hello.php [name].\n";
exit(1);
}
$name = $argv[1];
echo "Hello, $name\n";
{% endhighlight %}
PHP 會在腳本運(yùn)行時根據(jù)參數(shù)設(shè)置兩個特殊的變量,$argc
是一個整數(shù),表示參數(shù)個數(shù),$argv
是一個數(shù)組變量,包含每個參數(shù)的值,
它的第一個元素一直是 PHP 腳本的名稱,如本例中為 hello.php
。
命令運(yùn)行失敗時,可以通過 exit()
表達(dá)式返回一個非 0 整數(shù)來通知 shell,常用的 exit 返回碼可以查看列表.
運(yùn)行上面的腳本,在命令行輸入:
{% highlight console %}
> php hello.php
Usage: php hello.php [name]
> php hello.php world
Hello, world
{% endhighlight %}
合適的調(diào)試器是軟件開發(fā)中最有用的工具之一,它使你可以跟蹤程序執(zhí)行結(jié)果并監(jiān)視程序堆棧中的信息。 Xdebug 是一個 php 的調(diào)試器,它可以被用來在很多 IDE(集成開發(fā)環(huán)境) 中做斷點(diǎn)調(diào)試以及堆棧檢查。它還可以像 PHPUnit 和 KCacheGrind 一樣,做代碼覆蓋檢查或者程序性能跟蹤。
如果你仍在使用 var_dump()
/print_r()
調(diào)錯,經(jīng)常會發(fā)現(xiàn)自己處于困境,并且仍然找不到解決辦法。這時,你該使用調(diào)試器了。
安裝 Xdebug 可能很費(fèi)事,但其中一個最重要的「遠(yuǎn)程調(diào)試」特性 —— 如果你在本地開發(fā),并在虛擬機(jī)或者其他服務(wù)器上測試,遠(yuǎn)程調(diào)試可能是你想要的一種方式。
通常,你需要修改你的 Apache VHost 或者 .htaccess 文件的這些值:
{% highlight ini %}
php_value xdebug.remote_host=192.168.?.?
php_value xdebug.remote_port=9000
{% endhighlight %}
「remote host」 和 「remote port」 這兩項對應(yīng)和你本地開發(fā)機(jī)監(jiān)聽的地址和端口。然后將你的 IDE 設(shè)置成「listen for connections」模式,并訪問網(wǎng)址:
http://your-website.example.com/index.php?XDEBUG_SESSION_START=1
你的 IDE 將會攔截當(dāng)前執(zhí)行的腳本狀態(tài),運(yùn)行你設(shè)置的斷點(diǎn)并查看內(nèi)存中的值。
圖形化的調(diào)試器可以讓你非常容易的逐步的查看代碼、變量,以及運(yùn)行時的 evel 代碼。許多 IDE 已經(jīng)內(nèi)置或提供了插件支持 XDebug 圖形化調(diào)試器。比如 MacGDBp 是 Mac 上的一個免費(fèi),開源的單機(jī)調(diào)試器。