国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

擴(kuò)展內(nèi)部使用的 PHP 類別而不更改依賴項(xiàng)
P粉278379495
P粉278379495 2024-01-10 17:24:16
0
1
509

我想重寫 Laravel 中的 PHP 類,但它正在被其他幾個(gè)我不想打擾的類別擴(kuò)展??傮w結(jié)構(gòu)如下

class A extends R { }
class B extends R { }
class C extends R { }
class D extends R { }

其中 A/B/C/D/R 是外部套件中的所有類別。

我想將 A/B/C/D 擴(kuò)展到 P 而不更改任何這些檔案(這將成為維護(hù)負(fù)擔(dān)),這樣 P 類別擴(kuò)展了 R。因此,我可以對(duì) P 類別進(jìn)行新增。

我一直在研究class_alias(),它允許我連接到自動(dòng)載入器。這會(huì)正確載入類別 P。

我使用的程式碼是:

// Some bootstrap file:
class_alias(
    P::class,
    R::class
);
// My modification:
class P extends R
{
    // ...
}

但是我遇到了錯(cuò)誤:

ErrorException:無法宣告類別 R,因?yàn)槊Q已在使用中

我正在尋找一種解決方案,可以擴(kuò)展內(nèi)部 PHP 類,同時(shí)防止複製類的完整文件內(nèi)容。我什至不知道是否可以做到。我想要擴(kuò)充的類別不適合 Laravel 服務(wù)容器,因此沒有第一方方法來新增功能。

P粉278379495
P粉278379495

全部回覆(1)
P粉189606269

class_alias 本身還不夠,因?yàn)闉榱俗?P 擴(kuò)展 R,兩個(gè)類別都必須存在。而class_alias與自動(dòng)載入無關(guān),它只是宣告一個(gè)具有兩個(gè)名稱的類別。

您實(shí)際需要的是使用新名稱定義真正的類別 R,然後使用名稱 R 定義您自己的類別(您實(shí)際上不需要 class_alias)。

一種方法是動(dòng)態(tài)重寫目標(biāo)類別的原始程式碼,然後載入修改後的副本,如下所示(未經(jīng)測(cè)試):

$code = file_get_contents(__DIR__ . '/vendor/path/to/R.php');
$code = str_replace('class R', 'class R_original', $code);
eval($code);

class R extends R_original {
   // Your code here
}

重要的是,這需要在普通自動(dòng)載入器嘗試定義類別之前運(yùn)行。例如,您可以使用 spl_autoload_register,其中 $prepend 選項(xiàng)設(shè)定為 true

最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板