有東西在你的情況下,會錯了一堆。我會盡力糾正它。
首先我看看你所需要的圖書館。它在Github上公開,它有一個composer.json
文件有錯誤。
{
"name": "sendwithus/api",
"version": "1.0.3",
"require": {},
"repositories": [
{
"type": "vcs",
"url": "https://github.com/sendwithus/sendwithus_php"
}
]
}
這些信息有些不對。只有名稱格式正確。
- 不應該有一個版本。通過在git中標記代碼來檢測版本。
- 如果不需要,該鍵可以省略。
- 當前存儲庫URL不應包含在它自己的存儲庫中。
- 提到許可證會很好 - 目前每個使用這個庫的人都應該害怕侵犯版權。
- 重要但缺失的信息:如何配置自動加載?
調查該資料庫的內容很快發現,它不符合PSR-0,所以唯一可行的是可選擇性自動加載類映射 - 因爲只有兩個在lib
夾中的文件是足以。
正確的自動加載的定義是:如何構建這個
"autoload": {
"classmap": ["lib"]
}
詳細信息可在http://getcomposer.org/doc/04-schema.md#classmap實際上,對於類映射鍵的值相對於應該建立索引庫根目錄的目錄列表。
測試文件夾不需要在這裏提及。使用PHPUnit,該文件夾將被掃描以查找包含測試類的任何文件。測試引導程序應包含由Composer生成的vendor/autoload.php
文件。
我不知道OP是否負責此存儲庫或可以更改它。上面的信息應該在存儲庫本身中實現,但如果不能,它也會有幫助,因爲它也可以進入「包」定義。
所以現在我們要看看OP的提到composer.json
:
{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/sendwithus_php",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
}
}
}
},
"require": {
"sendwithus/sendwithus_php": ">=1.0.3"
}, "autoload": {
"psr-0": {
"Foo\\": "src/",
"sendwithus\\": "vendor/sendwithus/sendwithus_php/lib"
}
},
"minimum-stability" : "dev"
}
的「倉庫」鍵可以包含的類型爲「包」包含一個項目的所有必要的信息對象沒有這樣做,或者沒有做到正確。正如我提到的,自動加載在原始定義斷裂,所以它必須固定在這裏:
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/api",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
},
"autoload": {
"classmap": ["lib"]
}
}
}
這將正確地引用庫,並啓用自動加載。請注意,名稱已在此處更改爲原始名稱 - 如果此庫在兩個不同的名稱下(一個在此定義,另一個在原始存儲庫中)知道,但使用相同的名稱空間和類名稱,可能會觸發故障。
既然存儲庫信息是固定的,那麼其他所有的東西在composer.json中都可以正常工作。
"require": {
"sendwithus/api": "1.0.3"
},
"autoload": {
"psr-0": {
"Foo\\": "src/"
}
},
"minimum-stability" : "dev"
請注意,此處定義的自動加載僅適用於此庫或應用程序。不要在這裏包含依賴關係的自動加載!
然後,我們照顧你的代碼:
use sendwithus\sendwithus_php\lib\API;
require_once 'vendor/autoload.php';
$api = new API('KEY');
的命名空間是錯誤的。不要使用Composer中的名稱。使用您正在導入的代碼中的名稱。這是正確的:
require_once __DIR__ . "../vendor/autoload.php";
use sendwithus\API;
$api = new API("apikey");
請注意,你不能在作曲重命名更改庫的命名空間。 Composer只會爲您下載PHP源文件,它不會更改文件內的代碼。
我最後composer.json
文件是這樣的:
{
"repositories": {
"sendwithus_php": {
"type": "package",
"package": {
"name": "sendwithus/api",
"version": "1.0.3",
"source": {
"url": "https://github.com/sendwithus/sendwithus_php",
"type": "git",
"reference": "0dfed56"
},
"autoload": {
"classmap": ["lib"]
}
}
}
},
"require": {
"sendwithus/api": "1.0.3",
},
"autoload": {
"psr-0": {
"Foo\\": "src/"
}
},
"minimum-stability": "dev"
}
的API類在命名空間'sendwithus'。你的自動加載的東西應該照顧找到文件;不要試圖將名稱空間位置放置在角落。 – cHao
是的,但你能舉個例子嗎? –
'使用sendwithus \ API;' – cHao