2016-08-11 40 views
1

我很難獲得psysh來實例化類。在psysh中實例化類的困難

我想使用PSR-4命名空間,並註冊了PSR-4自動加載在作曲是這樣的:

"autoload": { 
     "psr-4": { 
      "System\\": "phpclasses/" 
     } 
    }, 

有一個在phpclasses類\ test.php的,類名Test採用名爲hello()的靜態方法。

我打開命令shell,啓動psysh,psysh似乎正常工作。

如果我嘗試運行Test::hello();它會失敗,除非我把它稱爲這樣第一:echo System\Test::hello();

這實際上失敗,與消息:

PHP Fatal error: Class 'System\Test' not found in eval()'d code on line 1

但我可以成功運行:echo Test::hello();

echo System\Test::hello();絕不會工作

我試過使用System;和使用System\Test;沒有有益的影響。

我使用的每個類都必須經過這個例程,這是一種拖拽,因爲某些類使用靜態方法,並且每個類只有在每個類都經歷了失敗優先例程時才起作用。

基本上相同的技術必須用於靜態或非靜態方法。

我在Windows 10,xampp(php 5.6),作曲家(當前)安裝的命令外殼中運行psysh。

對於我在做什麼錯誤或需要改變的任何建議?

回答

2

這裏的麻煩是你沒有遵循PSR-4。使用您提供的配置,它期望在phpclasses文件夾內的System名稱空間中找到類。因此,例如,文件Test.php將具有類System\Test

要修復它,請將自動載入設置中的前綴更改爲"",或將namespace System;添加到您的Test.php文件中。如果你想明白爲什麼它的行爲是這樣的,你必須瞭解一下自動加載在PHP中的工作原理:

PHP允許你註冊一個自動加載器來查找尚未遇到的類。自動裝載機交給了一個班級名稱,並有機會找到它。通常他們通過以某種方式將類名映射到文件來工作。當他們被要求提供一個未知的類時,他們將類名轉換爲文件名,並嘗試要求該文件。

PSR-4是用於設置這種自動裝載機的標準,Composer免費提供符合PSR-4的自動裝載機。爲了正確工作,您必須佈置類似PSR-4所期望的類和名稱空間。如果你不這樣做,你可能遇到像你遇到的奇怪問題。

當您第一次嘗試呼叫Test::hello()時,該類未定義。您的PSR-4自動加載器將其轉換爲文件名,但是根據您的配置,無法爲無命名空間的類生存,因此無法找到要加載的文件,並且最終不加載任何文件。自動加載器有機會後,PHP仍然不知道該類,所以它拋出了一個錯誤。

當您嘗試呼叫System\Test::hello()時,您的PSR-4自動加載器在配置中查找它並將其轉換爲文件名(phpclasses/Test.php),該文件此次確實存在,因此它加載了該文件。然後PHP嘗試調用該方法,但它不知道該類,所以它拋出了一個錯誤。

第三次,它已經加載了你的文件並且發現了非命名空間的Test類。所以當你試着再次調用它時,它甚至不用自動加載器,只是執行你的方法。

+2

優秀的解釋。 感謝您花時間回答。 並感謝您編寫psysh! – Kurt