中文字幕理论片,69视频免费在线观看,亚洲成人app,国产1级毛片,刘涛最大尺度戏视频,欧美亚洲美女视频,2021韩国美女仙女屋vip视频

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
用 Zend Studio 消滅 PHP 應(yīng)用程序中的 bug

根據(jù)一個(gè)廣為流傳的傳說,第一個(gè)計(jì)算機(jī) bug 是一只真正的蟲子,它出現(xiàn)在 Harvard University 測(cè)試的 Mark II Aiken Relay Calculator 中的一個(gè)繼電器上。根據(jù)操作員在 1947 年 9 月 9 日所做的日志記錄,這只蟲子是 “(在計(jì)算機(jī)中)發(fā)現(xiàn)的第一個(gè) bug”。在圖 1 中可以看到這份手寫的日志記錄和這只聲名狼籍的蟲子。

圖 1. 聲名狼籍的 Mark II 蟲子

實(shí)際上,bug 這個(gè)詞的起源要早得多,可能比前面這次事件早了大約七十年。在 1848 年,Thomas Edison 在描述機(jī)械故障時(shí)寫道,“首先是覺得有點(diǎn)兒不對(duì)勁兒,然后是一聲爆響,接著麻煩就來了 —— 機(jī)器不正常了,出現(xiàn)了小故障和各種麻煩等 ‘bug’...” 顯然,與 Edison 同時(shí)代的人已經(jīng)把 bug 這個(gè)詞當(dāng)作行話了。

了解到即使是 Edison 也必須對(duì)其發(fā)明進(jìn)行 “調(diào)試(debug)”,軟件開發(fā)人員可能會(huì)覺得有所慰藉并受到鼓舞(Edison 沒有用過 debug 這個(gè)詞。這個(gè)詞比較新,它是在二戰(zhàn)時(shí)期從航空工業(yè)開始成為工程師的行話的)?;蛘?,您可能希望所有的 bug 都是真正的蟲子,那倒好辦了,我們只需安裝一個(gè)捕蟲器就行了?!坝?jì)算機(jī) bug 進(jìn)得來,但是出不去。”(有人能在 Subversion 的下一版中增加這個(gè)特性嗎?)

但是,正如 Edison 所指出的,bug 是每個(gè)工程項(xiàng)目的固有部分。在討論發(fā)明時(shí),Edison 寫道,“必須經(jīng)過數(shù)月的艱苦觀察、研究和勞動(dòng),才能讓產(chǎn)品經(jīng)受市場(chǎng)的考驗(yàn)?!?

幸運(yùn)的是,軟件開發(fā)人員可以利用工具簡(jiǎn)化 “觀察” 的過程,將花費(fèi)的時(shí)間從幾個(gè)月減少到幾分鐘,至少減少到幾小時(shí)或幾天。以前的一篇文章 “Squash bugs in PHP applications with Xdebug” 介紹了收集分析故障原因所需的信息的各種技術(shù)。但是,這種故障后分析往往很困難,而且很耗費(fèi)時(shí)間,因?yàn)楸仨氉龀鐾茰y(cè),然后進(jìn)行測(cè)試。如果缺少關(guān)鍵的信息,那么必須反復(fù)研究、調(diào)整和測(cè)試代碼,這個(gè)過程可能要重復(fù)許多次。

本文討論一種更高效的調(diào)試技術(shù):交互式調(diào)試(interactive debug)。有一種稱為調(diào)試器(debugger) 的特殊應(yīng)用程序,它們可以探測(cè)正在運(yùn)行的代碼,允許在任意的斷點(diǎn)暫停執(zhí)行,檢查對(duì)象、檢查調(diào)用堆棧和環(huán)境,甚至允許在運(yùn)行時(shí)修改變量的值。

在本文中,將使用 Zend Debugger;它是 Zend 引擎的一個(gè)擴(kuò)展,可以探察正在運(yùn)行的 PHP 應(yīng)用程序。可以免費(fèi)下載并使用 Zend Debugger。但是,為了控制 Zend Debugger 和查看它的診斷信息,需要同時(shí)使用一個(gè)客戶機(jī)應(yīng)用程序??蛻魴C(jī)可以是從命令行運(yùn)行的簡(jiǎn)單程序,也可以是成熟的集成開發(fā)環(huán)境(IDE),提供編輯器、代碼補(bǔ)全、圖形化類瀏覽器等特性。

