我有一組包含類(實體)的PHP文件。每個類都有相同的命名空間:PHP - Doctrine - 如何自動加載實體類使用單個命名空間
// src/App/Entity/Actions.php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
/**
* Actions
*
* @ORM\Entity
*/
class Actions
{
// SOME CODE
我自動加載包含與作曲家類的PHP文件:
"autoload": { "psr-0": { "App": "src/" } }
而且在我的bootstrap.php文件,我加入這一行:
use App\Entity;
所以我想,因爲告訴應用程序使用App \ Entity命名空間,我可以像這樣調用實體類:$entity = new Actions();
但是當我嘗試,我得到這個錯誤:
Fatal error: Class 'Actions' not found in C:\wamp64\www\spider\chebi2\inc\orm_tools.php on line 49
如果我這樣做:
use App\Entity; use App\Repository;
if (class_exists('Actions')) { dump('exists'); } else { dump('not exists'); }
if (class_exists('\App\Entity\Actions')) { dump('exists'); } else { dump('not exists'); }
繼承人它所輸出:
PS C:\wamp64\www\spider\chebi2> php .\get_actions.php
"not exists"
"exists"
所以它只能找到當我提供完整的命名空間的時候。而古怪的是,當我嘗試這樣做:
// Direct path to the Actions.php file
use App\Entity\Actions;
if (class_exists('Actions')) { dump('exists'); }
else { dump('not exists'); }
if (class_exists('\App\Entity\Actions')) { dump('exists'); }
else { dump('not exists'); }
我得到了相同的結果:
PS C:\wamp64\www\spider\chebi2> php .\get_actions.php
"not exists"
"exists"
所以現在我更糊塗了。如果它實際上沒有使該名稱空間中的類直接可用,那麼使用什麼要點:use App\Entity;
?爲什麼分配直接路徑use App\Entity\Actions;
甚至不能正常工作?
我在這裏做錯了什麼?有沒有一種正確的方法來使用我不理解的命名空間?
看看'「/vendor/autoload.php」;' – Robert
的autoload.php文件本身只有兩個在它的線條,但我檢查了vendor/composer/autoload_psr4.php文件,它列出了** composer.json **文件中的所有軟件包,但沒有列出應該使用psr4自動加載器自動加載的任何文件。在** autoload_namespaces.php **中,它不會列出我添加的任何名稱空間。當我運行** composer diagnose **時,其中一行是這樣的:'屬性psr-4沒有被定義,並且定義不允許附加屬性' –
所以在讀完一些東西之後,似乎我誤解了'使用某些\命名空間'命令是做什麼的。我認爲'使用App \ Entity;'會將該名字空間中每個類的名稱加載到全局變量中,但實際上做的是創建爲名爲Entity的別名。所以相反,我需要像這樣調用類\ Entity \ Actions。我不明白它,因爲我通過作曲家安裝了很多不同的組件,我添加了'use path \ to \ namespace;',然後我可以直接調用這些類。 –