鍍金池/ 教程/ PHP/ 語言亮點(diǎn)
依賴管理
安全
測試
使用模板
開發(fā)實踐
入門指南
服務(wù)器與部署
社區(qū)
語言亮點(diǎn)
錯誤與異常
虛擬化技術(shù)
資源
文檔撰寫
數(shù)據(jù)庫
依賴注入
緩存
代碼風(fēng)格指南

語言亮點(diǎn)

編程范式

PHP 是一個靈活的動態(tài)語言,支持多種編程技巧。這幾年一直不斷的發(fā)展,重要的里程碑包含 PHP 5.0 (2004) 增加了完善的面向?qū)ο竽P?,PHP 5.3 (2009) 增加了匿名函數(shù)與命名空間以及 PHP 5.4 (2012) 增加的 traits。

面向?qū)ο缶幊?/h3>

PHP 擁有完整的面向?qū)ο缶幊痰奶匦?,包括類,抽象類,接口,繼承,構(gòu)造函數(shù),克隆和異常等。

函數(shù)式編程 Functional Programming

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ù)。

元編程

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)庫

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 %}

Xdebug

合適的調(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)試器。

上一篇:錯誤與異常下一篇:資源