有好幾種開放源碼客戶機(jī)可以與 Zend Debugger 進(jìn)行交互,包括開放源碼的 PHP Eclipse 插件。但是,我喜歡的 PHP IDE 是由 Zend Technologies 提供的 Zend Studio,這家公司同時(shí)提供 PHP 運(yùn)行時(shí)引擎的開放源碼版本和商業(yè)版本。與 PHP 本身不同,Zend Studio 是一個(gè)商業(yè)產(chǎn)品??梢韵螺d這個(gè)軟件并免費(fèi)使用 30 天,這段時(shí)間足夠您體會(huì)它的眾多特性了;但是在此之后,如果希望繼續(xù)使用它,就必須購買許可證。對(duì)于我來說,許可證的費(fèi)用絕對(duì)物有所值。

您應(yīng)該試試各種客戶機(jī),尋找適合自己的軟件。例如,許多 IDE 包含您喜歡的編輯器,這樣就不需要重新學(xué)習(xí)一套鍵盤快捷鍵。無論選擇哪種軟件,當(dāng)您開始使用調(diào)試器客戶機(jī)之后,很可能會(huì)發(fā)現(xiàn)再也離不開它了。您可以和 print_r() 說再見了!

安裝 Zend Studio 和 Zend Debugger

首先,下載并安裝 Zend Studio 和 Zend Debugger 軟件。這里的步驟說明針對(duì) Mac OS X,但是在 Linux? 和 Microsoft? Windows? 操作系統(tǒng)上安裝步驟是相似的。(Zend Studio Web 頁面為每種平臺(tái)提供了安裝說明。)實(shí)際上,可以在本地系統(tǒng)上安裝并運(yùn)行 Zend Studio,將調(diào)試器部署在服務(wù)器上,這樣就可以進(jìn)行遠(yuǎn)程代碼調(diào)試。

無論使用哪種平臺(tái),都要確保系統(tǒng)中運(yùn)行著 PHP V4 或 PHP V5:Zend 軟件可以與這兩個(gè)版本的 PHP 配合工作。因?yàn)?Mac OS X 當(dāng)前附帶 PHP V4(更精確地說,是 V4.4.7),所以本文基于這個(gè)比較老的 PHP 版本。

安裝 Zend 工具的步驟如下:

  1. 訪問 Zend Downloads 并單擊 Try for Zend Studio。
  2. 創(chuàng)建一個(gè)登錄,然后下載 Zend Studio Client V5.5.0a(這是編寫本文時(shí)的最新版本)和 Zend Debugger V5.2.6。
  3. 下載完成時(shí),運(yùn)行 Zend Studio 安裝程序。安裝程序運(yùn)行結(jié)束之后,系統(tǒng)中應(yīng)該有一個(gè)名為 /Applications/Zend Studio 5.5.0/ 的目錄。
  4. 打開這個(gè)文件夾,再打開 bin 子文件夾,然后雙擊應(yīng)用程序 ZDE。應(yīng)該會(huì)出現(xiàn)與圖 2 相似的空 IDE。
    圖 2. Zend Studio IDE

    稍后再設(shè)置這個(gè) IDE 來安裝調(diào)試器。

  5. 下載 Zend Debugger 軟件并用 tar xzvf ZendDebugger-5.2.6-darwin8.6-uni.tar.gz 命令進(jìn)行解壓,創(chuàng)建 ZendDebugger-5.2.6-darwin8.6-uni 目錄。
  6. 進(jìn)入這個(gè)新目錄并將文件 4_4_x_comp/ZendDebugger.so 復(fù)制到另一個(gè)便于尋找的目錄,以防止意外刪除這個(gè)文件。如果在您的 Mac 機(jī)上已經(jīng)安裝了 Xcode 開發(fā)工具,那么 /Developer/Extras/PHP 是放置這個(gè)文件的合適位置:
    $ sudo mkdir -p /Developer/Extras/PHP$ sudo chgrp admin /Developer/Extras/PHP$ sudo chmod g+rwx /Developer/Extras/PHP$ sudo cp 4_4_x_comp/ZendDebugger.so /Developer/Extras/PHP

    Zend Debugger 是一個(gè) Zend 擴(kuò)展,必須在 php.ini 中啟用它。在 Mac OS X 中,php.ini 文件通常位于 /private/etc/php.ini。

  7. 編輯這個(gè)文件并添加以下代碼行:
    zend_extension=/Developer/Extras/PHP/ZendDebugger.sozend_debugger.expose_remotely=allowed_hosts zend_debugger.allow_hosts=127.0.0.1

    如果沒有 php.ini 文件(這是正常的,這僅僅意味著 PHP 目前只使用默認(rèn)的內(nèi)部設(shè)置),那么創(chuàng)建一個(gè)包含以上代碼的文件。第一行代碼裝載這個(gè)擴(kuò)展。第二行將對(duì)調(diào)試器的連接限制在一個(gè) IP 地址列表的范圍內(nèi),這個(gè)列表在第三行中提供。同樣,這里的 PHP(包含 Zend Debugger)在本地運(yùn)行。所以這里使用 loopback 接口 127.0.0.1,但是在遠(yuǎn)程系統(tǒng)上運(yùn)行 PHP 也很容易。如果可以從因特網(wǎng)訪問這個(gè)系統(tǒng),就要使用第二行和第三行限制對(duì)調(diào)試器的訪問。

  8. 在 Mac OS X 系統(tǒng)上的 Apache HTTP Server 中啟用 PHP 擴(kuò)展。打開文件 /private/etc/httpd/httpd.conf,在以 LoadModule php4_module 開頭的行和包含 AddModule mod_php4.c 的行中刪除行首的 #。
  9. 如果在 Mac OS X 系統(tǒng)上還沒有運(yùn)行 Apache HTTP Server,就啟動(dòng)它。
  10. 打開 System Preferences,選擇 Sharing,然后啟用 Personal Web Sharing,見 圖 3。如果 Personal Web Sharing 已經(jīng)啟用了,就單擊 Stop,然后單擊 Start 重新啟動(dòng) Web 服務(wù)器。
    圖 3. 在 Mac OS X 系統(tǒng)上啟用 Web 服務(wù)器

為了檢驗(yàn) PHP 和 Web 服務(wù)器的運(yùn)行是否正常,進(jìn)入 ~/Sites/ 目錄并創(chuàng)建包含以下內(nèi)容的 info.php 文件:

<?php   phpinfo(); ?>

在瀏覽器中訪問 http://localhost/~username/info.php,其中的 username 是您的 Mac OS X 登錄名。如果配置正確,應(yīng)該會(huì)在 phpinfo() 的結(jié)果中看到標(biāo)有 Zend Debugger 的一節(jié)。這一節(jié)還應(yīng)該反映 php.ini 的設(shè)置。

圖 4. 檢驗(yàn)調(diào)試器是否正在工作

請(qǐng)注意 zend_debugger.connector_port 設(shè)置。在初始化調(diào)試會(huì)話時(shí),應(yīng)該連接 Web 服務(wù)器的這個(gè)端口。

順便說一句,如果您覺得這個(gè)安裝過程比較復(fù)雜,或者希望節(jié)省時(shí)間,那么可以下載并安裝 Zend Core 或 Zend Platform。這兩個(gè)軟件是商業(yè)產(chǎn)品,但是都預(yù)先配置了 Zend Debugger。本文余下的說明對(duì)于 Zend Core 或 Zend Platform 同樣是有效的。

回頁首

連接 Zend Debugger

Zend Studio 和 Zend Debugger 的組合允許遠(yuǎn)程控制 Zend 引擎。Zend Studio 作為控制面板,顯示關(guān)于引擎內(nèi)部機(jī)制的信息??梢钥吹秸谶\(yùn)行的源代碼、變量的狀態(tài)、Web 環(huán)境的狀態(tài)以及其他數(shù)據(jù)。

Zend Debugger 像是一個(gè)代理:它將來自 Zend 引擎的信息轉(zhuǎn)發(fā)給 Zend Studio,將來自 Zend Studio 的命令轉(zhuǎn)發(fā)給 Zend 引擎。命令包括各種調(diào)試概念,比如 continue(恢復(fù)執(zhí)行)、step(執(zhí)行下一個(gè)語句)和 stop(停止執(zhí)行)。每當(dāng) Zend 引擎的狀態(tài)發(fā)生改變時(shí),調(diào)試器將變化情況轉(zhuǎn)發(fā)給 Zend Studio 以便顯示。

因此,為了調(diào)試 PHP 應(yīng)用程序,要讓 Zend Studio 連接到調(diào)試器,然后在瀏覽器中訪問應(yīng)用程序。當(dāng)應(yīng)用程序開始運(yùn)行時(shí),調(diào)試器作為代理運(yùn)行并將控制傳遞給 Zend Studio。這樣開發(fā)人員就可以接管控制權(quán)了。

配置 Zend Studio

下面是一種連接 Zend Debugger 的簡(jiǎn)單方法(以后我會(huì)提供一個(gè)比較復(fù)雜的腳本并討論更多調(diào)試技巧):

  1. 啟動(dòng) Zend Studio IDE。
  2. 選擇 Zend Studio > Preferences,然后單擊 Debug 選項(xiàng)卡:
    • 在這個(gè)示例中,Web 服務(wù)器(其中包含 Zend Debugger)是與 Zend Studio 分離的,所以將 Debug Mode 設(shè)置為 Server。
    • 對(duì)于本文,所有 PHP 應(yīng)用程序都創(chuàng)建在您的主文件夾的個(gè)人 Web 站點(diǎn)目錄中。所以指定 localhost/~username/ 作為 Debug Server URL(這可以是服務(wù)器上包含 PHP 文件的任何路徑。使用這個(gè)設(shè)置和 Dummy File 設(shè)置在 Zend 引擎中啟用調(diào)試)。我的 Mac OS X 用戶名是 mstreicher,所以我指定 localhost/~mstreicher/,見 圖 5。
    • 調(diào)試器使用 Client IP 連接那個(gè)運(yùn)行 Zend Studio 的系統(tǒng)。這個(gè)設(shè)置通??梢允?Default,但是因?yàn)榭蛻魴C(jī)和服務(wù)器都在本地運(yùn)行,所以選擇 Customized 并提供 localhost 作為 IP 地址。
    • 可以將 Dummy File 設(shè)置為 Debug Server URL 路徑中的任何 PHP 文件名。Dummy File 作為一個(gè)引導(dǎo)程序:每當(dāng)啟動(dòng)調(diào)試會(huì)話時(shí),URL Debug Server URL/Dummy File?start_debug=1&debug_host=Client IP&... 配置和啟用調(diào)試器。如果 Web 服務(wù)器無法找到 Dummy File,調(diào)試器就不起作用(如果在筆記本計(jì)算機(jī)上運(yùn)行 Zend Studio,對(duì)遠(yuǎn)程服務(wù)器上的應(yīng)用程序代碼進(jìn)行調(diào)試,那么一定要將 Dummy File 放在遠(yuǎn)程服務(wù)器上應(yīng)用程序的文檔根目錄中)。要想檢查 Dummy File 是否存在,只需在瀏覽器中訪問它的 URL。如果沒有看到錯(cuò)誤,就說明配置是正確的。
    • Client Debug Port 設(shè)置為任何非特權(quán)端口,比如 10000。
    • Debug 選項(xiàng)卡上的所有其他設(shè)置可以保持默認(rèn)值。完成設(shè)置時(shí),窗口應(yīng)該與圖 5 相似。
      圖 5. 連接 Zend Debugger 所需的設(shè)置
    • 單擊 OK。

現(xiàn)在,可以編寫并調(diào)試 PHP 代碼了。

調(diào)試一些簡(jiǎn)單的代碼

Zend Studio 提供了編寫 PHP 代碼所需的所有工具:一個(gè)用來編輯文件的編輯器;一個(gè)文件管理器,用來將許多文件集中在一個(gè)項(xiàng)目中;一個(gè)作為參考的 PHP 類和模塊瀏覽器;一個(gè)用來查看中間結(jié)果的輸出視圖;一個(gè)環(huán)境瀏覽器,可以直接查看變量、調(diào)用堆棧和輸出緩沖區(qū)。更好的是,編輯器是上下文敏感的,可以自動(dòng)補(bǔ)全 PHP 控制結(jié)構(gòu)、關(guān)鍵字和字符串分隔符。

首先,在 Zend Studio 頂部中間的 Editor 窗口中單擊鼠標(biāo)。輸入 清單 1 所示的代碼片段,體會(huì)一下編輯器的代碼補(bǔ)全特性。這段代碼的意圖是輸出數(shù)字 1-10。

清單 1. 輸出數(shù)字 1-10
<?php    $counter = 1;        while ( $counter < 10; ) {        printf( "%d\n", $counter );                increment( $counter );    }        function increment( $i ) {        $i++;                return;    }?>

