亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Composer autoload - 文件選項和 packagist

Composer autoload - 文件選項和 packagist

PHP
開滿天機 2023-03-04 18:09:00
我已經開發了幾個作曲家模塊,并已成功發布給 packagist。所有這些都是完全基于類的,我知道自動加載過程是如何工作的——如果多個項目使用我的 packagist 模塊,它們只會被包含一次。它對文件也一樣嗎?我想為“缺失的”WordPress 功能開發一個 packagist 模塊——即我在所有項目中經常使用的功能。如果多個項目包含該 packagist 模塊,我會收到有關同一名稱空間中同一函數的多個定義的錯誤嗎?澄清。我正在創建一個作曲家模塊 sgi/wp-utils。它不會有課。它只會包含文件。像這樣{    "autoload": {        "files": [            "src/Assets/functions.php",            "src/Posts/functions.php"         ]    }}它將用于定義我計劃在許多項目(插件、主題)中使用的實用程序功能。如果多個插件/主題使用同一個包,作曲家每次 WP 安裝只加載一次文件,還是我需要用調用包裝函數function_exists()?
查看完整描述

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 生態系統中的依賴關系。


查看完整回答
反對 回復 2023-03-04
  • 1 回答
  • 0 關注
  • 110 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號