久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

用 Zend Studio 消滅 PHP 應用程序中的 bug

 HiLinz 2015-12-04

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

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

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

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

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

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

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

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

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

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

安裝 Zend Studio 和 Zend Debugger

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

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

安裝 Zend 工具的步驟如下:

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

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

  5. 下載 Zend Debugger 軟件并用 tar xzvf ZendDebugger-5.2.6-darwin8.6-uni.tar.gz 命令進行解壓,創(chuàng)建 ZendDebugger-5.2.6-darwin8.6-uni 目錄,。
  6. 進入這個新目錄并將文件 4_4_x_comp/ZendDebugger.so 復制到另一個便于尋找的目錄,,以防止意外刪除這個文件。如果在您的 Mac 機上已經(jīng)安裝了 Xcode 開發(fā)工具,,那么 /Developer/Extras/PHP 是放置這個文件的合適位置:
    $ 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 是一個 Zend 擴展,,必須在 php.ini 中啟用它。在 Mac OS X 中,,php.ini 文件通常位于 /private/etc/php.ini,。

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

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

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

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

<?php 
  phpinfo(); 
?>

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

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

請注意 zend_debugger.connector_port 設置。在初始化調(diào)試會話時,,應該連接 Web 服務器的這個端口,。

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

回頁首

連接 Zend Debugger

Zend Studio 和 Zend Debugger 的組合允許遠程控制 Zend 引擎,。Zend Studio 作為控制面板,,顯示關于引擎內(nèi)部機制的信息,。可以看到正在運行的源代碼,、變量的狀態(tài),、Web 環(huán)境的狀態(tài)以及其他數(shù)據(jù)。

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

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

配置 Zend Studio

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

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

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

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

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

首先,在 Zend Studio 頂部中間的 Editor 窗口中單擊鼠標,。輸入 清單 1 所示的代碼片段,,體會一下編輯器的代碼補全特性。這段代碼的意圖是輸出數(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 按鈕運行代碼。但是,,代碼并沒有輸出 1-10,,而是不停地輸出數(shù)字 1。單擊紅色的 Stop 按鈕停止程序。

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

圖 6. 在代碼示例中設置的斷點
在代碼示例中設置的斷點

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

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

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

圖 7. 堆棧跟蹤
堆棧跟蹤

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

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

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

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

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

回頁首

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

當然,PHP 調(diào)試器的真正價值在于實時探察 Web 應用程序,。下面提供一個這樣的場景,。

比薩餅應用程序

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

清單 2. 比薩餅訂單應用程序,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)建項目:

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

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

  3. 單擊 Add path,,找到您的個人站點目錄,,然后單擊 New Folder(右上角第三個按鈕)。
  4. 輸入名稱 pizza,,單擊這個條目(見圖 9),,然后單擊 Add
    圖 9. 創(chuàng)建新的源代碼文件夾
    創(chuàng)建新的源代碼文件夾
    向?qū)Т翱诂F(xiàn)在像圖 10 這樣,。
    圖 10. 項目現(xiàn)在有一個源代碼文件夾
    項目現(xiàn)在有一個源代碼文件夾
  5. 單擊 Next,。

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

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

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

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

我的代碼出了什么問題,?

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

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

為什么這三個比薩餅的價格都是 $10?如果看一下 Debug Messages 面板,,答案就清楚了:變量 $multipler 是未定義的,,因為它是一個拼寫錯誤,應該是 $multiplier,。

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

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

圖 13. 錯誤的 Pizza 對象
錯誤的 Pizza 對象

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

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

連接瀏覽器

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

  1. 選擇 Debug > Debug URL,。

    默認的設置可能就夠了,。如果默認設置不合適,那么將 Open Browser At 字段設置為 index.php 文件的 URL,。對于這個示例,,因為所有軟件都在 Mac 上運行,所以選擇 Local files, if available,。

  2. 單擊 OK,。

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

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

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

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

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

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

回頁首

一種新的工作方式

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

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

參考資料

學習

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

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

    本站是提供個人知識管理的網(wǎng)絡存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點,。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導購買等信息,謹防詐騙,。如發(fā)現(xiàn)有害或侵權內(nèi)容,,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多