輸入完代碼之后,單擊工具欄中綠色的 Play 按鈕運(yùn)行代碼。但是,代碼并沒有輸出 1-10,而是不停地輸出數(shù)字 1。單擊紅色的 Stop 按鈕停止程序。

這里顯然有 bug。首先要調(diào)查的是:$counter 發(fā)生了什么情況?為此,需要在第 7 行和第 11 行停止執(zhí)行。在第一個(gè)斷點(diǎn)上,可以檢查 $counter 在調(diào)用 increment() 之前的值;在第二個(gè)斷點(diǎn)上,可以檢查傳遞的參數(shù)值以及局部變量 $i 的值。在第 7 行上設(shè)置斷點(diǎn):將游標(biāo)移動(dòng)到第 7 行上,然后選擇 Debug > Add/Remove Breakpoint。第 7 行應(yīng)該會(huì)顯示為紅色,表示這一行上設(shè)置了斷點(diǎn)。對(duì)第 11 行執(zhí)行相同的操作。如果想查看斷點(diǎn)的列表,可以單擊 Debug 窗口底部的 Breakpoints 選項(xiàng)卡。圖 6 顯示設(shè)置斷點(diǎn)之后的 IDE 窗口。

圖 6. 在代碼示例中設(shè)置的斷點(diǎn)

接下來,單擊 Play 重新啟動(dòng)應(yīng)用程序。程序在第 7 行停止執(zhí)行。Debug Output 面板(在最右邊)包含一些輸出,Debug 窗口中的 Variables 選項(xiàng)卡顯示變量的列表。數(shù)組標(biāo)有方括號(hào)([]);簡(jiǎn)單的標(biāo)量標(biāo)有藍(lán)色圓點(diǎn)。應(yīng)該會(huì)看到 $counter = (int) 1。

現(xiàn)在單擊工具欄中藍(lán)色的向下箭頭,執(zhí)行函數(shù)中的下一個(gè)語句(藍(lán)色的向下箭頭和短線的作用是調(diào)用函數(shù),并前進(jìn)到調(diào)用者中的下一個(gè)語句)。游標(biāo)現(xiàn)在應(yīng)該出現(xiàn)在第 11 行,Variables 選項(xiàng)卡應(yīng)該只顯示一個(gè)變量:形式參數(shù) $i = (int) 1。到目前為止,一切正常。

再次單擊向下箭頭,執(zhí)行第 11 行。$i 現(xiàn)在是 2。單擊 Debug 窗口中的 Stack 選項(xiàng)卡,見圖 7。

圖 7. 堆棧跟蹤

再次單擊向下箭頭,返回第 5 行。讓人吃驚的是,$counter 仍然是 1,這是第一個(gè) bug 的根源。應(yīng)該用變量的引用 調(diào)用 increment() 函數(shù),而不是使用變量的值。這很容易糾正!只需將這個(gè)函數(shù)調(diào)用改為 increment( &$counter )。

單擊 Stop,然后再次單擊 Play。分步執(zhí)行這個(gè)程序,應(yīng)該會(huì)看到 1, 2, 3, . . . 8, 9。怎么沒有 10 呢?答案很明顯:這是一個(gè)邊界錯(cuò)誤。只需將 < 改為 <=。如果刪除原來的兩個(gè)斷點(diǎn)并在第 4 行上設(shè)置一個(gè)新斷點(diǎn),就可以看到這個(gè)錯(cuò)誤是如何發(fā)生的。

盡管這個(gè)示例是人為制造的,但是它演示了幾種基本的交互式調(diào)試技術(shù):

  • 分步執(zhí)行程序,每次執(zhí)行一個(gè)命令,從而觀察變量值并尋找出錯(cuò)的位置。
  • 如果在許多地方調(diào)用了一個(gè)函數(shù),可以使用堆棧跟蹤檢查調(diào)用序列。常??梢园l(fā)現(xiàn) bug 的原因是調(diào)用者發(fā)送了類型錯(cuò)誤的參數(shù)或數(shù)量錯(cuò)誤的參數(shù),或者實(shí)際參數(shù)和形式參數(shù)的次序不匹配。還可以展開跟蹤中的條目(單擊名稱左邊的向右小箭頭),查看函數(shù)的形式參數(shù)的值。
  • 使用斷點(diǎn)暫停程序的執(zhí)行以便檢查狀態(tài)。例如,如果懷疑一個(gè)函數(shù)的代碼有問題,那么在這個(gè)函數(shù)的第一個(gè)語句上設(shè)置斷點(diǎn),程序在此暫停執(zhí)行,查看堆棧跟蹤,然后分步執(zhí)行這個(gè)函數(shù)來尋找 bug。
  • 使用 Debug 窗口中的 Variables 選項(xiàng)卡查看環(huán)境、全局和局部變量。

