簡體   English   中英

從php類中按名稱刪除方法(不在運行時)

[英]Remove method by name from php class (not in runtime)

情況

  1. 我有一個包含2-3個類的文件。 每個類可能包含也可能不包含析構函數__destruct()
  2. 我正在使用composer檢索這些類,並且對其沒有真正的控制權,我也不能選擇性地說出“繼續前進並忽略析構函數調用所在的X〜Z行”,因為這些行可能會稍有變化。
  3. 我需要擺脫所有析構函數-或至少阻止它們在對象破壞時執行,因為我無法控制跳轉到無窮無盡的析構循環的代碼的其他部分。

我嘗試過並考慮過的方法:

正則表達式

我最初的想法是編寫一個regex ,它將與所有這些功能匹配並刪除它們(盡力而為的regex,我敢肯定會出現一些不適用於regex的極端情況),但是最終,在記住了有關使用regexes的各種問題之后我不恰當地重新考慮了-更不用說事實了,提出正則表達式工作對我來說也是一個問題。

用於C中嵌套范圍的彎括號塊

我在C中有一些背景,所以我想我可以將所有行與function __destruct()匹配,驗證同一行上沒有{並注釋掉定義,所以我會得到這樣的東西:

# function __destruct()
{
echo "initiating destructor function";
$this->callToSomething();
}

我以為不會執行(或者至少-不會在對象銷毀時執行,這就是為什么我需要對此進行注釋)的原因。 但是PHP不允許這種語法,我不能這樣做。 也許它允許實現相同結果的其他語法?

解析,反思? ...?

我並不是真的想為這個任務編寫自己的PHP解析器,但是如果那樣做,我會做的。 但是,由於PHP中已經有一個反射類,也許有一種方法可以將類加載到內存中,在運行時刪除析構函數,然后在磁盤上覆蓋類定義?

我不明白為什么您不能在這里使用正則表達式。 當然,您需要一個更高級的模式。 但是永遠不要強迫您觸摸它。

這是找到__destruct()塊的模式:

function\s+__destruct\s*\(\s*\)\s*({(?>[^{}\\]++|\\.|(?1))*+})

演示版

您需要做的就是加載有問題的文件,然后運行

$re = '/function\s+__destruct\s*\(\s*\)\s*({(?>[^{}\\\\]++|\\\\.|(?1))*+})/s';
$result = preg_replace($re, '', $str);

並將文件保存回磁盤。 C'estça。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM