調試別人的PHP代碼,我想選擇性地覆蓋他們的一個類。該課程包括:阻止PHP require_once從未運行
require_once('classname.php');
但是,這出現在應用程序的各個位置。我寧願'模擬'require_once
,以便它永遠不會運行。即只要定義我想要的class classname
即可。然後,下一次該文件是require_once
'ed,它會被標記爲已經加載,因此不會重新加載。
我可以創建一個我自己的classname.php文件,但我寧願將我正在做的測試包含到單個文件中,因爲我正在爲許多類執行此操作,而且我希望更容易控制壓倒一切。
在Perl中,什麼我想要做的是:
$INC{'classname.pm'} = 1;
是否有訪問PHP的等價Perl的%INC
的一種方式?
更新:由什麼PHP不會讓你感到驚訝一貫...
我的解決方法是使用runkit的runkit_method_redefine
。我打開我試圖阻止加載的類,然後重新定義一切,我想「模仿」的方法,例如:
require_once('classname.php');
runkit_method_redefine('classname','method','$params','return "testdata";');
如果您希望包含newclass.php而不是classname.php,爲什麼不在classname.php的頂部添加兩行?:'require_once'newclass.php'; return;' – 2010-07-06 17:54:52
因爲我爲許多類做了這個,所以我不想改變原來的類文件。而且因爲我想要更好的控制,我寧願有一個非基於文件的解決方案。 (也就是說,我可能會決定添加一個/ tmp目錄到include_path並只創建我想覆蓋的類文件。) – benizi 2010-07-06 18:58:50
Benizi別擔心我知道你的意思,它是一個最重要的問題。我無法在PHP中找到任何東西,這是一種有限的語言。我仍然不知道perl是如何受歡迎的。我想人們都懶得學習。 – ekerner 2014-03-30 14:48:34