要想進(jìn)一步了解 Zend Studio,可以使用 IDE 編寫 PHP 代碼并單擊各個(gè)選項(xiàng)卡,從而研究它的眾多特性。即使選擇在另一個(gè)程序中編輯代碼,也可以利用 Zend Studio 調(diào)試類、方法和單元測(cè)試。在 IDE 中編寫單元測(cè)試尤其有幫助。

回頁首

調(diào)試 PHP 應(yīng)用程序

當(dāng)然,PHP 調(diào)試器的真正價(jià)值在于實(shí)時(shí)探察 Web 應(yīng)用程序。下面提供一個(gè)這樣的場(chǎng)景。

比薩餅應(yīng)用程序

清單 2清單 3 是一個(gè)簡(jiǎn)單的 PHP 應(yīng)用程序,其中包含一個(gè)類、方法和一些包裝器代碼。清單 2(index.php)所示的應(yīng)用程序使用 Pizza 類(清單 3)創(chuàng)建比薩餅訂單,計(jì)算每個(gè)比薩餅的價(jià)格。代碼并不復(fù)雜,但是其中有兩個(gè) bug,這足以演示調(diào)試 PHP 應(yīng)用程序的方法。一個(gè) bug 很明顯:根據(jù)配料數(shù)量的不同,比薩餅的價(jià)格應(yīng)該不一樣,但是這個(gè)程序產(chǎn)生的價(jià)格都一樣。第二個(gè) bug 是一個(gè)慣例問題:同一種配料不應(yīng)該兩次計(jì)價(jià)。

清單 2. 比薩餅訂單應(yīng)用程序,index.php
<?php    include_once( 'pizza.class.php' );        $large = new Pizza( 'L', null );    echo $large->price() . '<br />';        $toppings = array();    $toppings[] = 'pepperoni';    $toppings[] = 'sausage';    $xl = new Pizza( 'XL', $toppings );    echo $xl->price() . '<br />';        $special = new Pizza( 'XL' );    $special->add( null );    $special->add( 'pepperoni' );       $special->add( 'pepperoni' );       $special->add( 'anchovies' );       $special->add( 'anchovies' );    $special->add( 'olives' );    echo $special->price() . '<br />';?>
清單 3. Pizza 類
<?php    class Pizza {        var $size;        var $toppings = array();        var $price;                function Pizza( $size = "R", $toppings = null ) {            $this->size = $size;            $this->toppings = $toppings;         }                function size() {            return( $this->size );        }                function price() {            $this->price = 10;            $multiplier = 1;                        switch ( $this->size ) {                case 'L':                     $multiplier = 1.25;                    break;                case 'XL':                    $multiplier = 2;                    break;            }                        $this->price = $this->price +                 ( sizeof( $this->toppings() ) ) * $multipler;                            return( $this->price );        }                function toppings() {            return( $this->toppings );        }                function add( $topping ) {            $this->toppings[] = $topping;        }    }?>

