1 回答

TA貢獻2012條經驗 獲得超12個贊
如果同一個 composer 項目中的多個包需要同一個包,依賴將被解決并且包將只包含一次,并且文件在 keyfiles中composer.json:
{
"autoload": {
"files": ["src/MyLibrary/functions.php"]
}
}
無論如何都不會被多次包含在內。這不是真正的“自動加載”,因為在 PHP 中實際上沒有自動加載“功能”,只是這些文件將在每個需要主腳本的請求中“包含” autoload.php。
由于您提到了 Wordpress,在那個世界中事情會變得更加棘手,因為多個插件將是單獨的 Composer 項目,每個插件都有自己聲明的依賴項,這些依賴項將被并行加載。
如果多個插件聲明了自己的composer.json文件,并且它們使用相同的包,它們將嘗試加載相同文件的多個副本,并再次定義相同的類和函數。這可能會導致與類名和函數名的沖突。
即使自動加載器使用類似的東西include_once(它沒有),它也不會工作。因為每個插件都有自己的包副本,并且會包含不同的文件。
您可以采取一些基本的預防措施,例如將您的函數聲明包裝在if (!function_exists('my_function') { }. 就像是:
<?php
if (function_exists('foo')) {
return;
}
function foo() {
echo "foo";
}
以避免在嘗試定義已定義的函數時出現致命錯誤)。
這將避免嘗試兩次定義相同的函數,但如果多個插件依賴于同一包的不同且不兼容的版本,您也可能會遇到麻煩。
Wordpress 和 Composer 根本不是很好的伙伴,因為 Wordpess 很難適應現代方式來管理更廣泛的 PHP 生態系統中的依賴關系。
- 1 回答
- 0 關注
- 110 瀏覽
添加回答
舉報