首頁 > 後端開發 > php教程 > 互動php與psysh調試

互動php與psysh調試

尊渡假赌尊渡假赌尊渡假赌
發布: 2025-02-19 10:15:10
原創
417 人瀏覽過

互動php與psysh調試

是上午1:00,您的Web應用程序的交付截止日期為8小時……而且行不通。 當您嘗試弄清楚發生了什麼時,您將代碼填充var_dump()和die()到處都在查看錯誤在哪裡…

>

>你很生氣。每次您想嘗試返回值或變量分配時,都必須更改源代碼,執行應用程序並查看結果……最終,您不確定是否已將所有這些var_dump從代碼。這種情況很熟悉嗎?

>

鑰匙要點

    PSYSH是PHP的功能強大的REPL工具,可以通過允許立即進行互動和執行PHP代碼來增強調試,類似於瀏覽器中的JavaScript控制台。 PSYS的安裝可以在全球或使用Composer進行全球完成,並且支持在運行時檢查和操縱代碼的一系列命令。 > 通過使用``ls',show'''和`help'之類的命令,開發人員可以檢查變量,查看方法定義並直接在控制台中獲取有關代碼的詳細信息。
  • > PSYS可以直接集成到PHP腳本或單元測試中,以提供實時調試環境,這對於識別和修復複雜應用程序中的錯誤特別有用。
  • >該工具在命令行接口和內置的PHP Web服務器中提供了無縫調試體驗,儘管它與Apache等外部Web服務器不兼容。
  • >
  • > psysh進行救援
  • PSYSH是一個讀取的印刷循環(或repl)。 您可能在通過瀏覽器的JavaScript控制台之前使用了一個臥式。 如果有的話,您知道它具有很大的力量,並且在調試JS代碼時可能會很有用。
  • >談論PHP,您之前可能已經使用過PHP的Interactive Console(PHP -A)。在那裡,您可以編寫一些代碼,並且一旦按Enter:,該控制台將立即執行它
  • 不幸的是,交互式外殼不是一個替補,因為它缺少“ p”(打印)。 我必須執行迴聲語句才能查看$ a的內容。 在真實的補充中,我們將在將值分配給它後立即看到。
  • >
>您可以在Composer g需要的情況下在全球安裝PSYSH,或者下載PSYSH可執行

作曲家

>直接下載(Linux/Mac)

php -a
Interactive shell

php > $a = 'Hello world!';
php > echo $a;
Hello world!
php >
登入後複製
登入後複製
登入後複製
登入後複製
>此外,您可以在本文稍後看到的作曲家每個項目中都包含它。

現在讓我們玩一點psysh。

主要幫助將是您最好的朋友。這將為您提供各種命令及其解釋的原因:

>

composer g require psy/psysh:~0.1
psysh
登入後複製
登入後複製
登入後複製

基本上,一個替補可以做的是:

>
wget psysh.org/psysh
chmod +x psysh
./psysh
登入後複製
登入後複製
登入後複製

>請注意,如果我們將PSYS與PHP的交互式控制台進行比較,則PSYSH在分配後立即打印出$ A a值。

>

一個更複雜的示例可以如下:

php -a
Interactive shell

php > $a = 'Hello world!';
php > echo $a;
Hello world!
php >
登入後複製
登入後複製
登入後複製
登入後複製
>我定義了say()並調用它。 您看到的這兩個null是因為函數定義和執行都沒有返回值(函數迴盪值)。 此外,在定義功能時,提示從>>>更改為....

>

我們可以定義類並實例化嗎?

composer g require psy/psysh:~0.1
psysh
登入後複製
登入後複製
登入後複製
>當我實例化foo時,構造函數返回對對象的引用。 這就是為什麼Psysh打印。 現在讓我們看看關於psysh和對象的有趣的東西。

>

wget psysh.org/psysh
chmod +x psysh
./psysh
登入後複製
登入後複製
登入後複製
如果您忘記了類Foo定義的哪種方法,則您現在有了答案。 您是否使用過Linux OS或Mac命令行接口?那麼您可能會熟悉LS命令。 還記得-la選項嗎?

./psysh                                                                                                                                             

Psy Shell v0.1.11 (PHP 5.5.8 — cli) by Justin Hileman                                                                                                                                                                              
>>>
登入後複製
登入後複製
甜,不是嗎?

與Web應用程序集成時,PSYS的真實力量會閃耀,所以讓我們構建一個。

演示應用

>我將實施一個快速應用程序來展示裝飾器設計模式。這種模式的UML類圖如下:


>如果您對UML或設計模式不了解,則不必擔心本文不需要理解它們。 互動php與psysh調試

>也為此項目創建了一組測試用例。 這些測試用例可以由Phpunit運行。同樣,您不必熟悉單元測試就可以理解本文。

>

可以在https://github.com/sitepoint-examples/psysh

上找到此小應用程序的完整源代碼

首先,讓我們定義我們的composer.json文件以聲明對psysh的依賴性:

作曲家安裝後,您應該很好。

>
>>> help

  help      Show a list of commands. Type `help [foo]` for information about [foo].      Aliases: ?
  
  ls        List local, instance or class variables, methods and constants.              Aliases: list, dir
  
  dump      Dump an object or primitive.
  
  doc       Read the documentation for an object, class, constant, method or property.   Aliases: rtfm, man 
  
  show      Show the code for an object, class, constant, method or property.
  
  wtf       Show the backtrace of the most recent exception.                             Aliases: last-exception, wtf?
  
  trace     Show the current call stack.
  
  buffer    Show (or clear) the contents of the code input buffer.                       Aliases: buf
  
  clear     Clear the Psy Shell screen.
  
  history   Show the Psy Shell history.
  
  exit      End the current session and return to caller.                                Aliases: quit, q
登入後複製
登入後複製
請查看來自文件public/decorator.php的以下源代碼。它將實例化簡單的窗口,裝飾窗戶和標題為窗戶的對象,以展示裝飾器圖案:

我們可以通過PHP的CLI(命令行接口)執行代碼,或者如果配置了網絡服務器。 我們也可以使用PHP的內部Web服務器。

>
>>> help ls

Usage:

ls [--vars] [-c|--constants] [-f|--functions] [-k|--classes] [-I|--interfaces] [-t|--traits] [-p|--properties] [-m|--methods] [-G|--grep="..."] [-i|--insensitive] [-v|--invert] [-g|--globals] [-n|--internal] [-u|--user] [-C|--
category="..."] [-a|--all] [-l|--long] [target]

Aliases: list, dir

Arguments:

 target             A target class or object to list.
 
 
Options:

 --vars             Display variables.
 
 --constants (-c)   Display defined constants.
 
 --functions (-f)   Display defined functions.
 
 --classes (-k)     Display declared classes.
 
 --interfaces (-I)  Display declared interfaces.
 
 --traits (-t)      Display declared traits.
 
 --properties (-p)  Display class or object properties (public properties by default).
 
 --methods (-m)     Display class or object methods (public methods by default).
 
 --grep (-G)        Limit to items matching the given pattern (string or regex).
 
 --insensitive (-i) Case-insensitive search (requires --grep).
 
 --invert (-v)      Inverted search (requires --grep).
 
 --globals (-g)     Include global variables.
 
 --internal (-n)    Limit to internal functions and classes.
 
 --user (-u)        Limit to user-defined constants, functions and classes.
 
 --category (-C)    Limit to constants in a specific category (e.g. "date").
 
 --all (-a)         Include private and protected methods and properties.
 
 --long (-l)        List in long format: includes class names and method signatures.
 
 
 Help:
 
 List variables, constants, classes, interfaces, traits, functions, methods, and properties.
 
 Called without options, this will return a list of variables currently in scope.
 
 If a target object is provided, list properties, constants and methods of that target. If a class, interface or trait name is passed instead, list constants and methods on that class.
 
 e.g. 
 
 >>> ls
 >>> ls $foo
 >>> ls -k --grep mongo -i
 >>> ls -al ReflectionClass
 >>> ls --constants --category date
 >>> ls -l --functions --grep /^array_.*/
 >>>
登入後複製
登入後複製
在CLI

中調試 通過命令行界面執行上述代碼的執行方式將如下所示:

>

>我們如何與psysh互動? 只需添加psyshell :: debug(get_defined_vars());您要調試應用程序的代碼上的任何位置,通常在哪裡插入var_dump()語句:

>

<span>>>> $a = 'hello';
</span><span>=> "hello"
</span><span>>>></span>
登入後複製
登入後複製
保存文件後,我們將獲得以下輸出:>

>腳本的執行將被暫停,我們現在有PSYS的提示可以進行。我將get_defined_vars()作為參數傳遞給psyshell :: debug(),所以我可以訪問shell中的所有定義變量:
>>> function say($a) {
...     echo $a;
... }
=> null
>>> say('hello');
hello
=> null
>>>
登入後複製
登入後複製
>

讓我們檢查$ window變量:
php -a
Interactive shell

php > $a = 'Hello world!';
php > echo $a;
Hello world!
php >
登入後複製
登入後複製
登入後複製
登入後複製

在應用程序中將psys添加到一個很好的是,我們可以檢查實例化對象的源代碼。 >

composer g require psy/psysh:~0.1
psysh
登入後複製
登入後複製
登入後複製
so,$ window是SimpleWindow的一個實例,它實現了窗口界面……我想知道窗口界面的源代碼看起來像…

>

wget psysh.org/psysh
chmod +x psysh
./psysh
登入後複製
登入後複製
登入後複製
>為什麼簡單的窗口和裝飾窗口具有相同的輸出?讓我們檢查一下$ DecoratedWindow對象。

>

./psysh                                                                                                                                             

Psy Shell v0.1.11 (PHP 5.5.8 — cli) by Justin Hileman                                                                                                                                                                              
>>>
登入後複製
登入後複製
這個對像比簡單的窗口“重”,因此源代碼可能很長……讓我們僅查看render()方法的源代碼:

>

調用getWindowReference()方法,然後返回Render()方法的結果。 讓我們檢查getWindowReference()來源:
>>> help

  help      Show a list of commands. Type `help [foo]` for information about [foo].      Aliases: ?
  
  ls        List local, instance or class variables, methods and constants.              Aliases: list, dir
  
  dump      Dump an object or primitive.
  
  doc       Read the documentation for an object, class, constant, method or property.   Aliases: rtfm, man 
  
  show      Show the code for an object, class, constant, method or property.
  
  wtf       Show the backtrace of the most recent exception.                             Aliases: last-exception, wtf?
  
  trace     Show the current call stack.
  
  buffer    Show (or clear) the contents of the code input buffer.                       Aliases: buf
  
  clear     Clear the Psy Shell screen.
  
  history   Show the Psy Shell history.
  
  exit      End the current session and return to caller.                                Aliases: quit, q
登入後複製
登入後複製
>

此方法正在返回對象的WindowReference屬性,正如我們從上面的LS -AL命令看到的那樣,它是Acmepatternsdecoratorsimplewindow的實例。 當然,我們本來可以研究DecoratedWindow :: __ construct()的工作方式,但這是我們可以檢查的另一種方式。
>>> help ls

Usage:

ls [--vars] [-c|--constants] [-f|--functions] [-k|--classes] [-I|--interfaces] [-t|--traits] [-p|--properties] [-m|--methods] [-G|--grep="..."] [-i|--insensitive] [-v|--invert] [-g|--globals] [-n|--internal] [-u|--user] [-C|--
category="..."] [-a|--all] [-l|--long] [target]

Aliases: list, dir

Arguments:

 target             A target class or object to list.
 
 
Options:

 --vars             Display variables.
 
 --constants (-c)   Display defined constants.
 
 --functions (-f)   Display defined functions.
 
 --classes (-k)     Display declared classes.
 
 --interfaces (-I)  Display declared interfaces.
 
 --traits (-t)      Display declared traits.
 
 --properties (-p)  Display class or object properties (public properties by default).
 
 --methods (-m)     Display class or object methods (public methods by default).
 
 --grep (-G)        Limit to items matching the given pattern (string or regex).
 
 --insensitive (-i) Case-insensitive search (requires --grep).
 
 --invert (-v)      Inverted search (requires --grep).
 
 --globals (-g)     Include global variables.
 
 --internal (-n)    Limit to internal functions and classes.
 
 --user (-u)        Limit to user-defined constants, functions and classes.
 
 --category (-C)    Limit to constants in a specific category (e.g. "date").
 
 --all (-a)         Include private and protected methods and properties.
 
 --long (-l)        List in long format: includes class names and method signatures.
 
 
 Help:
 
 List variables, constants, classes, interfaces, traits, functions, methods, and properties.
 
 Called without options, this will return a list of variables currently in scope.
 
 If a target object is provided, list properties, constants and methods of that target. If a class, interface or trait name is passed instead, list constants and methods on that class.
 
 e.g. 
 
 >>> ls
 >>> ls $foo
 >>> ls -k --grep mongo -i
 >>> ls -al ReflectionClass
 >>> ls --constants --category date
 >>> ls -l --functions --grep /^array_.*/
 >>>
登入後複製
登入後複製
用嵌入式服務器調試

不幸的是,不支持通過像Apache這樣的Web服務器進行調試。但是,我們可以使用PHP的嵌入式服務器調試應用程序:

開發服務器現在正在聆聽端口8080上的連接,因此,一旦我們通過此Web服務器(https:// localhost:8080/decorator.php)請求Decorator.php文件,我們就應該看到以下內容:

我們可以像我們對Cli
<span>>>> $a = 'hello';
</span><span>=> "hello"
</span><span>>>></span>
登入後複製
登入後複製
>一樣開始玩PSYSH

進行單位測試調試
>>> function say($a) {
...     echo $a;
... }
=> null
>>> say('hello');
hello
=> null
>>>
登入後複製
登入後複製

作為一個好的開發人員,您應該為代碼編寫單元測試,以證明其正常工作。在項目的文件中,您會找到測試文件夾,如果安裝了PHPUNIT,則可以在其內部運行測試。

>
>>> class Foo
... {
...     protected $a;
...
...     public function setA($a) {
...         $this->a = $a;
...     }
...
...     public function getA() {
...         return $this->a;
...     }
... }
=> null
>>> $foo = new Foo();
=> <Foo #000000001dce50dd000000002dda326e> {}
>>> $foo->setA('hello');
=> null
>>> $foo->getA();
=> "hello"
>>>
登入後複製

即使代碼似乎完美地運行,測試也會失敗。我們可以通過僅運行失敗測試來進一步檢查:

>我們具有生成錯誤的測試,文件和行。 讓我們看一下標題為windowtest.php
>>> ls $foo
Class Methods: getA, setA
>>>
登入後複製

如果您不熟悉phpunit,請不要過分關注該代碼。 簡而言之,我正在設置所有內容,以測試標題window :: addtitle()方法,並期望收到一個非空價值。
>>> ls -la $foo
Class Properties:

  $a   "hello" 
  

Class Methods:

  getA   public function getA()
  setA   public function setA($a)
登入後複製

>那麼,我們如何使用psysh檢查發生了什麼?只需像以前一樣添加shell :: debug()方法。

>
{
    "name": "example/psysh",
    "authors": [
        {
            "name": "John Doe",
            "email": "john@doe.tst"
        }
    ],
    "require": {
        "psy/psysh": "~0.1"
    },
    "autoload": {
        "psr-4": {"Acme\": "src/"}
    }
}
登入後複製

我們準備好搖滾了!

>因此,在$ rs中,我們應該有一個字符串;讓我們看看我們真正擁有的。
<span><span><?php
</span></span><span><span>chdir(dirname(__DIR__));
</span></span><span>
</span><span><span>require_once('vendor/autoload.php');
</span></span><span>
</span><span><span>use Acme<span>\Patterns\Decorator\SimpleWindow</span>;
</span></span><span><span>use Acme<span>\Patterns\Decorator\DecoratedWindow</span>;
</span></span><span><span>use Acme<span>\Patterns\Decorator\TitledWindow</span>;
</span></span><span>
</span><span><span>echo PHP_EOL . 'Simple Window' . PHP_EOL;
</span></span><span>
</span><span><span>$window = new SimpleWindow();
</span></span><span>
</span><span><span>echo $window->render();
</span></span><span>
</span><span><span>echo PHP_EOL . 'Decorated Simple Window' . PHP_EOL;
</span></span><span>
</span><span><span>$decoratedWindow = new DecoratedWindow($window);
</span></span><span>
</span><span><span>echo $decoratedWindow->render();
</span></span><span>
</span><span><span>echo PHP_EOL . 'Titled Simple Window' . PHP_EOL;
</span></span><span>
</span><span><span>$titledWindow = new TitledWindow($window);
</span></span><span>
</span><span><span>echo $titledWindow->render();</span></span>
登入後複製

> null值,難怪測試失敗了……讓我們檢查標題Window :: AddTitle()的源代碼。 如果我們執行LS命令,我們可以看到我們可以通過$ titledwindow對象獲得該對象的方法。
php public/decorator.php 

Simple Window
+-------------+
|             |
|             |
|             |
|             |
|             |
+-------------+

Decorated Simple Window
+-------------+
|             |
|             |
|             |
|             |
|             |
+-------------+

Titled Simple Window
+-------------+
|Title        |
+-------------+
|             |
|             |
|             |
|             |
|             |
+-------------+
登入後複製
php -a
Interactive shell

php > $a = 'Hello world!';
php > echo $a;
Hello world!
php >
登入後複製
登入後複製
登入後複製
登入後複製

有錯誤。該方法是迴盪值而不是返回值。 即使該應用程序似乎可以正常工作,通過單元測試和PSYSH,我們發現了一個缺陷,現在我們可以修復它。

>

結論

本文並不是要詳盡地展示所有潛在的PSYS所具有的。 您應該嘗試其他一些很酷的功能(例如“ doc”)。 僅PSYS可能不是很有用,但是如果與其他工具和您的聰明調試功能相結合,則可以證明是寶貴的資產。

>常見問題(常見問題解答)關於與psysh

進行交互式PHP調試

什麼是psysh,它如何在PHP調試中起作用?它提供了一個交互式命令行接口,您可以在其中執行PHP代碼並立即查看輸出。 PSYS對於調試特別有用,因為它允許您逐步瀏覽代碼,檢查變量並進行交互式測試更改。這就像與您的代碼進行對話一樣,這可能會導致更好地理解和更快的錯誤分辨率。

>如何安裝PSYSH進行php調試?

psysh可以使用作曲家,A PHP的依賴關係管理工具。您可以通過運行Command Composer Global需要PSY/PSYS進行安裝。安裝後,您可以簡單地在終端中鍵入psysh來啟動PSYS。確保將全局作曲家二進製文件包括在您的路徑中,以便您的系統可以找到PSYSH可執行文件。

>我如何使用psysh調試我的php代碼?

,您可以插入psysh();在您的代碼中的任何時候,您都想開始交互式調試會話。當您的代碼執行達到這一點時,PSYS將打開一個交互式外殼,允許您檢查變量,執行代碼並逐步瀏覽您的代碼執行。

>

我可以使用psysh在PHP中進行單位測試?是的,PSYSH對於PHP中的單位測試非常有用。您可以使用PSYS在測試執行過程中的任何時刻進行交互調試,檢查變量和狀態。這對於理解為什麼測試失敗可能特別有用。

>

我如何自定義PSYSH配置?

psysh允許您通過在您的.psysh.php中創建.psysh.php文件來自定義其配置。主目錄。在此文件中,您可以設置配置選項,例如默認值包括,錯誤級別和命令歷史記錄大小。您還可以添加自定義命令或清潔劑。

>

psysh的一些高級功能是什麼?

psysh具有許多高級功能,可以幫助您更有效地調試PHP代碼。其中包括使用運行時執行代碼,自動分號插入,名稱空間支持,讀取線支持,異常處理等。 PSYS還支持變量,功能,類,甚至PHP內置關鍵字的選項卡完成。

psysh如何處理錯誤和異常?

psysh具有強大的錯誤和異常處理機制。當發生錯誤或異常時,PSYSH將顯示詳細的堆棧跟踪,幫助您確切地了解錯誤發生的位置和原因。您還可以在任何時候使用WTF命令來顯示最後一個異常堆棧跟踪。

>我可以將psysh與我喜歡的php框架一起使用嗎?

是的,PSYSH可以很好地與大多數PHP框架,大多數PHP框架,包括Laravel,Symfony和Zend框架。一些框架,例如Laravel,甚至包括PSYSH開箱即用。您可以通過報告錯誤,建議功能或提交拉力請求來為該項目做出貢獻。在貢獻之前,請確保閱讀該項目的貢獻指南。

>

>我在哪裡可以找到更多資源來了解PSYSH?

>

>官方PSYS網站及其GitHub存儲庫是找到資源的最佳場所關於psysh。它們包括詳細的文檔,用法示例和可用命令列表。您還可以在各種PHP和開發人員博客上找到教程和文章。

>

以上是互動php與psysh調試的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板