按照以下步驟創(chuàng)建項(xiàng)目:

  1. 打開 Zend Studio 并選擇 Project > New Project 來創(chuàng)建一個(gè)新項(xiàng)目。
  2. 將這個(gè)項(xiàng)目命名為 pizza(見圖 8),然后單擊 Next。
    圖 8. 創(chuàng)建新項(xiàng)目,pizza

    在出現(xiàn)的窗口中,可以將一個(gè)或多個(gè)源代碼目錄添加到項(xiàng)目中,從而便于在 IDE 中尋找、打開、編輯和保存項(xiàng)目的所有代碼。因?yàn)檫@是一個(gè)新項(xiàng)目,所以只添加一個(gè)新的源代碼目錄。

  3. 單擊 Add path,找到您的個(gè)人站點(diǎn)目錄,然后單擊 New Folder(右上角第三個(gè)按鈕)。
  4. 輸入名稱 pizza,單擊這個(gè)條目(見圖 9),然后單擊 Add。
    圖 9. 創(chuàng)建新的源代碼文件夾

    向?qū)Т翱诂F(xiàn)在像圖 10 這樣。
    圖 10. 項(xiàng)目現(xiàn)在有一個(gè)源代碼文件夾
  5. 單擊 Next。

    下一組設(shè)置指定如何連接 Web(調(diào)試)服務(wù)器。

  6. 取消 Use System Defaults 復(fù)選框并輸入應(yīng)用程序的 URL,比如 localhost/~username/pizza/index.php(如果使用 Mac OS X)或 localhost/pizza/index.php(如果使用 Linux? 機(jī)器作為服務(wù)器,使用 Mac OS X 運(yùn)行 Zend Studio),見圖 11。
    圖 11. 設(shè)置項(xiàng)目的 URL
  7. 單擊 Finish

    Project 窗口中現(xiàn)在應(yīng)該有一個(gè)名為 pizza 的文件夾。

  8. 選擇 File > New File 兩次。
  9. 復(fù)制清單 2 并將文本保存在文件系統(tǒng)的 pizza 文件夾中的 index.php 文件中。
  10. 復(fù)制清單 3 并將文本保存為 pizza 文件夾中的 Pizza.class.php 文件。
  11. 在 Project 面板中展開這個(gè)文件夾,就可以看到這兩個(gè) PHP 文件。
    圖 12. 展開的項(xiàng)目文件夾

我的代碼出了什么問題?

現(xiàn)在可以調(diào)試這個(gè)應(yīng)用程序了。單擊 Play:應(yīng)用程序運(yùn)行,它的輸出出現(xiàn)在 Debug Output 面板中。輸出如下:

Content-type: text/html10<br />10<br />10<br />

為什么這三個(gè)比薩餅的價(jià)格都是 $10?如果看一下 Debug Messages 面板,答案就清楚了:變量 $multipler 是未定義的,因?yàn)樗且粋€(gè)拼寫錯(cuò)誤,應(yīng)該是 $multiplier

如果這個(gè) bug 的原因不這么明顯的話(常常是這種情況),還可以用另一種方法捕捉這個(gè)錯(cuò)誤。雙擊 Pizza.class.php,將游標(biāo)放在第 29 行上并選擇 Debug > Add/Remove Breakpoint。這一行會(huì)變成紅色的。雙擊 index.php 并單擊 Play。程序在第 29 行停止執(zhí)行??匆幌?Debug 窗口,$this->price 到目前為止是正確的,$multiplier 也是正確的,那么發(fā)生了什么?單擊向下箭頭進(jìn)行分步執(zhí)行,會(huì)看到價(jià)格沒有變化。哦!有一個(gè)拼寫錯(cuò)誤。糾正它,重新運(yùn)行應(yīng)用程序,每個(gè)比薩餅的價(jià)格應(yīng)該不一樣了。

作為一個(gè)練習(xí),使用 IDE 分步探察另一個(gè) bug,這是一個(gè)導(dǎo)致重復(fù)計(jì)價(jià)的邏輯錯(cuò)誤。取消所有斷點(diǎn),然后在 index.php 中的第 14 行設(shè)置一個(gè)斷點(diǎn)。在 toppings()add() 函數(shù)上設(shè)置斷點(diǎn),從而觀察 Pizza 對(duì)象發(fā)生的情況。圖 13 顯示在計(jì)算價(jià)格期間這個(gè)對(duì)象的情況。

圖 13. 錯(cuò)誤的 Pizza 對(duì)象

為了糾正這個(gè) bug,不允許 null 作為有效的配料(這實(shí)際上是 index.php 的錯(cuò)誤,但是可以在 add() 函數(shù)中增加保護(hù)措施)并刪除重復(fù)的配料。下面的代碼可以解決這些問題。

        function toppings() {            if ( is_array( $this->toppings ) ) {                return( array_unique( $this->toppings ) );            }                        return( 0 );        }                function add( $topping ) {            if ( ! is_null( $topping ) ) {                $this->toppings[] = $topping;            }        }

連接瀏覽器

