首頁  >  問答  >  主體

擴展內部使用的 PHP 類別而不更改依賴項

我想重寫 Laravel 中的 PHP 類,但它正在被其他幾個我不想打擾的類別擴展。總體結構如下

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 擴展到 P 而不更改任何這些檔案(這將成為維護負擔),這樣 P 類別擴展了 R。因此,我可以對 P 類別進行新增。

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

我使用的程式碼是:

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

但是我遇到了錯誤:

ErrorException:無法宣告類別 R,因為名稱已在使用中

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

P粉278379495P粉278379495306 天前332

全部回覆(1)我來回復

  • P粉189606269

    P粉1896062692024-01-11 00:08:07

    class_alias 本身還不夠,因為為了讓 P 擴展 R,兩個類別都必須存在。而class_alias與自動載入無關,它只是宣告一個具有兩個名稱的類別。

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

    一種方法是動態重寫目標類別的原始程式碼,然後載入修改後的副本,如下所示(未經測試):

    $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
    }

    重要的是,這需要在普通自動載入器嘗試定義類別之前運行。例如,您可以使用 spl_autoload_register,其中 $prepend 選項設定為 true

    回覆
    0
  • 取消回覆