1 回答

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