最后一個(gè)練習(xí)是在瀏覽器中啟動(dòng)應(yīng)用程序并在 IDE 中調(diào)用它。典型的情況是:觀察瀏覽器中的輸出,與 Web 頁面進(jìn)行交互,然后分步執(zhí)行應(yīng)用程序,觀察它如何做出響應(yīng):

  1. 選擇 Debug > Debug URL。

    默認(rèn)的設(shè)置可能就夠了。如果默認(rèn)設(shè)置不合適,那么將 Open Browser At 字段設(shè)置為 index.php 文件的 URL。對(duì)于這個(gè)示例,因?yàn)樗熊浖荚?Mac 上運(yùn)行,所以選擇 Local files, if available。

  2. 單擊 OK。

    瀏覽器打開 Open Browser At 指定的 URL(包括許多為這個(gè)調(diào)試會(huì)話配置調(diào)試器的參數(shù))。瀏覽器最初是空的,因?yàn)?IDE 很早就暫停了應(yīng)用程序的執(zhí)行。

  3. 切換到 IDE,將游標(biāo)放在 index.php 的第一行,就在包含類文件的地方。然后可以分步執(zhí)行這個(gè)應(yīng)用程序。

如果應(yīng)用程序包含表單,那么可以在表單處理函數(shù)上設(shè)置斷點(diǎn)并查看輸入的參數(shù)。在 Debug 窗口中可以查看所有全局環(huán)境變量、PHP 全局變量和每個(gè) Web 請(qǐng)求的參數(shù)。

使用 Debug URL 窗口控制應(yīng)用程序何時(shí)暫停。PHP Web 應(yīng)用程序通常集中在一個(gè)目錄中并包含一個(gè)主頁(一般名為 index.php)。主頁上的鏈接指向其他 PHP 頁面,那些頁面分別提供不同的特性。例如,URL .../store/index.php 可能是一個(gè)在線商店的主頁;URL .../store/cart/index.php 可能實(shí)現(xiàn)購物車。

可以用 Zend Studio 調(diào)試某個(gè)應(yīng)用程序根目錄中的一個(gè)、幾個(gè)或所有 PHP 頁面。例如,如果購物車出現(xiàn)了錯(cuò)誤,那么可以在打開 cart/ 中的任何頁面時(shí)啟動(dòng)調(diào)試會(huì)話。也可以在瀏覽主頁 index.php 時(shí)啟動(dòng)調(diào)試會(huì)話,調(diào)試整個(gè)應(yīng)用程序。

更好的是,可以組合使用 Zend Studio、Internet Explorer? 或 Mozilla Firefox 以及 Zend Debugger Browser Toolbar,從而在瀏覽器中直接啟動(dòng)調(diào)試會(huì)話??梢哉{(diào)試當(dāng)前頁面、站點(diǎn)上的所有頁面或某個(gè)表單的操作。

回頁首

一種新的工作方式

交互式調(diào)試器就像是礦工頭上的礦燈。診斷問題所需的艱苦勞動(dòng)突然變得容易了,我們不必在黑暗中苦苦摸索了 —— 只需設(shè)置斷點(diǎn),分步執(zhí)行代碼,觀察每個(gè)語句發(fā)生的情況。用一個(gè)筆記本記下每次暫停時(shí)的情況,觀察并推測(cè)原因。

Zend Studio 不是調(diào)試器的惟一選擇。試試其他調(diào)試器,尋找最適合您的工作習(xí)慣的調(diào)試器。無論如何,務(wù)必選用一種調(diào)試器。您會(huì)發(fā)現(xiàn)編寫代碼時(shí)離不開它。

參考資料

學(xué)習(xí)

獲得產(chǎn)品和技術(shù)

  • Zend.com 下載 Zend 軟件,包括 Zend Studio、Zend Core、Zend Platform、Zend Debugger 等等。
  • 下載用于基于 Mozilla 的瀏覽器的 Zend Debugger Browser Toolbar。
  • 使用 IBM 試用軟件 改進(jìn)您的下一個(gè)開放源碼開發(fā)項(xiàng)目,這些軟件可以下載或者通過 DVD 獲得。
  • 下載 IBM 產(chǎn)品評(píng)估版,試用這些來自 DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere? 的應(yīng)用程序開發(fā)工具和中間件產(chǎn)品。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
phpstorm下載-phpstorm官方版下載 PhpStorm2021軟件功能
幾種PHP開發(fā)工具比拼!-PHP應(yīng)用教程 by alixixi.com
PHP程序員的優(yōu)化調(diào)試技術(shù)和技巧
C 初識(shí)
10.2 Visual Studio調(diào)試器
使用開源軟件設(shè)計(jì)、開發(fā)和部署協(xié)作型 Web 站點(diǎn),第 13 部分: Eclipse 中的 ...
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服